amlogic平台android uboot中添加i2c设备实现i2c的读写

    最近因为项目项目需求,要把MTK平台的一个设备移植到amlogic平台。需要分别在uboot阶段和android系统起来以后的阶段,使用i2c来通知这个设备进行操作。这其中就涉及到两点:
1. 在uboot阶段初始化i2c。
2. 对i2c读写接口的移植。

    接下来我会用最简单的语言来描述,如何在uboot中添加i2c的设备。我不会用大量的使用代码来讲解,因为这没用意义,不同平台之间,相关文件、接口等等差别很大。我更多的是希望给拿到类似任务又一脸懵逼的小伙伴们一些启发。在下一篇里,我还会介绍在linux内核加载完进入android系统后添加i2c设备的方式。

    我当前的平台式amlogic平台,平台不同的小伙伴也没关系,先找到方向。

    其实对于平台工程师来说,uboot阶段移植添加个i2c设备非常简单。先介绍个文件:uboot\board\amlogic\gxb_p201_v1\gxb_p201_v1.c:
简单来说,uboot在加载的过程中会去执行这个文件中的board_init()方法。所以第一步你需要去找到这个方法,编译的uboot的脚本文件中可以给你信息。

    接下来就是第二步我们需要在这个方法中添加i2c初始化部分。可能有些小伙伴会有疑问,那i2c怎么初始化?其实不同平台,i2c的初始化方式也不一样。你需要注意以下几点:
    1.  不需要你去手动去操作寄存器来初始化i2c,你要做的是调用平台相关的接口来初始化i2c。这些接口包含设备的相关信息,如GPIO口及它的功能(时钟线还是数据线)。amlogic平台会有个board_i2c_init接口,这个接口的作用就是专门用来初始化i2c,你需要去填充这个接口要用到的相关结构体(也就是设备信息),我举个保存从设备信息结构体的例子:  
struct aml_i2c_platform g_aml_i2c_plat = {
                .wait_count         = 1000000,
                .wait_ack_interval  = 5,
                .wait_read_interval = 5,
                .wait_xfer_interval = 5,
                .master_no          = AML_I2C_MASTER_AO,    //通常主芯片不会只有一组i2c,所以需要确定当前i2c的组数是第几组
                .use_pio            = 0,
                .master_i2c_speed   = AML_I2C_SPPED_400K,   //这个速度是要根据你从设备来确定,你需要知道你的从设备支持的速度是多少。
                .master_ao_pinmux = {
                .scl_reg    = (unsigned long)MESON_I2C_MASTER_AO_GPIOAO_4_REG,  //时钟
                .scl_bit    = MESON_I2C_MASTER_AO_GPIOAO_4_BIT,     
                .sda_reg    = (unsigned long)MESON_I2C_MASTER_AO_GPIOAO_5_REG,  //数据
                .sda_bit    = MESON_I2C_MASTER_AO_GPIOAO_5_BIT,
    }
};
    在i2c初始化的方法中,会通过指针的方式去获取这些信息来对i2c进行初始化。

    2.  通常来说并不需要你手动去写这些结构体,一般原厂会把整个框架搭好。如果没有使用,那么代码块很可能在某个角落处于注释的状态。你要么直接可以打开,修改相关结构体后就能用,要么就可以参照着某个角落的代码例程写。如果是后者,你需要多去看看i2c初始化的那些接口中都需要结构体、哪些信息,再一一的实现。

    3.  如何确定我的i2c是否初始化成功了,这就需要用到示波器了。一般在初始化的过程中伴随着一些读写。所以如果时钟和数据线有稳定的输出,那么或许初始化成功了,若没有时钟输出,那一定没有初始化成功。

那么费老大劲初始化i2c,一般都是为了读写操作。接下来就是读写需要注意的:
    1. 最快的方式是原厂来提供例程,仿照例程写。还是那句话每个平台的读写方式都不一样,单纯的去追代码研究,会耗费大量时间。据从MTK和Amlogic两个平台的读写模块对比来看,很相似,但也差很多。除非你想花大量的时间去研究底层代码,但最快的方式还是看例程。
    2. 多去用示波器验证所移植的读写接口是否存在问题。可以写demo调用自己移植的接口来进行数据的读写,通过示波器查看和传进去的值是否一致。

最后一点最重要的:不懂的时候可以多和芯片原厂的工程师进行沟通。

你可能感兴趣的:(amlogic平台android uboot中添加i2c设备实现i2c的读写)