高通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的更多相关文章

  1. 高通ASOC中的codec驱动

    ASOC的出现是为了让codec独立于CPU,减少和CPU之间的耦合,这样同一个codec驱动就无需修改就可以匹配任何一款平台. 在Machine中已经知道,snd_soc_dai_link结构就指明 ...

  2. 高并发分布式系统中生成全局唯一(订单号)Id js返回上一页并刷新、返回上一页、自动刷新页面 父页面操作嵌套iframe子页面的HTML标签元素 .net判断System.Data.DataRow中是否包含某列 .Net使用system.Security.Cryptography.RNGCryptoServiceProvider类与System.Random类生成随机数

    高并发分布式系统中生成全局唯一(订单号)Id   1.GUID数据因毫无规律可言造成索引效率低下,影响了系统的性能,那么通过组合的方式,保留GUID的10个字节,用另6个字节表示GUID生成的时间(D ...

  3. 高通ASOC中的machine驱动

    ASoC被分为Machine.Platform和Codec三大部分,其中的Machine驱动负责Platform和Codec之间的耦合以及部分和设备或板子特定的代码,再次引用上一节的内容:Machin ...

  4. 高通Audio中ASOC的machine驱动(一)

    ASoC被分为Machine.Platform和Codec三大部分,其中的Machine驱动负责Platform和Codec之间的耦合以及部分和设备或板子特定的代码,再次引用上一节的内容:Machin ...

  5. 高并发分布式系统中生成全局唯一(订单号)Id

    1.GUID数据因毫无规律可言造成索引效率低下,影响了系统的性能,那么通过组合的方式,保留GUID的10个字节,用另6个字节表示GUID生成的时间(DateTime),这样我们将时间信息与GUID组合 ...

  6. 高通、猎户机型Android典型bootloader分析

    1.bootloader是什么? 简单地说,bootloader 就是在操作系统内核运行之前运行的一段小程序.通过这段小程序,我们可以初始化硬件设备.建立内存空间的映射图,从而将系统的软硬件环境带到一 ...

  7. 【转】高通平台android 环境配置编译及开发经验总结

    原文网址:http://blog.csdn.net/dongwuming/article/details/12784535 1.高通平台android开发总结 1.1 搭建高通平台环境开发环境 在高通 ...

  8. 高通MSM8998 ABL的调试

    高通在MSM8998上引入了UEFI,用来代替LK(Little Kernel).高通UEFI由XBL和ABL两部分组成.XBL负责芯片驱动及充电等核心应用功能.ABL包括芯片无关的应用如fastbo ...

  9. FTC诉高通垄断案苹果从中受益

    据外媒报道,美国当地时间周二,美国联邦贸易委员会(FTC)诉芯片制造商高通公司(Qualcomm)垄断案进入了终结辩论阶段.这意味着,这起审判也进入最后阶段,它可能颠覆高通在智能手机时代取得成功的至关 ...

  10. 高通android开发摘要

    一部分是开源的,可以从codeaurora.org上下载,还有一部分是高通产权的,需要从高通的网站上下载. 将高通产权的代码放到:vendor/qcom/proprietary 1. 设置bms一些参 ...

随机推荐

  1. 国外anonfiles网盘大文件下载器

    各位注意了,这个网站很久以前是可以国内直接访问的,后来被墙了,但仍然可以使用代理下载,现如今,6天前大概2023年8月10号左右这个网站已经挂了,就是彻底不能用了,所有与之有关的东西比如网页,都是假的 ...

  2. LVS负载均衡(6)--LVS调度算法详解

    目录 1. LVS调度算法详解 1.1 静态调度算法 1.1.1 RR调度算法 1.1.2 WRR调度算法 1.1.3 SH调度算法 1.1.4 DH调度算法 1.2 动态调度算法 1.2.1 LC调 ...

  3. cesium介绍和国内主要学习网站汇总

    Cesium官方网站 建议大家将Cesium官网的博客都读一遍,博客大概分为三类,主要是技术类,比如性能优化,调度算法等,一类是定期的新版本特性,能够了解Cesium新功能和新特性,还有一类是大事记, ...

  4. windows下安装Psycopg2,用于python连接postgresql

    1.首先,下载Windows版的Psycopg2.进入https://pypi.python.org/pypi/psycopg2/ ,在下载文件列表中选择psycopg2-2.7.4-cp33-cp3 ...

  5. Teamviewer 再次涨价,太贵了,有没有平替软件?

    今天打开 Teamviewer 网站,吓一跳,商业版基础款价格直接翻倍. 作为行业龙头,又是德国产品,Teamviewer 一直保持着高价格的特色.这两年 Teamviewer 的价格还逐年上涨,从每 ...

  6. 计算机组成原理—中央处理器CPU

    文章目录 CPU的功能与架构 CPU的组成 运算器 控制器 指令执行过程 指令流程 指令执行方案 数据通路 单总线结构 专用通路结构 硬布线控制器设计 硬布线执行流程 硬布线CU内部 怎么设计微操作的 ...

  7. C 语言编程 — GDB 调试工具

    目录 文章目录 目录 前文列表 代码调试 GDB 启动 GDB 交互命令 运行程序 暂停程序 设置断点 设置观察点 设置捕捉点 打印信息 查询运行信息 分割窗口 前文列表 <程序编译流程与 GC ...

  8. c++ 友元类 友元类方法

    一.友元类 #pragma once #include"Tv.h" class Remote { public: void chanDown(Tv& tv); }; #pr ...

  9. 【C#】使用WebHttpRequest调用Restful带token接口500 返回401 未授权错误

    测试对方的接口,发现单个调用对方接口是可以的,但是多个连续的调用对方接口时,会出现第一条调用一般是200,随后的调用就会报500,401未授权的错误,除了第一条后面的请求数据几乎都不得行. 我于是用f ...

  10. win10 使用idea 构建一个ssm的模板maven项目

    一.创建一个maven项目   1.1建立一个module作为web项目   File->New->project 选择maven,默认jdk,下面的列表什么都不选,next->输入 ...