记录学习linux驱动-i2c设备驱动

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();//需要编进内核

结束

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值