2015-04-03 4 views
0

В последнее время я практикую простой IOCTL драйвер с тремя командами: печать, получить, установитьПочему некоторые случаи ioctl всегда терпят неудачу?

В заявлении IOCTL переключателя, он выглядит, как этот псевдо-код:

switch (cmd) { 
case "print": 
    break; 
case "get": 
    break; 
case "set": 
    break; 
default: 
    break; 
} 

Но, печатающий случай могут быть правильно выполнены, тогда как get и set case - нет. поэтому я получить выход

[ 2682.940000] mymem_ioctl: <---Switch Command =27395---> 
[ 2682.940000] getdata=80046b01 80046b01setdata=40046b02 40046b02print=6b03 6b03 
[ 2682.950000] <---ORG IOCPRINT :test_var=-1095999702---> 
[ 2682.960000] <---IOCPRINT complete:test_var=111---> 
cmd:6b03, arg=10 success 
SETDATA cmd:40046b02 
ioctl_setdata error 
GETDATA cmd:80046b01 
ioctl_getdata error 

Я попытался расшифровать команду IOCTL, но все выглядит хорошо.

getdata=0x80046b01 => 1000 0000 0000 0100 .... 
setdata=0x40046b02 => 0100 0000 0000 0100 .... 
print=0x6b03 

0100 is size of int 
6b is my magic number 'k' 
01,02,03 is the number of function(get,set,print) 

Я не знаю, почему ... любой может помочь в этом?

версия ядра 2.6.38 и ниже мой код

+0

Пожалуйста, обновите свой вопрос, чтобы увидеть действующий код. 'case" print ":' не будет компилироваться; вы не можете использовать строковые литералы в качестве ярлыков case. –

+0

извините за неправильное неправильное .... это всего лишь образец кода, иллюстрирующий рабочий процесс. –

+0

Вы собираетесь обновить вопрос? –

ответ

1

@line 14

_IOC_NR(cmd)!=MYMEMDEV_IOC_MAXNR 

, вероятно, следует проверить

_IOC_NR(cmd) <= MYMEMDEV_IOC_MAXNR 

Кроме того, я прошу вас, следовать стилю кодирования ядра. Нам было бы намного легче помочь в этом.
http://lxr.free-electrons.com/source/Documentation/CodingStyle

+0

Я просто решил это сам несколько часов назад. это именно то, что вы сказали. глупая ошибка. спасибо за информацию о стиле кодирования. :) –