主题 : 请版主出马(LED驱动程序定义命令后不能检测命令)? 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 54848
精华: 0
发帖: 23
金钱: 115 两
威望: 23 点
综合积分: 46 分
注册时间: 2011-09-07
最后登录: 2012-01-09
楼主  发表于: 2011-11-07 08:56

 请版主出马(LED驱动程序定义命令后不能检测命令)?

#include "memdev.h"

#define DEVICE_NAME "leds"

static unsigned long led_table[]={
S3C2410_GPB(5),
S3C2410_GPB(6),
S3C2410_GPB(7),
S3C2410_GPB(8),
};

static unsigned int led_cfg_table[]={
S3C2410_GPIO_OUTPUT,
S3C2410_GPIO_OUTPUT,
S3C2410_GPIO_OUTPUT,
S3C2410_GPIO_OUTPUT,
};

static int mini2440_leds_ioctl(
struct inode* inode,
struct file* file,
unsigned int cmd,
unsigned long arg)
{
int i = 0;
int tmp = arg;

if (_IOC_TYPE(cmd) != MEMDEV_IOC_MAGIC)
return -EINVAL;
//问题就在这个黑体上面,如果我注释掉,在2440上/etc/rc.d/init.d/leds stop,再执行./led 1 0等等是正确的。
加上这句话,2440在启动后面不执行leds里面的程序,执行./led 1 0也没有反应。我觉得是不是我检查命令有问题,magic定义的是'k',
并且看了ioctl-number.txt,'k'没有定义。
现在不知道怎么解决这个问题?

请版主或者高人出马,帮初学者解决此问题,先谢谢啦!

if (_IOC_NR(cmd) > MEMDEV_IOC_MAXNR)
return -EINVAL;


switch(cmd)
{
case 0:
for (i = 0;i < 4; i++)
s3c2410_gpio_setpin(led_table,1);
return 0;
case 1:


for(i = 0; i < 4; i++)
s3c2410_gpio_setpin(led_table,0);

return 0;
default:
return -EINVAL;
}}


static struct file_operations dev_fops = {
.owner = THIS_MODULE,
.ioctl = mini2440_leds_ioctl,
};

static struct miscdevice misc = {
.minor = MISC_DYNAMIC_MINOR,
.name = DEVICE_NAME,
.fops = &dev_fops,
};

static int __init dev_init(void)
{
int ret;
int i;
for (i =0; i < 4; i++)
{
s3c2410_gpio_cfgpin(led_table,led_cfg_table);
s3c2410_gpio_setpin(led_table,0);
}

ret = misc_register(&misc);
printk (DEVICE_NAME"\tinitialized\n");
return ret;
}

static void __exit dev_exit(void)
{
misc_deregister(&misc);
}

module_init(dev_init);
module_exit(dev_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("wilson Chen");