主题 : 關於ioctl 第三個參數arg 复制链接 | 浏览器收藏 | 打印
级别: 侠客
UID: 113147
精华: 0
发帖: 107
金钱: 535 两
威望: 107 点
综合积分: 214 分
注册时间: 2015-03-05
最后登录: 2015-09-16
楼主  发表于: 2015-04-10 16:33

 關於ioctl 第三個參數arg

當我透過ADB在開發版上下指令:  為何arg printk出來是很大的數目,而不是2呢?
C:\>adb shell "ioctl /dev/led_demo 1 2"
sending ioctl 0x1 0x00 0x00 0x00 0x00
ioctl 0x1 failed, -1


開發版Terminal:
[  684.325000] led_open
[  684.325000] led_ioctl
[  684.325000] input arg:1097490464
[  684.325000] input cmd:1
[  684.325000] parameter is no valid.

Source code如下:
static long led_ioctl (struct file *fops, unsigned int cmd, unsigned long arg)
{
    printk("led_ioctl\n");

    //struct led_demo_dev * led_dev = (struct led_demo_dev *)fops->private_data;
    printk("input arg:%d\n",arg);
    printk("input cmd:%d\n",cmd);
    if((arg < 1) || (arg > 4))
    {
        printk(KERN_ALERT"parameter is no valid.\n");
        return -EINVAL;
    }

    switch (cmd)
    {
        case 0://LED_OFF:
            writel(readl(GPM4DAT) | (0x1<<(arg-1)), GPM4DAT);
            break;
        case 1://LED_ON:
            writel(readl(GPM4DAT) & ~(0x1<<(arg-1)), GPM4DAT);
            break;
        default:
            return -EINVAL;