IIC驱动---系统框架(2)

/IIC总线架构分析:linux的driver/i2c目录下。参考busses目录下用到的文件。

  APP层

========================================

  • i2c设备驱动层组件(i2c-dev.c)

// 入口函数

i2c_dev_init();

//注册主设备号

register_chrdev(I2C_MAJOR, "i2c", &i2cdev_fops); //申请主设备号

#define I2C_MAJOR 89  //主设备号

//创建设备类

 i2c_dev_class = class_create(THIS_MODULE, "i2c-dev");

//绑定适配器,搜索i2c总线的设备链表

i2c_for_each_dev(NULL, i2cdev_attach_adapter);

i2cdev_attach_adapter() {

//判断是否为i2c设备

if (dev->type != &i2c_adapter_type)

        return 0;

*****

//创建设备文件:/dev/i2c-0. /dev/i2c-1....

 /* register this i2c device with the driver core */

    i2c_dev->dev = device_create(i2c_dev_class, &adap->dev, 

                                      MKDEV(I2C_MAJOR, adap->nr), NULL, "i2c-%d", adap->nr);

******

}

IIC编程重要接口: (linux/i2c.h)

//发送iic数据

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

//接收iic数据

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

//传输一个iic数据包

int i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num);  

  • i2c核心层组件 (i2c-core.c) 

// 入口函数

i2c_init();

//注册iic总线

bus_register(&i2c_bus_type);

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,
};

//注册iic驱动

i2c_add_driver(&dummy_driver);

  • IIC驱动

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; //设备链表


};
 

  • IIC设备 

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; //链表
};

  • IIC适配器 

struct i2c_adapter {
    unsigned int id; //设备器的编号
    const struct i2c_algorithm *algo; //算法,IIC协议来发送数据
    struct device dev; //表明这是一个设备
};
 

  • IIC 消息 

struct i2c_msg {
    __u16 addr;    /* 从设备地址 */
     __u16 flags;    /* 读写标志位 */ 
#define I2C_M_TEN 0x10     /* 这个使用10-bit地址    */
#define I2C_M_RD    0x01
#define I2C_M_NOSTART    0x4000
#define I2C_M_REV_DIR_ADDR    0x2000
#define I2C_M_IGNORE_NAK    0x1000
#define I2C_M_NO_RD_ACK        0x0800
     __u16 len;        /* msg 长度 */
     __u8 *buf;        /* msg数据指针*/
}; 

  • IIC板卡

struct i2c_board_info {   // IIC板卡信息
        char            type[I2C_NAME_SIZE];  // i2c设备名字
        unsigned short  flags;  
        unsigned short  addr;      //i2c的设备地址
        void            *platform_data;  
        struct dev_archdata     *archdata;
        struct device_node *of_node;
        int             irq;
};

  • i2c总线驱动层组件(i2c-s3c2410.c)

=======================================

硬件操作

猜你喜欢

转载自blog.csdn.net/m0_37844072/article/details/121778787