免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1363 | 回复: 0
打印 上一主题 下一主题

2.6 driver /proc/sys 编程实例 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-10-29 18:17 |只看该作者 |倒序浏览

2.4中的gpio要把内核数据放在proc下面,方法比较麻烦。看2.6的驱动,里面采用ctl_table结构来做,
而且是可读写的,使用和实现起来非常方便,统一放在proc/sys下面。
static ctl_table gpio_table[] = {
  {
    .ctl_name       = 3,
    .procname       = "gpio2",
    .maxlen         = sizeof(int),
    .mode           = 0644,
    .proc_handler   = &gpio_sysctl_op,
  },
  {
    .ctl_name       = 2,
    .procname       = "gpio1",
    .maxlen         = sizeof(int),
    .mode           = 0644,
    .proc_handler   = &gpio_sysctl_op,
  },
  
  {
    .ctl_name       = 1,
    .procname       = "gpio0",
    .maxlen         = sizeof(int),
    .mode           = 0644,
    .proc_handler   = &gpio_sysctl_op,
  },
  { .ctl_name = 0 }
};
在写gpio_sysctl_op实现时遇到一些麻烦,比如说cat /proc/sys/gpio/gpio0 会不停的输出,后来看了
下别人的代码,加了一段程序就可以了
static int gpio_sysctl_op(ctl_table *table, int write, struct file *filp,
       void __user *buffer, size_t *lenp, loff_t *ppos)
if (*ppos > 0) {
     *lenp = 0;
     return 0;
}
在driver/cdrom/cdrom.c里面它是这样加的
  if (!*lenp || (*ppos && !write)) {
        *lenp = 0;
        return 0;
    }
此外你要使cat /proc/sys/gpio0 能正确显示,送到用户空间的必须是字符串,所以读出来的十六进制数要转换一下的。
整个函数如下,对其中的lenp和ppos还是搞得不是很清楚。
static int gpio_sysctl_op(ctl_table *table, int write, struct file *filp,
       void __user *buffer, size_t *lenp, loff_t *ppos)
{
int i;
unsigned int port_data = 0;
unsigned char str_data[24] = {0};

if (!*lenp || (*ppos && !write)) {
  *lenp = 0;
  return 0;
}
if (!write){
  /*read*/
  /*
  if (*ppos > 0) {
    *lenp = 0;
    return 0;
  }*/
  port_data = ar7100_reg_rd(AR7100_GPIO_IN);
  
  for ( i = 0 ; i

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/83623/showart_1353785.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP