LINUX BSP (Board Support Package) 驱动结构

本文介绍了Linux Board Support Package (BSP)的概念及其在Linux2.6后的platform机制,详细阐述了Linux I2C驱动的三个组成部分:I2C核心、I2C总线驱动和I2C设备驱动,以及如何注册驱动和设备匹配的过程。通过代码示例展示了I2C驱动的结构和功能。
摘要由CSDN通过智能技术生成

BSP即板级支持包,来源于嵌入式操作系统与硬件无关的设计思想,操作系统被设计为运行在虚拟的硬件平台上。对于众多的硬件厂家平台,与硬件相关的代码全部封装与BSP中,向上层软件提供虚拟的硬件平台。BSP通过已定义的接口与操作系统进行交互,由操作系统来实现针对应用程序的硬件无关性。
Linux2.6以后引入了platform机制,platform的匹配过程如左下图所示,入口函数为platform_bus_init(),从函数start_kernal()中调用。从入口函数创建父总线并匹配到本地的设备,将device和driver通过设备的产品名称进行一对一的match。匹配成功时,通过出口函数probe进行驱动的初始化操作。右下图中所示platform的模块框架,左边是device部分中的资源(空间地址),中间是platform总线,右边是driver。driver中包含各种驱动的具体实现,获取资源,对资源的应用与操作,从而达到驱动字符设备的目的。
在这里插入图片描述

如何注册驱动

  1. 定义一个platform_driver结构;
  2. 初始化这个结构,指定其probe、remove等函数,并初始化其中的driver变量;
  3. 实现其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; //表明这是一个设备
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值