/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)
=======================================
硬件操作