i2c设备驱动
在linux下访问i2c设备,可以使用在用户层使用i2c-tool工具,越过驱动程序直接使用i2c-adapter驱动访问,也可以自己编写中间层驱动,在驱动中调用i2c-adapter驱动提供的函数。本文介绍了i2c中间层驱动框架,i2c-adapter驱动将会在后续文章中写出。
i2c驱动框架
1. i2c设备驱动框架
i2c设备驱动框架,与platform框架类似,采用分离的思想,将设备驱动与设备信息分离开。当driver与device相匹配,就会调用driver中的probe函数。区别在于,platform总线为虚拟总线,而i2c总线为真实的总线
[platform_bus]
/ \
xxx_driver xxx_device
/ \
xxx_driver ---match (probe)--- xxx_device
[i2c_bus]
/ \
xxx_driver i2c_client
/ \
xxx_driver ---match (probe)--- i2c_client
2. i2c驱动框架模板
//定义file_operations结构体
static struct file_operations my_file_operations = {
.owner = THIS_MODULE,
.open = xxx_driver_open,
.read = xxx_driver_read,
.write = xxx_driver_write,
}
//定义of_device_id 从设备树中获取
static const struct of_device_id of_match_ids_xxx[] = {
{ .compatible = "company_name , chip_name", .data = NULL},
{/*END OF LIST*/},
};
//从代码中获取
static const struct i2c_device_id xxx_ids[] = {
{ "chip_name", (kernel_ulong_t)NULL },
{ /* END OF LIST */ }
};
static int i2c_driver_xxx_probe(struct i2c_client *client)
{ ...
//注册字符设备
register_chrdev(major, "name", &my_file_operations);
return 0;
}
static int i2c_driver_xxx_remove(struct i2c_client *client)
{
...
//卸载字符设备
unregister_chrdev(major, "name");
}
//定义i2c_driver结构体
static struct i2c_driver i2c_xxx_driver = {
.driver = {
.name = "xxx_str",
.of_match_table = of_match_ids_xxx,
},
.probe = i2c_driver_xxx_probe,
.remove = i2c_driver_xxx_remove,
.id_table = xxx_ids,
};
//入口函数
static int __init i2c_driver_init(void)
{
......
return i2c_add_driver();
}
module_init(i2c_driver_init);
//出口函数
static void __exit i2c_driver_exit(void)
{
......
return i2c_del_driver();
}
module_init(i2c_driver_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("liaoPJ");
i2c_client生成方法
1 用户空间生成
//假设为i2c-0 name为设备名字 addr为
# echo name addr > /sys/bus/devices/i2c-0/new_device
//删除设备
# echo addr >/sys/bus/devices/i2c-0/delet_device
2 设备树获取
添加设备树节点
&i2c1 {
xxx_name {
compatible = "company name, device name";
reg = <addr>
};
};
3 代码编写
代码内编写,也就是编写platform驱动的device文件
使用
i2c_new_device();
i2c_new_probed_device();
i2c_register_board_info();//需要编进内核