新手贴: 我知道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);