- 论坛徽章:
- 0
|
![]()
文件:
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 |
|