高通lk:配置与使用i2c

以msm8909为例。

背景

在lk中要去驱动一个aw9523的ic来控制指示灯。

但是现在对应的i2c没有打开。因此需要进行处理。

步骤

找到I2C对应的ID与句柄

参考文档:80-nu767-1_l_bam_low-speed_peripherals_(blsp)_user_guide.pdf

根据其他人的说法,i2c-1对应的是第一个BLSP1、QUP0、0x78B5000。

添加有关的时钟

路径:bootable/bootloader/lk/platform/msm8909/msm8909-clock.c

+
+// i2c-1
+static struct clk_freq_tbl ftbl_gcc_blsp1_qup1_i2c_apps_clk_src[] =
+{
+ F( 96000, cxo, 10, 1, 2),
+ F( 4800000, cxo, 4, 0, 0),
+ F( 9600000, cxo, 2, 0, 0),
+ F( 16000000, gpll0, 10, 1, 5),
+ F( 19200000, cxo, 1, 0, 0),
+ F( 25000000, gpll0, 16, 1, 2),
+ F( 50000000, gpll0, 16, 0, 0),
+ F_END
+};
+
+static struct rcg_clk gcc_blsp1_qup1_i2c_apps_clk_src =
+{
+ .cmd_reg = (uint32_t *) GCC_BLSP1_QUP1_CMD_RCGR,
+ .cfg_reg = (uint32_t *) GCC_BLSP1_QUP1_CFG_RCGR,
+ .set_rate = clock_lib2_rcg_set_rate_hid,
+ .freq_tbl = ftbl_gcc_blsp1_qup1_i2c_apps_clk_src,
+ .current_freq = &rcg_dummy_freq,
+
+ .c = {
+ .dbg_name = "gcc_blsp1_qup1_i2c_apps_clk_src",
+ .ops = &clk_ops_rcg,
+ },
+};
+
+static struct branch_clk gcc_blsp1_qup1_i2c_apps_clk = {
+ .cbcr_reg = GCC_BLSP1_QUP1_APPS_CBCR,
+ .parent = &gcc_blsp1_qup1_i2c_apps_clk_src.c,
+
+ .c = {
+ .dbg_name = "gcc_blsp1_qup1_i2c_apps_clk",
+ .ops = &clk_ops_branch,
+ },
+};
+ static struct rcg_clk gcc_blsp1_qup2_i2c_apps_clk_src =
{
@@ -585,6 +623,11 @@ static struct clk_lookup msm_clocks_msm8909[] =
CLK_LOOKUP("gcc_blsp1_qup2_i2c_apps_clk", gcc_blsp1_qup2_i2c_apps_clk.c), + // i2c-1
+ CLK_LOOKUP("blsp1_qup1_ahb_iface_clk", gcc_blsp1_ahb_clk.c),
+ CLK_LOOKUP("gcc_blsp1_qup1_i2c_apps_clk_src", gcc_blsp1_qup1_i2c_apps_clk_src.c),
+ CLK_LOOKUP("gcc_blsp1_qup1_i2c_apps_clk", gcc_blsp1_qup1_i2c_apps_clk.c),
+
CLK_LOOKUP("mdp_ahb_clk", mdp_ahb_clk.c),
CLK_LOOKUP("mdss_esc0_clk", mdss_esc0_clk.c),
CLK_LOOKUP("mdss_axi_clk", mdss_axi_clk.c),

初始化

+static void i2c1_init(void)
+{
+ static int flag = 1;
+
+ dprintf(CRITICAL, "%s : start\n", __func__);
+ if(flag != 1)
+ goto end;
+ flag = 0;
+ // i2c-1
+ /*
+ 1 arg: BLSP ID can be BLSP_ID_1 or BLSP_ID_2
+ 2 arg: QUP ID can be QUP_ID_0 ~ QUP_ID_5
+ 3 arg: I2C CLK. should be 100KHZ, or 400KHz
+ 4 arg: Source clock, should be set @ 19.2MHz
+ */
+ i2c_dev = qup_blsp_i2c_init(BLSP_ID_1, QUP_ID_0, 100000, 19200000);
+ if(!i2c_dev)
+ dprintf(CRITICAL, "qup_blsp_i2c_init failed \n");
+end :
+ dprintf(CRITICAL, "%s : end\n", __func__);
+
+}

确保底层的调用没问题:

路径:bootable/bootloader/lk/platform/msm8909/acpuclock.c

/* Configure i2c clock */
void clock_config_blsp_i2c(uint8_t blsp_id, uint8_t qup_id)
{
uint8_t ret = 0;
char clk_name[64]; struct clk *qup_clk; if((blsp_id != BLSP_ID_1) || (qup_id > QUP_ID_5)) {
dprintf(CRITICAL, "Incorrect BLSP-%d or QUP-%d configuration\n", blsp_id, qup_id);
ASSERT(0);
} snprintf(clk_name, sizeof(clk_name), "blsp1_qup1_ahb_iface_clk"); ret = clk_get_set_enable(clk_name, 0 , 1); if (ret) {
dprintf(CRITICAL, "Failed to enable %s clock\n", clk_name);
return;
} snprintf(clk_name, sizeof(clk_name), "gcc_blsp1_qup1_i2c_apps_clk"); qup_clk = clk_get(clk_name); if (!qup_clk) {
dprintf(CRITICAL, "Failed to get %s\n", clk_name);
return;
} ret = clk_enable(qup_clk); if (ret) {
dprintf(CRITICAL, "Failed to enable %s\n", clk_name);
return;
}
}

如果匹配不上的话,会导致下面错误:

Alert!! Requested clock "blsp1_qup1_ahb_iface_clk" is not supported![1140] [1140] Can't find clock with id: blsp1_qup1_ahb_iface_clk

读/写

+static int write_reg(uint8_t slave_addr, uint8_t reg, uint8_t val)
+{
+ int ret = 0;
+ uint8_t data_buf[] = { reg, val };
+
+ /* Create a i2c_msg buffer, that is used to put the controller into write
+ mode and then to write some data. */
+ struct i2c_msg msg_buf[] = { {slave_addr, I2C_M_WR, 2, data_buf} };
+
+ ret = qup_i2c_xfer(i2c_dev, msg_buf, 1);
+ if(ret < 0) {
+ dprintf(CRITICAL, "qup_i2c_xfer error %d\n", ret);
+ return ret;
+ }
+ return 0;
+}
+
+static int read_reg(uint8_t slave_addr, uint8_t reg, uint8_t *val)
+{
+ int ret = 0;
+ /* Create a i2c_msg buffer, that is used to put the controller into read
+ mode and then to read some data. */
+ struct i2c_msg msg_buf[] = {
+ {slave_addr, I2C_M_WR, 1, &reg},
+ {slave_addr, I2C_M_RD, 1, val}
+ };
+
+ ret = qup_i2c_xfer(i2c_dev, msg_buf, 2);
+ if(ret < 0) {
+ dprintf(CRITICAL, "qup_i2c_xfer error %d\n", ret);
+ return ret;
+ }
+ return 0;
+}

高通lk:配置与使用i2c的更多相关文章

  1. 高通lk屏幕向kernel传参

    LK把相关参数报存到cmdline上: 在Bootable\bootloader\lk\dev\gcdb\display\gcdb_display_param.c上gcdb_display_cmdli ...

  2. 高通(QCOM)sensor bring up

    高通7150平台 1.添加驱动文件 2.添加编译 3.配置json文件 4.高通默认配置 5.部分sensor外挂电源 6.遇到的问题 1.添加驱动文件 路径:adsp_proc/ssc/sensor ...

  3. 高通spi 屏幕 -lk代码分析

    lk SPI驱动 1. 初始化时钟 在lk中,我们是从kmain开始执行下来的,而执行顺序则是先初始化时钟,也就是在platform_early_init函数中开始执行的: 在这里我们需要修改这个函数 ...

  4. 高通APQ8074 spi 接口配置

    高通APQ8074 spi 接口配置 8074 平台含有两个BLSP(BAM Low-Speed Peripheral) , 每一个BLSP含有两个QUP, 每一个QUP可以被配置为I2C, SPI, ...

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

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

  6. 高通移植mipi LCD的过程LK代码

    lk部分:(实现LCD兼容) 1. 函数定位 aboot_init()来到target_display_init(): 这就是高通原生lk LCD 兼容的关键所在.至于你需要兼容多少LCD 就在whi ...

  7. 最新内核3.4)Linux 设备树加载I2C client adapter 的流程(内核3.4 高通)【转】

    转自:https://blog.csdn.net/lsn946803746/article/details/52515225 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转 ...

  8. 高通平台msm8909 LK 实现LCD 兼容

    前段时间小米出现红米note2 换屏门,现在我们公司也要上演了:有两个供应商提供不同IC 的LCD panel. 软件区分的办法是读取LCD IC 的ID 寄存器,下面解析高通平台LK中LCD兼容的过 ...

  9. 高通平台 lcd driver 调试小结

    一.概述 1.1 简介 本文档主要包括LCD模块的驱动流程分析.Framebuffer相关知识.Gralloc等相关内容,以及LCD调试的一些经验和相关bug的分析和讲解. 1.2  开发环境 And ...

  10. Linux加载DTS设备节点的过程(以高通8974平台为例)

    DTS是Device Tree Source的缩写,用来描述设备的硬件细节.在过去的ARM Linux中,arch/arm/plat-xxx和arch/arm/mach-xxx中充斥着大量的垃圾代码, ...

随机推荐

  1. 『手撕Vue-CLI』添加自定义指令

    前言 经上篇『手撕Vue-CLI』添加帮助和版本号的介绍之后,已经可以在控制台中输入 nue --help 来查看帮助信息了,但是在帮助信息中只有 --version,--help 这两个指令,而 v ...

  2. Windows下绑定线程到指定的CPU核心

    在某些场景下,需要把程序绑定到指定CPU核心提高执行效率.通过微软官方文档查询到Windows提供了两个Win32函数:SetThreadAffinityMask和SetProcessAffinity ...

  3. SpringBoot快速配置多数据源(整合MyBatis)

    前言 由于业务需求,需要同时在SpringBoot中配置两套数据源(连接两个数据库),要求能做到service层在调用各数据库表的mapper时能够自动切换数据源,也就是mapper自动访问正确的数据 ...

  4. Maven的概述

    Maven的概述 @ 目录 Maven的概述 2. 依赖 3. Maven 的工作机制 3. 最后:感谢 Java 项目开发过程中,构建指的是使用『原材料生产产品』的过程. 原材料 Java 源代码 ...

  5. SWAG反向代理Jellyfin媒体服务器流量教程

    目录 1. 简介 1.1 Jellyfin媒体服务器 1.2 SWAG服务器 2. 设置Jellyfin开启HTTPS访问 3. 安装并配置SWAG服务器反向代理Jellyfin流量 3.1 安装SW ...

  6. vue3的reactive对象赋值后失去响应式的问题

    vue3种对象类型的响应式用reactive实现. 但是reactive对象在赋值后,因为变量代理函数变了,就失去了响应式功能了.示例如下: <template> <div> ...

  7. log4j的配置详解

    参考文章:https://www.jianshu.com/p/ccafda45bcea 引入log4j: 在项目中单独使用log4j进行日志的输出: maven依赖: <dependency&g ...

  8. JavaScript字符串对象转JSON格式

    JavaScript字符串对象转JSON格式 原始数据                 {  xAxis: {    type: 'category',    data: ['Mon', 'Tue', ...

  9. Kafka架构以及一键化部署

    什么是Kafka? Apache Kafka是一个开放源代码的分布式事件流平台,成千上万的公司使用它来实现高性能数据管道,流分析,数据集成和关键任务等相关的应用程序. Kafka的应用场景 构造实时流 ...

  10. Html简要笔记

    html在线文档: https://www.w3school.com.cn 怎么创建文件我已经会了 1,html快速入门 <!--文档类型说明 注释 --> <!DOCTYPE ht ...