您的位置:首页 > 运维架构 > Linux

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里就有一个设备的遍历和驱动的遍历,很容易把人弄糊涂了。
先讲这么一点点,明天开始讲注册部分。
注重一个字,恒!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: