linux ioctl是算字符设备吗,字符设备ioctl传参问题

新手贴: 我知道ioctl可以从用户层向驱动传参,所以想看下能不能从内核向用户传参,实际实验了下  得到的参数都和我传入的差很远  不知道什么问题额  求大家指点下 谢谢

驱动程序(ioctl only):static long led_unlocked_ioctl(struct file *filp,unsigned int cmd,unsigned long arg)

{

int tmp=3;

int err=0;

printk("enter bsp now");

//struct cdev_dev *dev=filp->private_data;

/*check the arguments before the switch*/

if(_IOC_TYPE(LED_WRITE)!=LED_MAGIC)

{

printk("1it's not ok here");

return -ENOTTY;

}

if(_IOC_NR(LED_WRITE) > LED_MAXNR)

{

printk("2it's not ok here");

return -ENOTTY;

}

if(_IOC_DIR(LED_WRITE)&_IOC_READ)

err= !access_ok(VERIFY_WRITE,(void __user*)arg,_IOC_SIZE(LED_WRITE));

if(err)

return -EFAULT;

printk("it's ok here%ldn",arg);

switch(cmd)

{

case LED_WRITE:

if(arg==1)

{

printk("ioctl we get%cn",led_dev->iRet);

//kbc_i2c_write_reg(PRJ_SYSTEM_STATUS_OFFSET, LED_BLINK_IMAGE_UPDATE);

msleep(10000);

//kbc_i2c_write_reg(PRJ_SYSTEM_STATUS_OFFSET,LED_BLINK_IMAGE_UPDATE_NONE);

printk("success to stop blink");

}

else  printk("2ioctl we get%cn",led_dev->iRet);

break;

case LED_READ:

copy_to_user((unsigned long *)arg,&tmp,sizeof(int));

break;

default:

return -ENOTTY;

}

return 0;

}

测试程序:#include

#include

#include

#include

/*ioctl define*/

#define LED_MAGIC 'k' //magic number

#define LED_WRITE _IOW(LED_MAGIC, 1, int)

#define LED_READ _IOR(LED_MAGIC, 2, int)

#define LED_MAXNR 4

int main()

{

int quantum=1,fd,k,tmp;

fd = open("/dev/LED", O_WRONLY);

if(fd==-1)

{

perror("open device key error!n");

return 0;

}

k=ioctl(fd, LED_WRITE,quantum);

if(kgo to open

[118839.030913] enter bsp nowit's ok here1

[118839.030920] ioctl we getsuccess to stop blinkenter bsp nowit's ok here1079052448

[118849.022267] =====>go to close

|

调用ioctl时应该使用ioctl(fd,LED_READ,&tmp);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值