BSP即板级支持包,来源于嵌入式操作系统与硬件无关的设计思想,操作系统被设计为运行在虚拟的硬件平台上。对于众多的硬件厂家平台,与硬件相关的代码全部封装与BSP中,向上层软件提供虚拟的硬件平台。BSP通过已定义的接口与操作系统进行交互,由操作系统来实现针对应用程序的硬件无关性。
Linux2.6以后引入了platform机制,platform的匹配过程如左下图所示,入口函数为platform_bus_init(),从函数start_kernal()中调用。从入口函数创建父总线并匹配到本地的设备,将device和driver通过设备的产品名称进行一对一的match。匹配成功时,通过出口函数probe进行驱动的初始化操作。右下图中所示platform的模块框架,左边是device部分中的资源(空间地址),中间是platform总线,右边是driver。driver中包含各种驱动的具体实现,获取资源,对资源的应用与操作,从而达到驱动字符设备的目的。
如何注册驱动
- 定义一个platform_driver结构;
- 初始化这个结构,指定其probe、remove等函数,并初始化其中的driver变量;
- 实现其probe、remove等函数;
结构体定义代码实现:
static struct platform_driver ocores_uart_driver = {
.probe = rg_ocores_uart_probe,
.remove = rg_ocores_uart_remove,
.driver = {
.name = "rg-uart",
},
};
Linux的I2C驱动结构可分为3个部分:
I2C核心:提供总线驱动与设备驱动的注册与注销方法、I2C的通信算法与适配器无关的代码以及检测设备地址的功能。i2c-core.c中的核心驱动可以管理多个master适配器(控制器)和多个slave设备。
I2C总线驱动:主要包括I2C适配器的结构i2c_adapter和algorithm数据结构。通过总线驱动的代码可以控制I2C适配器以主控的方式产生开始位、停止位和读写周期,并以从设备的方式被读写、产生ACK等等。
I2C设备驱动:主要包括i2c_driver数据结构与i2c_client数据结构。I2C设备的端的实现,设备一挂接于I2C适配器,适配器则受到CPU控制,设备通过I2C适配器与CPU来交互数据。
挂载了i2c设备后,i2c_client会由i2c_adpater生成,1个设备对应1个client。然后adpater会根据client的id,来进行driver和client之间的匹配,匹配成功后调用drive中的probe函数。
代码级实现:
I2C总线
struct bus_type i2c_bus_type = {
.name = "i2c",
.match = i2c_device_match, // 确认设备和驱动是否匹配函数
.probe = i2c_device_probe,
.remove = i2c_device_remove,
.shutdown = i2c_device_shutdown,
.pm = &i2c_device_pm_ops,
};
I2C设备驱动
struct i2c_driver {
int (*probe)(struct i2c_client *, const struct i2c_device_id *); //probe函数
struct device_driver driver; //表明这是一个驱动
const struct i2c_device_id *id_table; //要匹配的从设备信息(名称)
int (*detect)(struct i2c_client *, struct i2c_board_info *); //设备探测函数
const unsigned short *address_list; //设备地址
struct list_head clients; //设备链表
};
I2C设备
struct i2c_client {
unsigned short addr; //设备地址
char name[I2C_NAME_SIZE]; //设备名称
struct i2c_adapter *adapter; //设配器,值I2C控制器
struct i2c_driver *driver; //设备对应的驱动
struct device dev; //表明这是一个设备
int irq; //中断号
struct list_head detected; //节点
};
I2C适配器
struct i2c_adapter {
unsigned int id; //设备器的编号
const struct i2c_algorithm *algo; //算法,发送时序
struct device dev; //表明这是一个设备
};