博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LINUX驱动之IIC子系统之三I2C的数…
阅读量:4051 次
发布时间:2019-05-25

本文共 2674 字,大约阅读时间需要 8 分钟。

 

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里就有一个设备的遍历和驱动的遍历,很容易把人弄糊涂了。

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

注重一个字,恒!

转载地址:http://nyvci.baihongyu.com/

你可能感兴趣的文章
flutter-解析json
查看>>
android中shader的使用
查看>>
java LinkedList与ArrayList迭代器遍历和for遍历对比
查看>>
drat中构造方法
查看>>
JavaScript的一些基础-数据类型
查看>>
转载一个webview开车指南以及实际项目中的使用
查看>>
android中对于非属性动画的整理
查看>>
一个简单的TabLayout的使用
查看>>
ReactNative使用Redux例子
查看>>
Promise的基本使用
查看>>
coursesa课程 Python 3 programming 统计文件有多少单词
查看>>
coursesa课程 Python 3 programming 输出每一行句子的第三个单词
查看>>
Returning a value from a function
查看>>
coursesa课程 Python 3 programming Functions can call other functions 函数调用另一个函数
查看>>
course_2_assessment_6
查看>>
coursesa课程 Python 3 programming course_2_assessment_7 多参数函数练习题
查看>>
coursesa课程 Python 3 programming course_2_assessment_8 sorted练习题
查看>>
在unity中建立最小的shader(Minimal Shader)
查看>>
1.3 Debugging of Shaders (调试着色器)
查看>>
关于phpcms中模块_tag.class.php中的pc_tag()方法的含义
查看>>