前言
一、I2C设备驱动的概述
二、I2C设备层
2.1 I2C设备(i2c_client)
2.2 I2C设备地址
2.3 I2C设备(i2c_client)的其他注意事项
2.4 I2C设备驱动(i2c_driver)
2.5 i2c_driver 和 i2c_client 的关系
三、I2C总线层
3.1 I2C总线适配器(i2c_adapter)
3.2 I2C总线驱动程序(i2c_algorithm)
struct i2c_algorithm {
/* If an adapter algorithm can't do I2C-level access, set master_xfer to NULL.
If an adapter algorithm can do SMBus access, set smbus_xfer. If set to NULL, the SMBus protocol is simulated using common I2C messages */
/* master_xfer should return the number of messages successfully processed, or a negative value on error */
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);
/* To determine what the adapter supports */
u32 (*functionality) (struct i2c_adapter *);
};
3.3 I2C设备层和总线层的关系
四、写 I2C 设备驱动的步骤
五、I2C子系统的初始化
5.1 I2C子系统初始化函数 i2c_init()
5.2 I2C子系统退出函数 i2c_exit()![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/1e4995e23fe18f54578a40f02e258d40.png)
六、适配器驱动程序
6.1 s3c2440 对应的适配器结构体
6.1.1 s3c24xx_i2c 适配器
6.1.2 I2C消息(i2c_msg)
6.2 I2C适配器加载函数 i2c_add_adapter()
6.3 IDR机制
6.4 适配器卸载函数 i2c_del_adapter()
6.5 I2C总线通信方法 s3c24xx_i2c_algorithm 结构体
6.6 适配器的传输函数 s3c24xx_i2c_doxfer()
6.6.1 判断总线闲忙状态 s3c24xx_i2c_set_master()
6.6.2 适配器中断使能函数 s3c24xx_i2c_enable_irq()
6.6.3 启动适配器消息传输函数 s3c24xx_i2c_message_start()
6.7 适配器的中断处理函数 s3c24xx_i2c_irq()
6.7.1 数据通信方法的调用关系
6.7.2 中断处理函数 s3c24xx_i2c_irq()
6.8 字节传输函数 i2c_s3c_irq_nextbyte()
i2c_s3c_irq_nextbyte() 函数用来传送下一个字节,其代码如下:
6.9 适配器传输停止函数 s3c24xx_i2c_stop()
6.10 中断处理函数的一些辅助函数
七、I2C设备层驱动程序
本节将详细讲解I2C设备层程序。这个驱动程序中包括模块加载和卸载函数、探测函数、初始化函数等,具体的实现将在本节详细的讲解。
7.1 I2C设备驱动模块加载和卸载
7.1.1 平台驱动的加载和卸载
7.1.2 平台驱动 s3c2410_i2c_driver
7.2 探测函数 s3c24xx_i2c_probe()
7.3 移除函数 s3c24xx_i2c_remove()
7.4 控制器初始化函数 s3c24xx_i2c_init()
7.5 设置控制器数据发送频率函数 s3c24xx_i2c_clockrate()