免费注册 查看新帖 |

Chinaunix

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

mini2440LED驱动程序 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-07-03 20:02 |只看该作者 |倒序浏览

               

文件:
miniled.rar
大小:
2KB
下载:
下载
mini2440LED驱动程序
又看了一遍LDD3,决定自己写驱动程序了,先从最简单的开始,写个Led的驱动程序
开发板:友善之臂mini2440
开发环境:Fedora+arm-linux-gcc+NFS
内核版本:Linux2.6.29
参考程序:LDD3的SCULL模块程序,友善之臂本身提供的LED驱动
开发板本身提供了驱动程序,决定对其做一定的更改,将LDD3中学到的知识运用上去,
先看init函数
static int  __init miniled_init(void)
{
       int result, i,err;
       dev_t dev = 0;
       for (i = 0; i
              s3c2410_gpio_cfgpin(led_table, led_cfg_table);
              //config the pin to output
              s3c2410_gpio_setpin(led_table, 0);//light the led
       }
       if (miniled_major) {
              dev = MKDEV(miniled_major,miniled_minor)
              result = register_chrdev_region(dev, miniled_nr_devs, "miniled") ;
       }else {
                     result = alloc_chrdev_region(&dev, miniled_minor, miniled_nr_devs,
                            " miniled ");
              miniled_major= MAJOR(dev);
       }//这是LDD3中提供的字符设备注册的静态和动态分配设备号的方法
       if (result
              printk(KERN_WARNING "miniled: can't get major %d\n", miniled_major);
              return result;
       }

       cdev_init(&miniled_dev,miniled_dev_fops );
       miniled_dev.owner=THIS_MODULE;
       miniled_dev.ops=&miniled_dev_fops ;
       err = cdev_add (&miniled_dev, dev, 1);
       /*you should not call cdev_dev until your driver is completely ready to handle operations on the device */注意正如LDD3所要求,要将所有准备工作都做好,才能添加设备,以上三行代码可以参照LDD3charpt3
       /* Fail gracefully if need be */
       if (err)
              printk(KERN_NOTICE "Error %d adding led", err);
}
由于只要控制LED的亮和灭在文件操作结构中我们只定义了ioctl操作(open操作如果为空,打开总是正确)
int miniled_ioctl(struct inode *inode, struct file *filp,
                 unsigned int cmd, unsigned long arg)
{

       int err = 0, tmp;
       int retval = 0;
   
       /*
        * extract the type and number bitfields, and don't decode
        * wrong cmds: return ENOTTY (inappropriate ioctl) before access_ok()
        */
       if (_IOC_TYPE(cmd) != MINILED_IOC_MAGIC) return -ENOTTY;
       if (_IOC_NR(cmd) > MINILED__IOC_MAXNR) return -ENOTTY;
//判断命令是否合法
       if(arg>=0&&arg
            tmp=_IOC_NR(cmd);
              s3c2410_gpio_setpin(unsigned int pin, unsigned int to)(led_table[arg], !tmp);

       }
       return retval;
}
注意这里的返回时依照POSIX标准,参照LDD3 英文版P140,关于命令如何定义参考LDD3P137和ioctl-number.txt文档,显然自带程序不符合ioctl的编程规范。
测试:测试程序由友善之臂程序做相应更改而得,红色部分是为了生成命令而必须包含的。
测试之前先需要insmod /usr/module/miniled.ko(我是以模块的形式编译的)
然后查询/proc/device 下miniled对应得设备号,笔者的板子上时252
然后执行#mknod /dev/miniled c 252 0 生成相应的设备文件
#include
#include
#include
#include
#include
#define MINILED_IOC_MAGIC  'k'
int main(int argc, char **argv)
{
       int on;
       int led_no;
       int fd;
       if (argc != 3 || sscanf(argv[1], "%d", &led_no) != 1 || sscanf(argv[2],"%d", &on) != 1 ||
           on  1 || led_no  3) {
              fprintf(stderr, "Usage: leds led_no 0|1\n");
              exit(1);
       }
       fd = open("/dev/miniled", 0);
       if (fd
              perror("open device leds");
              exit(1);
       }
       ioctl(fd, (_IOW( MINILED_IOC_MAGIC ,on,int)), led_no);
       close(fd);
       return 0;
}
#./led 0 1 点亮第一个LED,./led 0,0熄灭第一个led其他类推。程序请参考附件,交流联系
Jeefjiang1983@163.com
               
               

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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP