文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>mini2440LED驱动程序

mini2440LED驱动程序

时间:2009-07-03  来源:jeefjiang1983

文件: 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 < 4; i++) {

              s3c2410_gpio_cfgpin(led_table[i], led_cfg_table[i]);

              //config the pin to output

              s3c2410_gpio_setpin(led_table[i], 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 < 0) {

              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<=3){

            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 <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <sys/ioctl.h>

#include <linux/ioctl.h>

#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 < 0 || on > 1 || led_no < 0 || led_no > 3) {

              fprintf(stderr, "Usage: leds led_no 0|1\n");

              exit(1);

       }

       fd = open("/dev/miniled", 0);

       if (fd < 0) {

              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其他类推。程序请参考附件,交流联系[email protected]

相关阅读 更多 +
排行榜 更多 +
fps僵尸生存安卓版

fps僵尸生存安卓版

飞行射击 下载
fps多人射击

fps多人射击

飞行射击 下载
空中风笛

空中风笛

飞行射击 下载