最近因为项目项目需求,要把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 =