高通UEFI中的I2C的方式读取TP的id
高通UEFI中的I2C的方式读取TP的id
原文:https://blog.csdn.net/mengluoxixiang/article/details/100103347
老规矩,先说要实现的功能:用I2C的方式读取TP的ID,然后通过TP的ID不同来做LCD兼容。
文件路径:BOOT.XF.1.4/boot_images/QcomPkg/Sdm660Pkg/Library/MDPPlatformLib/MDPPlatformLib.c
1、定义要用到的pin脚
#define CDP_TP_INT_GPIO 67 //TP中断pin脚
#define CDP_TP_RES_GPIO 66 //TP重置pin脚
#define CDP_TP_I2C_SDA_GPIO 14 //i2c数据读写pin脚
#define CDP_TP_I2C_CLK_GPIO 15 //i2c时钟控制pin脚
2、引入相关头文件,定义全局变量
/* I2C Interfaces */
#include <Protocol/EFII2C.h>
static i2c_config cfg;
static void *pI2cHandle = NULL;
3、i2c的init函数
i2c_status i2c_init(UINT32 SlaveAddr, UINT32 I2cFreq)
{
i2c_status i2cstatus = I2C_SUCCESS;
cfg.bus_frequency_khz = I2cFreq;
cfg.slave_address = SlaveAddr;
cfg.slave_address_type = I2C_07_BIT_SLAVE_ADDRESS;
MDP_Status Status = MDP_STATUS_OK;
EFI_TLMM_PROTOCOL *TLMMProtocol = NULL;
if (EFI_SUCCESS != gBS->LocateProtocol(&gEfiTLMMProtocolGuid, NULL, (void **)&TLMMProtocol))
{
DEBUG((EFI_D_ERROR, "DisplayDxe: Locate TLMM protocol failed!\n"));
Status = MDP_STATUS_NO_RESOURCES;
}
else
{
/* Setup tp i2c sda Pin */
if (EFI_SUCCESS != TLMMProtocol->ConfigGpio((UINT32)EFI_GPIO_CFG(CDP_TP_I2C_SDA_GPIO, 2, GPIO_OUTPUT, GPIO_PULL_DOWN, GPIO_2MA), TLMM_GPIO_ENABLE))
{
DEBUG((EFI_D_WARN, "DisplayDxe: Configure GPIO %d for Reset_N line Failed!\n", CDP_TP_I2C_SDA_GPIO));
}
/* Setup tp i2c clk Pin */
if (EFI_SUCCESS != TLMMProtocol->ConfigGpio((UINT32)EFI_GPIO_CFG(CDP_TP_I2C_CLK_GPIO, 2, GPIO_OUTPUT, GPIO_PULL_DOWN, GPIO_2MA), TLMM_GPIO_ENABLE))
{
DEBUG((EFI_D_WARN, "DisplayDxe: Configure GPIO %d for Reset_N line Failed!\n", CDP_TP_I2C_CLK_GPIO));
}
/* Setup tp int Pin */
if (EFI_SUCCESS != TLMMProtocol->ConfigGpio((UINT32)EFI_GPIO_CFG(CDP_TP_INT_GPIO, 0, GPIO_OUTPUT, GPIO_PULL_UP, GPIO_2MA), TLMM_GPIO_ENABLE))
{
DEBUG((EFI_D_WARN, "DisplayDxe: Configure GPIO %d for Reset_N line Failed!\n", CDP_TP_INT_GPIO));
}
/* Setup tp reset Pin */
if (EFI_SUCCESS != TLMMProtocol->ConfigGpio((UINT32)EFI_GPIO_CFG(CDP_TP_RES_GPIO, 0, GPIO_OUTPUT, GPIO_PULL_UP, GPIO_2MA), TLMM_GPIO_ENABLE))
{
DEBUG((EFI_D_WARN, "DisplayDxe: Configure GPIO %d for Reset_N line Failed!\n", CDP_TP_RES_GPIO));
}
/* Set tp int line HIGH */
if (EFI_SUCCESS != TLMMProtocol->GpioOut((UINT32)EFI_GPIO_CFG(CDP_TP_INT_GPIO, 0, GPIO_OUTPUT, GPIO_NO_PULL, GPIO_2MA), GPIO_HIGH_VALUE))
{
DEBUG((EFI_D_WARN, "DisplayDxe: Reset_N line HIGH failed!\n"));
}
MDP_OSAL_DELAYUS(150);
/* Set tp reset line HIGH */
if (EFI_SUCCESS != TLMMProtocol->GpioOut((UINT32)EFI_GPIO_CFG(CDP_TP_RES_GPIO, 0, GPIO_OUTPUT, GPIO_NO_PULL, GPIO_2MA), GPIO_HIGH_VALUE))
{
DEBUG((EFI_D_WARN, "DisplayDxe: Reset_N line HIGH failed!\n"));
}
MDP_OSAL_DELAYMS(8);
/* Set tp int line LOW */
if (EFI_SUCCESS != TLMMProtocol->GpioOut((UINT32)EFI_GPIO_CFG(CDP_TP_INT_GPIO, 0, GPIO_OUTPUT, GPIO_NO_PULL, GPIO_2MA), GPIO_LOW_VALUE))
{
DEBUG((EFI_D_WARN, "DisplayDxe: Reset_N line HIGH failed!\n"));
}
MDP_OSAL_DELAYMS(60);
}
i2cstatus = i2c_open((i2c_instance) (I2C_INSTANCE_004), &pI2cHandle);
if (I2C_SUCCESS != i2cstatus)
{
DEBUG((EFI_D_ERROR, "Failed to initialize I2C %d\n", i2cstatus));
}
return i2cstatus;
}
4、i2c读取数据
unsigned int i2c_read_reg(unsigned int addr)
{
uint32 bRead = 0;
unsigned int getdata = 0;
i2c_status i2cstatus = I2C_SUCCESS;
unsigned char rdbuf[2] = {0};
gBS->Stall(600000);
i2cstatus = i2c_read (pI2cHandle, &cfg, addr, 2, rdbuf, 1, &bRead, 2500);
if(I2C_SUCCESS != i2cstatus)
{
DEBUG((EFI_D_ERROR, "Read addr:0x%X error\n", addr));
}
gBS->Stall(600000);
getdata=rdbuf[0] & 0x00ff;
getdata<<= 8;
getdata |=rdbuf[1];
DEBUG((EFI_D_ERROR, "[dong]rdbuf[0] & 0x00ff is %d\n\n", rdbuf[0] & 0x00ff));
return (rdbuf[0] & 0x00ff);//getdata;//
}
5、i2c写数据
unsigned int i2c_write_reg(unsigned char addr, unsigned int reg_data)
{
uint32 bWrote = 0;
i2c_status i2cstatus = I2C_SUCCESS;
unsigned char wdbuf[2] = {0};
wdbuf[1] = (unsigned char)(reg_data & 0x00ff);
wdbuf[0] = (unsigned char)((reg_data & 0xff00)>>8);
i2cstatus = i2c_write (pI2cHandle, &cfg, addr, 1, wdbuf, 2, &bWrote, 2500);
if(I2C_SUCCESS != i2cstatus)
{
DEBUG((EFI_D_ERROR, "Write addr:0x%X data:0x%X error\n", addr, reg_data));
}
return bWrote;
}
6、i2c关闭
i2c_status i2c_deinit()
{
return i2c_close(pI2cHandle);
}
7、i2c读tp的id
unsigned int i2c_read_tp_sensor(void)
{
unsigned int tp_sensor_id = 0;
i2c_init(0x14, 400000);//i2c从机地址、读写速率
tp_sensor_id = i2c_read_reg(0x814a);//tp中存id的寄存器地址
i2c_deinit();
return tp_sensor_id;
}
高通UEFI中的I2C的方式读取TP的id的更多相关文章
- 高通ASOC中的codec驱动
ASOC的出现是为了让codec独立于CPU,减少和CPU之间的耦合,这样同一个codec驱动就无需修改就可以匹配任何一款平台. 在Machine中已经知道,snd_soc_dai_link结构就指明 ...
- 高并发分布式系统中生成全局唯一(订单号)Id js返回上一页并刷新、返回上一页、自动刷新页面 父页面操作嵌套iframe子页面的HTML标签元素 .net判断System.Data.DataRow中是否包含某列 .Net使用system.Security.Cryptography.RNGCryptoServiceProvider类与System.Random类生成随机数
高并发分布式系统中生成全局唯一(订单号)Id 1.GUID数据因毫无规律可言造成索引效率低下,影响了系统的性能,那么通过组合的方式,保留GUID的10个字节,用另6个字节表示GUID生成的时间(D ...
- 高通ASOC中的machine驱动
ASoC被分为Machine.Platform和Codec三大部分,其中的Machine驱动负责Platform和Codec之间的耦合以及部分和设备或板子特定的代码,再次引用上一节的内容:Machin ...
- 高通Audio中ASOC的machine驱动(一)
ASoC被分为Machine.Platform和Codec三大部分,其中的Machine驱动负责Platform和Codec之间的耦合以及部分和设备或板子特定的代码,再次引用上一节的内容:Machin ...
- 高并发分布式系统中生成全局唯一(订单号)Id
1.GUID数据因毫无规律可言造成索引效率低下,影响了系统的性能,那么通过组合的方式,保留GUID的10个字节,用另6个字节表示GUID生成的时间(DateTime),这样我们将时间信息与GUID组合 ...
- 高通、猎户机型Android典型bootloader分析
1.bootloader是什么? 简单地说,bootloader 就是在操作系统内核运行之前运行的一段小程序.通过这段小程序,我们可以初始化硬件设备.建立内存空间的映射图,从而将系统的软硬件环境带到一 ...
- 【转】高通平台android 环境配置编译及开发经验总结
原文网址:http://blog.csdn.net/dongwuming/article/details/12784535 1.高通平台android开发总结 1.1 搭建高通平台环境开发环境 在高通 ...
- 高通MSM8998 ABL的调试
高通在MSM8998上引入了UEFI,用来代替LK(Little Kernel).高通UEFI由XBL和ABL两部分组成.XBL负责芯片驱动及充电等核心应用功能.ABL包括芯片无关的应用如fastbo ...
- FTC诉高通垄断案苹果从中受益
据外媒报道,美国当地时间周二,美国联邦贸易委员会(FTC)诉芯片制造商高通公司(Qualcomm)垄断案进入了终结辩论阶段.这意味着,这起审判也进入最后阶段,它可能颠覆高通在智能手机时代取得成功的至关 ...
- 高通android开发摘要
一部分是开源的,可以从codeaurora.org上下载,还有一部分是高通产权的,需要从高通的网站上下载. 将高通产权的代码放到:vendor/qcom/proprietary 1. 设置bms一些参 ...
随机推荐
- clickhouse数据操常见执行语句
1.清空本地表数据 truncate table 数据库名.表名 :) select * from test_local; SELECT * FROM test_local Query id: ab1 ...
- 利用引用传递一次遍历构造菜单树(附java&go demo)
目录 原理讲解 java demo Go demo 优点 原理讲解 利用引用传递,当儿子的儿子变动的时候,自己的儿子的儿子也变动(取地址) java demo package com.huiyuan. ...
- 第3讲-Cadence分裂元件的制作方法
笔记3-Cadence分裂元件的制作方法 1.Homogeneous和heterogeneous的区别: 2.创建homogeneous类型元件: 3.创建heterogeneous类型元件. 把元件 ...
- 一:大数据架构回顾-Lambda架构
"我们正在从IT时代走向DT时代(数据时代).IT和DT之间,不仅仅是技术的变革,更是思想意识的变革,IT主要是为自我服务,用来更好地自我控制和管理,DT则是激活生产力,让别人活得比你好&q ...
- 【YoloDeployCsharp】基于.NET Framework的YOLO深度学习模型部署测试平台
1. 项目介绍 基于.NET Framework 4.8 开发的深度学习模型部署测试平台,提供了YOLO框架的主流系列模型,包括YOLOv8~v9,以及其系列下的Det.Seg.Pose.Obb ...
- 08 ES基本的聚合查询
目录 按protocol聚合 指定地区,按port聚合 指定地区和时间段,按ip聚合(独立ip 即ip去重) 并且 聚合再求独立ip数 聚合后将聚合结果进行分页的解决办法 子聚合 按protocol聚 ...
- 🔥httpsok-v1.8.1 一分钟搞定SSL证书自动续期
httpsok-v1.8.1 一分钟搞定SSL证书自动续期 简介 一行命令,一分钟轻松搞定SSL证书自动续期 httpsok 是一个便捷的 HTTPS 证书自动续签工具,专为 Nginx 服务器设计. ...
- three.js教程7-PBR材质与环境贴图CubeTextureLoader
1.PBR材质 PBR是基于物理的渲染(physically-based rendering).模拟物体表面的反射算法. Three.js提供了两个PBR材质相关的类MeshStandardMater ...
- PageOffice 6 给SaveFilePage指向的保存地址传参
PageOffice给保存方法传递参数的方式有两种: 通过设置保存地址的url中的?传递参数.例如: poCtrl.setSaveFilePage("/save?p1=1") 通过 ...
- 记录freeswitch的一个2833问题
概述 freeswitch是一款简单好用的VOIP开源软交换平台. 运营商内部新老系统混用,互联互通的问题较多,其中以DTMF码的问题最多,花样也多. 环境 CentOS 7.9 freeswitch ...