作者nikeasyanzi (nikeasyanzi)
看板LinuxDev
标题[问题] ioctl cmd 解码
时间Fri Apr 3 01:39:43 2015
小弟最近练习ioctl
定义了3个command print,set and get
因为基本上在driver的 kernel module ioctl 一定会需要用到switch
所以可能像
switch (cmd){
case "print":
...
break;
case "set":
...
break;
case "get":
...
break;
default:
...
break;
}
现在问题来了~ 我利用user space function 验证 只有print成功 set&get都不会过
在呼叫user space ioctl时 就挂了
output是
[ 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)
看起来也没问题
不知道板上先进 有无任何想法
mymemdev.c
https://github.com/nikeasyanzi/DeviceDriverLabTiny6410/blob/master/lab4ioctlDev/mymemdev.c
mymemdev.h
https://github.com/nikeasyanzi/DeviceDriverLabTiny6410/blob/master/lab4ioctlDev/mymemdev.h
mymemdev_ioctl.h
https://github.com/nikeasyanzi/DeviceDriverLabTiny6410/blob/master/lab4ioctlDev/mymemdev_ioctl.h
user space test program
https://github.com/nikeasyanzi/DeviceDriverLabTiny6410/blob/master/lab4ioctlDev/app-mem.c
--
CyberPanel 5000CP 换 NT.500
http://myurl.com.tw/05bd
EmailCash 5000e 换 NT.500
http://myurl.com.tw/rgdq
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 114.34.5.200
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/LinuxDev/M.1427996386.A.6A2.html
※ 编辑: nikeasyanzi (114.34.5.200), 04/03/2015 01:54:54
※ 编辑: nikeasyanzi (114.34.5.200), 04/03/2015 19:00:02
1F:→ mshockwave: 小弟见识不多 但是C可以switch string?????? 04/03 20:15
2F:→ alongalone: 你有看ioctl的function宣告长什麽样子吗..= =? 04/04 09:03
3F:→ nikeasyanzi: 先谢谢楼上两位~ 已经解决了~ switch 只是示意 04/06 00:42
4F:→ nikeasyanzi: 不好意思 造成大家误解@@ 04/06 00:44
5F:→ nikeasyanzi: mymemdev.c driver code 後来发现错在这@@ 04/06 00:46
6F:→ nikeasyanzi: _IOC_NR(cmd)!=MYMEMDEV_IOC_MAXNR所以只有print会过 04/06 00:47