LINUX驱动之IIC子系统之三I2C的数…
2013-12-19 20:51
411 查看
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里就有一个设备的遍历和驱动的遍历,很容易把人弄糊涂了。
先讲这么一点点,明天开始讲注册部分。
注重一个字,恒!
仍然是按照老的规矩,讲一下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里就有一个设备的遍历和驱动的遍历,很容易把人弄糊涂了。
先讲这么一点点,明天开始讲注册部分。
注重一个字,恒!
相关文章推荐
- LINUX驱动之IIC子系统之三I2C的数…
- Linux驱动子系统之I2C(5)
- Linux i2c子系统(一) _动手写一个i2c设备驱动
- Linux I2C子系统驱动阐述
- Linux驱动编程--基于I2C子系统的I2C驱动
- Linux驱动子系统之I2C(6)
- Linux I2C子系统分析-I2C总线驱动
- Linux I2C子系统分析-I2C总线驱动
- Linux i2c子系统(四) _从i2c-s3c24xx.c看i2c控制器驱动的编写
- Linux驱动子系统之I2C(1)
- Linux驱动编程--基于I2C子系统的I2C驱动
- Linux驱动编程--基于I2C子系统的I2C驱动的Makefile
- Linux驱动子系统之I2C(1)
- Linux驱动子系统之I2C
- Linux驱动子系统之I2C(5)
- Linux I2C子系统分析-I2C总线驱动
- linux之i2c子系统架构---总线驱动
- Linux驱动子系统之I2C(2)
- Linux驱动子系统之I2C(1)
- Linux驱动编程--基于I2C子系统的I2C驱动