linux驱动之i2c子系统device注册driver注册简单分析

Linux 驱动设计主要是根据分层分离思想,i2c子系统分为i2cocre、adapter、及device_driver层,其实adapter也是个device,只不过是我们主控芯片的I2C控制接口而已,我们的主控芯片有几个I2C接口就有几个adapter;

i2ccore这一层linux已经帮我们实现,主要的工做是类似platform总线的作用,负责drvier及设备的注册,相比platform多了个adapter的注册管理工作,以及i2c的数据发送接收等等算法,说算法有点夸大,其实就是按照i2c的通讯协议做的收发时序而已;

adapter这一层一般主控芯片厂家会提供,所以也不需自己编写,s3c2440芯片这一层是采用的s3c2410的适配器驱动,大致框架是采用platform虚拟总线,向i2ccore注册adapter驱动;

device_driver这端的驱动就要求自己编写了,这主要是我们外接设备的驱动,比如一些i2c接口的三轴加速度计、at24c0x系列的eeprom等等……这部分代码其实就是实现如何操作他们,比如发什么数据给他们可以启动他们、发什么数据给他们可以读到数据。

按照i2ccore的框架,device_driver 分为两部分内容,一个是device的注册,另一部分是driver的注册,在两边分别完成注册的时候,会分别调用i2ccore的match函数,进行匹配,匹配和platform的匹配方式一致,是通过名字进行匹配,不过这个名字和platform的名字不一样而已;如下列出device及driver注册在i2ccore中的调用过程,从过程中可以看出匹配、绑定及调用driver端的probe函数过程:

注册device:

i2c_new_device
    device_register
        device_add
            bus_probe_device
                /* 判断device与driver是否匹配 */
                device_attach
                    /* 匹配成功,调用bind函数绑定 */
                    device_bind_driver
                        /* 绑定成功,调用driver端的probe函数 */
                         driver_deferred_probe_del ( dev );
                        driver_deferred_probe_trigger();

注册driver:

i2c_register_driver
    driver_register
        bus_add_driver
            driver_attach
                /* 在总线上的没个设备轮训匹配,实际是调用__driver_attach函数进行匹配 */
                bus_for_each_dev ( drv->bus, NULL, drv, __driver_attach );
                    if ( !dev->driver )                            // 如果设备还未绑定driver
                  driver_probe_device ( drv, dev );
                      ret = really_probe ( dev, drv );
                          dev->driver = drv;                      // 设备和driver绑定
                          ret = drv->probe ( dev );          // 调用driver的probe
                             driver_bound ( dev );              // device和driver绑定

总结下就是编写i2c设备驱动,和platform虚拟总线一致,只不过最后是注册到了i2c总线而已;linux驱动还是采用分离分层的思想设计驱动。

时间: 2024-10-10 08:34:12

linux驱动之i2c子系统device注册driver注册简单分析的相关文章

linux驱动之i2c子系统mpu6050设备驱动

以下是mpu6050简单的驱动实现,mpu6050是I2C接口的6轴传感器,可以作为字符设备注册到内核,本代码运行环境是3.4.2内核,4.3.2版本的编译链,12.04版本的Ubuntu,硬件环境是jz2440开发板: 按照之前分析的I2C驱动框架,mpu6050驱动主要是实现外设端的驱动,主要是注册外设到I2C总线,而外设端注册到I2C总线包括device及driver两个部分注册到I2C总线,采用分离的设计思想,详情见代码: device注册到I2C总线: #include <linux/

Linux驱动之输入子系统框架

    好记性不如烂笔头,整理一下笔记~ Linux驱动之输入子系统框架 输入子系统将该类驱动划分为3部分 1.核心层 input.c 2.设备层 Gpio_keys.c ... 3.事件处理层 Evdev.c 事件处理层为纯软件的东西,设备层涉及底层硬件,它们通过核心层建立联系,对外提供open write等接口. 1.我们首先来看,核心层 input.c如何向外界提供接口 在 input_init 中注册了字符设备驱动 register_chrdev(INPUT_MAJOR, "input&

[platform]Device和Driver注册顺序

1. 设备和驱动注册,无论谁先谁后,都可以通过查询总线进行匹配 设备挂接到总线上时,与总线上的所有驱动进行匹配(用bus_type.match进行匹配),如果匹配成功,则调用bus_type.probe或者driver.probe初始化该设备,挂接到总线上如果匹配失败,则只是将该设备挂接到总线上. 驱动挂接到总线上时,与总线上的所有设备进行匹配(用bus_type.match进行匹配),如果匹配成功,则调用bus_type.probe或者driver.probe初始化该设备:挂接到总线上如果匹配

linux驱动之I2C

include/linux/i2c.h struct i2c_msg;struct i2c_algorithm;struct i2c_adapter;struct i2c_client;struct i2c_driver;union i2c_smbus_data; I2C驱动主要包含三部分:I2C核心.I2C总线驱动.I2C设备驱动,它们主要的数据结构在目录:/include/linux/i2c.h struct i2c_driver 1 /* 2 * A driver is capable o

linux驱动之i2c总线驱动调用分析【基于linux4.4】

平台:RK3399 使用设备树描述板级资源: 框架: linux i2c框架同样采用分层.分离的模式设计:从上到下分为  app调用层.i2c core层.驱动层:驱动层又分为 cpu平台 i2c控制器相关的驱动层以及 i2c总线上挂接的设备驱动程序:而分离的思想则体现在板级相关的信息放在设备树上实现,而通用的读写.初始化流程.操作流程等则放到驱动里面实现(类似platform总线驱动): 具体分析: 1. cpu i2c控制器驱动(adpter) static struct platform_

linux驱动之i2c学习

最近在研究linux的i2c驱动,从最底层i2c控制器初始化到应用层与i2c设备交互基本打通了. 一.linux的i2c架构可以用下图表示: IIC适配器对应一条i2c总线,linux里面用i2c_adapter结构表示.总线下的i2c设备用i2c_client结构表示.algorithm是i2c的通信协议,IIC核心层负责注册/注销i2c_adapter.注册/注销i2c_client.注册i2c总线等操作.i2c-dev对应的是i2c-dev.c,它负责将总线实例化为一个i2c_client

Linux驱动之输入子系统简析

输入子系统由驱动层.输入子系统核心.事件处理层三部分组成.一个输入事件,如鼠标移动.键盘按下等通过Driver->Inputcore->Event handler->userspace的顺序到达用户控件的应用程序. 系统框图 假设打开一个字符设备驱动程序/dev/event0,event代表的是输入子系统的设备文件,当应用程序调用C库的open函数后,open函数会进入系统调用,最后定位到drivers\input\input.c文件下(这个文件就是核心层)的.这个函数的功能主要是根据设

Linux 驱动模型初探3——device

讲device之前,我要引入一个比喻,这个比喻来自一个学长(z2007b).driver是帅哥,device是美女,bus是红娘,bus是提供device和driver配对的场所(方法?).好吧,暂时先这样定,现在要讲的就是美女. 1,老规则,先看看struce device这个美女有哪些特性(成员)和方法 struct device { struct device *parent; struct device_private*p; struct kobject kobj; const char

Linux驱动之Input子系统要点分析

① Input_device与Input_handler的匹配过程 当Input_device与Input_handler->id中的位图信息全部一致,则匹配成功,然后调用Input_handler->connect函数,在该函数中创建相对应的设备访问节点 ② 事件报告过程 底层驱动程序通过调用report_xxx函数向上层报告输入事件,经Input_core层对输入事件进行分类,并且分发到相应的Input_handle层(evdev.c tsdev.c consoledev.c moused