LINUX驱动之IIC子系统之三I2C的数…

 

LINUX驱动之IIC子系统之三I2C的数据结构

仍然是按照老的规矩,讲一下I2C的数据结构,让大家在学习I2C前,形成一个整体上的知识结构的认知。它的数据结构也不多,主要的有下面几个:(I2C.h)

1、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,

    .suspend   = i2c_device_suspend,

    .resume       = i2c_device_resume,

};

2、I2C从设备数据结构体:

struct i2c_client {

    unsigned short flags;      

    unsigned short addr;    

                 

                 

    char name[I2C_NAME_SIZE];

    struct i2c_adapter *adapter;   

    struct i2c_driver *driver; 

    struct device dev;      

    int irq;         

    struct list_head detected;

};

3、I2C从设备驱动结构体:

struct i2c_driver {

    unsigned int class;

 

   

    int (*attach_adapter)(struct i2c_adapter *);

    int (*detach_adapter)(struct i2c_adapter *);

 

   

    int (*probe)(struct i2c_client *, const struct i2c_device_id *);

    int (*remove)(struct i2c_client *);

 

   

    void (*shutdown)(struct i2c_client *);

    int (*suspend)(struct i2c_client *, pm_message_t mesg);

    int (*resume)(struct i2c_client *);

 

   

    int (*command)(struct i2c_client *client, unsigned int cmd, void *arg);

 

    struct device_driver driver;

    const struct i2c_device_id *id_table;

 

   

    int (*detect)(struct i2c_client *, int kind, struct i2c_board_info *);

    const struct i2c_client_address_data *address_data;

    struct list_head clients;

};

4、表征I2C设备的一些特征的数据结构体,组成链表的基本单元:

struct i2c_board_info {

    char       type[I2C_NAME_SIZE];

    unsigned short    flags;

    unsigned short    addr;

    void       *platform_data;

    struct dev_archdata  *archdata;

    int    irq;

};

在SPI里大家也发有这么一个吧,而且它还有一个管理这个的链表结构,这里就不再讲那个了,因为i2C直接使用的链表没有新建立一个类似的结构。

5、I2C传输数据的一种算法

struct i2c_algorithm {

   

   

    int (*master_xfer)(struct i2c_adapter *adap, struct i2c_msg *msgs,

              int num);

    int (*smbus_xfer) (struct i2c_adapter *adap, u16 addr,

              unsigned short flags, char read_write,

              u8 command, int size, union i2c_smbus_data *data);

 

   

    u32 (*functionality) (struct i2c_adapter *);

};

I2C的通信最终都必须调用该结构中master_xfer的方法来实现。这套通信方法是跟底层I2C控制器硬件相关的。

6、I2C主设备数据结构:

struct i2c_adapter {

    struct module *owner;

    unsigned int id;

    unsigned int class;       

    const struct i2c_algorithm *algo;

    void *algo_data;

 

   

    u8 level;        

    struct mutex bus_lock;

 

    int timeout;        

    int retries;

    struct device dev;      

 

    int nr;

    char name[48];

    struct completion dev_released;

};

这个叫控制器也叫适配器,大家一定要记清。

7、I2C消息数据结构体:

struct i2c_msg {

    __u16 addr;  

    __u16 flags;

#define I2C_M_TEN    0x0010

#define I2C_M_RD     0x0001

#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

#define I2C_M_RECV_LEN      0x0400

    __u16 len;   

    __u8 *buf;   

};

看着它发现与SPI有相类似的地方没有。

8、smbus数据结构体(一种通信算法)

union i2c_smbus_data {

    __u8 byte;

    __u16 word;

    __u8 block[I2C_SMBUS_BLOCK_MAX + 2];

                 

};

这些个数据结构会自始至终的跟在整个I2C设备的通信过程中,大家一定要有一个清楚的认识,别弄混了,象SPI里就有一个设备的遍历和驱动的遍历,很容易把人弄糊涂了。

先讲这么一点点,明天开始讲注册部分。

注重一个字,恒!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值