免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: 虫虫2003
打印 上一主题 下一主题

请问Linux下I2C设备驱动该如何写? [复制链接]

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:15程序设计版块每日发帖之星
日期:2015-09-21 06:20:002015亚冠之卡尔希纳萨夫
日期:2015-09-22 14:11:11程序设计版块每日发帖之星
日期:2015-09-25 06:20:00每日论坛发贴之星
日期:2015-09-25 06:20:00
11 [报告]
发表于 2013-08-11 19:03 |只看该作者
本帖最后由 cascle 于 2013-08-11 19:06 编辑

用属性文件吧,缺点是不加自动搜索文件名代码的话,上层代码访问属性文件的路径要随着平台变化(因为不同平台的i2c设备目录名称是不一样的)

论坛徽章:
0
12 [报告]
发表于 2013-08-11 23:08 |只看该作者
cascle 发表于 2013-08-11 19:03
用属性文件吧,缺点是不加自动搜索文件名代码的话,上层代码访问属性文件的路径要随着平台变化(因为不同平 ...

能否给个示例代码?

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:15程序设计版块每日发帖之星
日期:2015-09-21 06:20:002015亚冠之卡尔希纳萨夫
日期:2015-09-22 14:11:11程序设计版块每日发帖之星
日期:2015-09-25 06:20:00每日论坛发贴之星
日期:2015-09-25 06:20:00
13 [报告]
发表于 2013-08-12 17:26 |只看该作者
回复 12# 虫虫2003
  1. static ssize_t xxx_store_caliberate(struct device *dev,
  2.                                    struct device_attribute *attr,
  3.                                    const char *buf, size_t count)
  4. {
  5.         const ptrdiff_t offset = attr - s_attr;
  6.         int set_value = simple_strtoul(buf, NULL, 10);
  7.         switch(offset)
  8.         {
  9.                 case 0:
  10.                 case 1:
  11.         }
  12. }

  13. static ssize_t xxx_show_caliberate(struct device *dev,
  14.                                     struct device_attribute *attr, char *buf)
  15. {
  16.         const ptrdiff_t offset = attr - s_attr;
  17.         switch(offset)
  18.         {
  19.                 case 0:
  20.                 case 1:
  21.         }
  22. }


  23. #define XXX_ATTR(_name)                         \
  24. {                                       \
  25.         .attr = { .name = #_name, .mode = S_IRUGO | S_IWUSR | S_IWGRP, },  \
  26.         .show = xxx_show_caliberate,                  \
  27.         .store = xxx_store_caliberate,                              \
  28. }


  29. static struct device_attribute s_attr[] = {
  30.         XXX_ATTR(a),
  31.         XXX_ATTR(b),
  32.         };
复制代码

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:15程序设计版块每日发帖之星
日期:2015-09-21 06:20:002015亚冠之卡尔希纳萨夫
日期:2015-09-22 14:11:11程序设计版块每日发帖之星
日期:2015-09-25 06:20:00每日论坛发贴之星
日期:2015-09-25 06:20:00
14 [报告]
发表于 2013-08-12 17:28 |只看该作者
大体的架子就是这样,至于具体的细节,自己google下属性文件怎么写吧,都很好找的

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:15程序设计版块每日发帖之星
日期:2015-09-21 06:20:002015亚冠之卡尔希纳萨夫
日期:2015-09-22 14:11:11程序设计版块每日发帖之星
日期:2015-09-25 06:20:00每日论坛发贴之星
日期:2015-09-25 06:20:00
15 [报告]
发表于 2013-08-12 17:30 |只看该作者
create和remove我就不加了

论坛徽章:
0
16 [报告]
发表于 2013-09-26 13:23 |只看该作者
本帖最后由 jmyu2006 于 2013-09-26 13:28 编辑

回复 7# 虫虫2003


   我也有此疑问。不过目前的理解就是:没有什么好的办法。要么适配Linux I2C子系统,要么自行另起炉灶。你举的海思的例子,说明它这个BSP包做的好,有层次,做到了OS无关。其实我个人觉得驱动就应该像海思平台那样写:Linux Kernel <-- Linux Driver subystem <-- Linux Driver Adapter <-- OS independent Driver。 这样,利用最低一层的OS independent Driver,各种驱动就可以方便地进行不同OS下的移植。试想一下,一颗芯片做出来,自然要写芯片驱动来进行测试,这个时候是没必要用到Linux这个庞然大物的,直接写些功能函数来驱动硬件就可以了,只要函数接口设计成低耦合性,那到时候做Linux驱动时,完全可以做到复用这个函数,只是要进一步包装一层,来适配Linux而已。如果直接就照Linux的结构来写,那就会出现楼主目前的疑问了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP