高通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一些参 ...
随机推荐
- rubymineIDE配置启动
debug启动 debug启动 安装插件 报错: 网络问题 下载 ruby-debug-ide-2.3.1 解压到 /home/haima/.rvm/gems/ruby-2.3.8/gems/
- 纯JavaScript制作动态增加的网页数字
看到别的网页上打开,会显示一个动态的数字,感觉这个效果增加了网页的灵动感.就尝试着写代码,最终实现的方法: 会从0增加到一个数值,实现的代码: <!-- html 部分 --> <d ...
- C#/.NET/.NET Core优秀项目和框架2024年4月简报
前言 公众号每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架(每周至少会推荐两个优秀的项目和框架当然节假日除外),公众号推文中有项目和框架的介绍.功能特点.使用方式以及部分功能截图 ...
- Nginx 常用的基础配置(web前端相关方面)
文章出处:https://juejin.cn/post/7196859948554715195 基础配置 user root; worker_processes 1; events { worker_ ...
- 【题解】A566.三点共线
题目大意,给定在平面直角坐标系中的多个点,判断有多少个三元组 \((A, B, C)\) 满足共线性质. 题目链接:A566.三点共线. 大题思路就是暴力所有的三元组,判断三个元素的斜率是否相同即可. ...
- 部署springboot+vue项目文档(若依ruoyi项目部署步骤)
摘自:https://blog.csdn.net/Dreamboy_w/article/details/104389797 部署springboot+vue项目文档(若依ruoyi项目部署步骤)一:部 ...
- 【c#】JavaScriptSerializer 不序列化null值
首先引用dll :System.Web.Extensions. 再自定义转换器代码如下: public class JavaScriptSerilizeConvert : JavaScriptConv ...
- 记录一次HTTPS无法访问的错误
Https无法连接Nginx,日志报错 *2179 SSL_do_handshake() failed (SSL: error:1420918C:SSL routines:tls_early_post ...
- 基于pulp的线性优化问题:微电网日前优化调度(复现)
摘录来源:(71条消息) 微电网日前优化调度入门:求解一道数学建模题_我不是玉的博客-CSDN博客 学习记录与复现 问题描述 问题出自第十届"中国电机工程学会杯"全国大学生电工数学 ...
- Understanding Swift’s value type thread safety - 代码分析(二)
示范代码 ` func testScenarioA2() throws { var store: Int = 100 DispatchQueue.concurrentPerform(iteration ...