红联Linux门户
Linux帮助

gpio 驱动,ioctl 不能访问,一直返回错误-1

发布时间:2014-06-05 17:18:14来源:红联作者:wucan
今天写一个应用程序测试linux 发现ioctl竟然出错,均返回-1,不知到为什么?
更奇怪的是,在内核端gpio_ioctl加入printk调式,竟然也没有输出,说明用户程序ioctl的时候,根本不会执行gpio_ioctl!!!
求助达人,指点一下linux菜鸟!还有调用的write,read,都是好的
内核驱动程序部分
define GPIO_MAGIC 'm'
#define GPIO_CMD1 _IOR(GPIO_MAGIC,0x1a,unsigned long)
#define GPIO_CMD2 _IOR(GPIO_MAGIC,0x1b,unsigned long)

static long gpio_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
int ret=3;
int val;
printk(KERN_WARNING"wuwuwuuwuwuw\n");
printk(KERN_WARNING"cmd=%d\n",cmd); -------这个地方都没打印
switch(cmd) {
case GPIO_CMD1:
case GPIO_CMD2:
if (arg > 7) {
return 10;
}
__raw_writel((1< val=__raw_readl(gpdat);
printk(KERN_WARNING"the value of %x\n",val);
printk(KERN_WARNING"the value is 1\n");
break;
default:
return 0;
}
return ret;
}

测试程序:
#define GPIO_MAGIC 'm'
#define GPIO_CMD1 _IOR(GPIO_MAGIC,0x1a,unsigned long)
#define GPIO_CMD2 _IOR(GPIO_MAGIC,0X1b,unsigned long)

int main(int argc, char **argv)
{
unsigned long on;
int led_no;
int fd;
long int ret=1;
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/leds", 0);
fd =open("/dev/s3c-gpio", O_RDWR);
if (fd < 0) {
perror("open device leds");
//exit(1);
}
if(on==1)
ret=ioctl(fd,GPIO_CMD1,&led_no);
else
ret=ioctl(fd,GPIO_CMD2,&led_no);
printf("ret=%d\n",ret);

close(fd);
return 0;
文章评论

共有 0 条评论