- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我现在正在尝试为我的 Gamepad 创建我自己的驱动程序,我发现我想要创建它的最初原因不存在,但我仍然想这样做是为了体验。 所以请不要告诉我有比自己编写驱动程序更好的方法。
内核空间中应该调用ioctl函数的部分是:
static int xpad_ioctl (struct usb_interface *intf, unsigned int code,void *buf) {
//struct usb_xpad *xpad = usb_get_intfdata(intf);
printk(KERN_INFO"(Ongy)IOCTL called\n");
//if (_IOC_TYPE(code) != XPAD_IOMAGIC) return -ENOTTY;
//if (_IOC_NR(code) > XPAD_IOMAX) return -ENOTTY;
switch(code){
case XPAD_IORMAP:
printk(KERN_INFO"(Ongy)IORMAP called\n");
break;
default:
return -EINVAL;
}
return 0;
}
static struct usb_driver xpad_driver =
{
.name = "Cyborg-V5-driver",
.probe = xpad_probe,
.disconnect = xpad_disconnect,
.unlocked_ioctl = xpad_ioctl,
.id_table = xpad_table,
};
用户空间中调用它的部分是(这是 Qt 应用程序的一部分):
int openfile() {
char *device = "/dev/bus/usb/005/009";
printf("Opening device %s\n", device);
return open(device, /*O_RDONLY*/O_WRONLY | O_NONBLOCK );
}
void MainContainer::callioctl() {
int file_desc, ret_val;
errno = 0;
file_desc = openfile();
if (file_desc==-1){
printf("Ioctl notcalled because of: error %s\n", strerror(errno));
}
else
{
errno = 0;
//struct usbdevfs_getdriver* driver = (usbdevfs_getdriver*)malloc(sizeof(struct usbdevfs_getdriver));
struct mappingpair* pair = (mappingpair*)malloc(sizeof(struct mappingpair));
ret_val = ioctl(file_desc, XPAD_IORMAP, pair);
//printf("Drivername %s\n", driver->driver);
closefile(file_desc);
if (ret_val==-1) printf("Ioctl failed with error %s\n", strerror(errno));
else printf("Ioctl call successfull\n");
}
}
好的,我打开文件的字符串是通过调用 lsusb 得到的,并在代码中手动更改它,这仅用于调试,直到我使 ioctl 调用正常工作
当我调用 callioctl() 时,它会打印:
Ioctl failed with error Unpassender IOCTL (I/O-Control) für das Gerät
德语部分的意思是“设备的错误 ioctl(I/O 控制)”并且 dmesg
中没有任何内容,这就是为什么我认为我的驱动程序中的 ioctl 函数没有被调用。
最佳答案
如果你看http://www.hep.by/gnu/kernel/usb/usbfs.html它说要将 ioctl
发送到 usb_driver
设备,您需要执行以下操作:
struct usbdevfs_ioctl {
int ifno;
int ioctl_code;
void *data;
};
/* user mode call looks like this.
* 'request' becomes the driver->ioctl() 'code' parameter.
* the size of 'param' is encoded in 'request', and that data
* is copied to or from the driver->ioctl() 'buf' parameter.
*/
static int
usbdev_ioctl (int fd, int ifno, unsigned request, void *param)
{
struct usbdevfs_ioctl wrapper;
wrapper.ifno = ifno;
wrapper.ioctl_code = request;
wrapper.data = param;
return ioctl (fd, USBDEVFS_IOCTL, &wrapper);
}
文档在 /proc/bus
下列出了 USB 设备,所以不可否认这可能已经改变了。
关于linux - 使用 usbfs 在 usb 设备上调用 ioctl() 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15529509/
我确实将 linux 内核从 2.6 升级到 3.10 版本在 init nn 2.6 中,我确实挂载了 usbfs mount -t usbfs usbfs/proc/bus/usb -onodev
我现在正在尝试为我的 Gamepad 创建我自己的驱动程序,我发现我想要创建它的最初原因不存在,但我仍然想这样做是为了体验。 所以请不要告诉我有比自己编写驱动程序更好的方法。 内核空间中应该调用ioc
在 Android 中,我使用类 ( UsbIso.java ) 从连接的 USB 设备以同步方式传输数据。由于 Android 本身不支持同步传输,我不得不通过 JNA 库使用 USBFS 原生 L
我是一名优秀的程序员,十分优秀!