1. U-Boot中I2C驱动模型概述
在嵌入式系统开发中,I2C总线是最常用的外设接口之一。U-Boot作为嵌入式系统的引导加载程序,提供了两种不同的I2C驱动实现方式:传统的SYS_I2C和基于驱动模型的DM_I2C。这两种方式各有特点,适用于不同的开发场景。
SYS_I2C是U-Boot早期采用的实现方式,它提供了一组简单的API函数,开发者可以直接调用这些函数进行I2C设备的读写操作。这种方式实现简单,但缺乏灵活性,特别是在支持多种I2C控制器和设备时显得力不从心。
DM_I2C则是U-Boot引入驱动模型后提出的新架构。它采用面向对象的设计思想,将I2C总线和设备抽象为独立的设备对象,通过统一的接口进行管理。这种方式更加灵活,支持设备树的配置,能够更好地适应复杂的硬件环境。
在实际项目中,我们经常会遇到这样的选择:是继续使用简单直接的SYS_I2C,还是迁移到更现代的DM_I2C?要回答这个问题,我们需要深入了解两者的实现细节和适用场景。
2. SYS_I2C:传统实现方式详解
2.1 SYS_I2C的基本架构
SYS_I2C的实现主要集中在drivers/i2c/i2c_core.c文件中。它采用全局变量来维护I2C总线的状态,包括当前选中的总线号、总线速度等。这种设计简单直接,但在多总线、多设备场景下容易出现问题。
使用SYS_I2C时,开发者需要先通过i2c_set_bus_num()函数选择要操作的总线,然后再调用读写函数。这种显式的总线选择方式虽然直观,但在复杂的驱动程序中容易出错,特别是在中断处理等场景下。
2.2 SYS_I2C的核心API
SYS_I2C提供的主要API包括:
// 设置当前I2C总线号
int i2c_set_bus_num(unsigned int bus);
// 基本读写函数
int i2c_read(uint8_t chip, unsigned i

4546

被折叠的 条评论
为什么被折叠?



