有时候需要在uboot启动或配置I2C外设,例如LED控制芯片等。
1、imx6q uboot中初始化代码位置
imx6q uboot中初始化代码位置在uboot-imx/board/freescale/mx6q_sabresd/mx6q_sabresd.c文件中
2、uboot中i2c简单分析
imx6q uboot中使用的i2c方法在/uboot-imx/drivers/i2c/mxc_i2c.c文件中,刚打开文件,满眼都是I2C_BASE这个宏,定义为:
#define I2C_BASE CONFIG_SYS_I2C_PORT
继续跟踪CONFIG_SYS_I2C_PORT这个宏,这是定义在include/cinfigs/mx6dl_sabresd.h文件中,定义为:
#define CONFIG_SYS_I2C_PORT I2C2_BASE_ADDR
I2C2_BASE_ADDR定义在include/asm-arm/arch-mx6/mx6.h文件中,可以看出,uboot目前只使用了i2c2,我需要使用i2c3,所以我在mxc_i2c.c文件中增加了一个设置i2c的方法:
int set_i2c_bus(int _bus_num)
{
switch(_bus_num)
{
case 1:
break;
case 2:
I2C_BASE = I2C2_BASE_ADDR;
break;
case 3:
I2C_BASE = I2C3_BASE_ADDR;
break;
default:
break;
}
}
3、i2c读写方法分析
uboot中i2c读写方法:
int i2c_read(uchar chip, uint addr, int alen, uchar *buffer, int len);
int i2c_write(uchar chip, uint addr, int alen, uchar *buffer, int len);
/*
* Read/Write interface:
* chip: I2C chip address, range 0..127,不带读写位
* addr: Memory (register) address within the chip
* alen: Number of bytes to use for addr (typically 1, 2 for larger
* memories, 0 for register type devices with only one
* register)
* 其中alen 为1,说明chip是8bit的, 为2则是 16bit的。
* buffer: Where to read/write the data
* len: How many bytes to read/write
*
* Returns: 0 on success, not 0 on failure
*/
注意:
1、刚开始读写时,形参buffer是地址,我直接写了值,坑了我一把;
2、飞凌imx6q uboot中mx6q_sabresd.c文件下board_late_init方法中调用setup_pmic_voltages()方法,该方法内有操作I2C的实例,可做参考;