飞凌imx6q uboot添加I2C读写外设

本文详细解析了U-Boot环境下I2C模块的初始化与读写方法,包括代码位置、宏定义及具体实现,适用于需要在U-Boot阶段配置I2C外设的开发者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    有时候需要在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的实例,可做参考;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值