对于i2c的理解与讲解,大家可以百度一下。网上的东西杂乱,而且可能是错的,不过那些错误不会阻碍我们掌握i2c的运用与理解。当然,理解归理解,我在这里将i2c的使用方法给自己做了一个“标准”,仅供大家参考。(i2c子系统驱动编写有多种方法)
大家可以先理解一下i2c子系统的架构:https://blog.csdn.net/hanp_linux/article/details/72832158
一、device部分
两组对应函数:
i2c_get_adapter();获取第 nr 条i2c物理总线对应的adapter -------->返回值为adapter结构体
i2c_put_adapter();释放adapter结构体(习惯用完adapter马上释放资源)
i2c_new_device();在文件系统中手动注册一个i2c设备 --------->返回值为client结构体(包含设备信息)
i2c_unregister_device();注销i2c设备
(在学习过程,i2c有几个结构体需要弄清楚一下,这里有偏文章:https://blog.csdn.net/yulay01/article/details/7891937
i2c_driver与i2c_client: 二者是写driver和device用,共同构成驱动
i2c_adapter 对应于物理上的一个适配器,而i2c_algorithm对应一套通信方法,缺少i2c_algorithm的i2c_adapter什么也做 不了,因此i2c_adapter中包含其使用的 i2c_algorithm的指针。)
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/i2c.h>
//标准i2c使用方法-----client端
static struct i2c_board_info g_tdevinfo = {
I2C_BOARD_INFO("i2c_dev", 0x25),
//封装的赋值函数(由于其他的成员无需配置,习惯用此函数赋值name和addr)
};
static struct i2c_client* g_ptclient = NULL;
static int __init test_i2c_client_init(void)
{
struct i2c_adapter* g_ptadapter = NULL;
g_ptadapter = i2c_get_adapter(1);
g_ptclient = i2c_new_device(g_ptadapter, &g_tdevinfo);
i2c_put_adapter(g_ptadapter);
return 0;
}
static void __exit test_i2c_client_exit(void)
{
i2c_unregister_device(g_ptclient);
}
module_init(test_i2c_client_init);
module_exit(test_i2c_client_exit);
MODULE_LICENSE("GPL");
二、driver部分
两个函数:
i2c_register_driver(THIS_MODULE, &g_ti2cDrv); 在系统启动时注册某一条i2c物理总线上的多个i2c设备到i2c子系统
i2c_del_driver(&g_ti2cDrv);