• 驱动_I2c驱动框架


     I2c驱动框架


    应用


    (从设备驱动层)

    i2c_driver层

     (自己编写)


     (核心层)

             

    i2c_core层                                                                                                    i2c_bus_type    

          

    (i2c_core.c)


     (控制器层)

    i2c_adapter层                                      

     (i2c_xxx.c)


    硬件 

    目录:linux/driver/i2c/ 

          algo/   (i2c-algo-bit.c)

          busses/   (原厂)

          muxes/      (无用)

    <从设备驱动层>  i2c-dev.c                           自己编写

    <核      心     层>  i2c-core.c                           内核提供

    <控   制   器  层>    busses/i2c-xxx.c(瑞芯微:i2c-rk3x.c  全志:i2c-sunxi.c)    原厂提供

    < 结构体> 


     struct i2c_msg {
        __u16 addr;     //从设备地址
        __u16 flags;    // 类型 (读1写0)
        __u16 len;      /* msg length */   数据包个数
        __u8 *buf;      /* pointer to msg data */   数据包
      };

      struct i2c_driver {      //描述一个i2c从设备驱动的操作方法
        unsigned int class;
        /* Standard driver model interfaces */
        int (*probe)(struct i2c_client *, const struct i2c_device_id *);
        int (*remove)(struct i2c_client *);

        struct device_driver driver;    //父类
        const struct i2c_device_id *id_table;    // 用于匹配的id_table(列表)
        const unsigned short *address_list;
        struct list_head clients;
      };

      

      struct i2c_adapter {
        const struct i2c_algorithm *algo; /* the algorithm to access the bus */
        |
        int (*master_xfer)(struct i2c_adapter *adap, struct i2c_msg *msgs,int num);
        int nr;   //编号
        struct device dev;   //父类
      }

       

      struct i2c_client {                //代表i2c 从设备的信息
        unsigned short addr;       //7bit 从设备地址
        char name[I2C_NAME_SIZE];   //用于和i2c driver进行匹配
        struct i2c_adapter *adapter;    //指向创建自己的适配器(控制器)
        struct i2c_driver *driver;      // 指针已经匹配成功之后的i2c driver
        struct device dev;       //父类--用于加入总线
      
    };

      

    <函数>


    数据传输接口:i

    i2c_master_send(const struct i2c_client * client,const char * buf,int count)
    i2c_master_recv(const struct i2c_client * client,char * buf,int count)

       ↓

    i2c_adapter   /   i2c_msg →  i2c_transfer(struct i2c_adapter * adap,struct i2c_msg * msgs,int num) //通用

       ↓

    i2c_algorithm → master_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num); 

    代码示例:https://www.cnblogs.com/panda-w/p/11118591.html

    <代码框架> :


     <笔记>


    1.  i2c driver层:应用交互,知道数据,不知传输

       i2c core 层: 维护了一个i2c总线

       i2c adapter:  硬件交互,不知数据,只知传输

    2. 查看i2c设备信息:ls /sys/bus/i2c/devices/0-0050/(name)

     查看i2c驱动名字:/sys/bus/i2c/drivers

    3. 每个i2c控制器总线上都可以挂载多个i2c外设

    4.每个I2C器件在出厂时都会固化自己的I2C地址的,也有通过硬件引脚选择I2C地址的

    5. i2c控制器不用管,引出的引脚与控制器已经连死

    6. 宏定义在结构体,说明在结构体中有效

    3.

    Stay hungry, stay foolish 待续。。。
  • 相关阅读:
    c# list排序的三种实现方式 (转帖)
    LINQ TO SQL 中的join(转帖)
    Linq to sql 增删改查(转帖)
    DBLinq (MySQL exactly) Linq To MySql
    github
    eclipse安装github插件egit
    Android中图片的目录
    Fragment
    世界500强榜单出炉:中国公司首进三强 沃尔玛居首
    经济学,不会挣钱,更不会赚钱
  • 原文地址:https://www.cnblogs.com/panda-w/p/10922747.html
Copyright © 2020-2023  润新知