2013-03-20 56 views
2

我想现在创建我自己的我的游戏手柄的驱动程序,我发现原来的原因,我想创造它不存在,但我还是想为了体验而做。 所以请不要告诉我,有一个更好的方法来做这件事比写我自己的驱动程序。电话的ioctl()使用USBFS USB设备上不起作用

在内核空间的部分与的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); 
} 

[...]的closefile(INT file_desc)缺少这里,这和OPENFILE功能存在,因为我不知道一个可以称之为“::打开()”时,Qt的覆盖函数调用。

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"); 
    } 
} 

OK,串到我打开我打电话去的lsusb和手工代码更改的文件,这是仅用于调试,直到我得到的ioctl调用工作

当我所说的callioctl()它打印:

Ioctl failed with error Unpassender IOCTL (I/O-Control) für das Gerät 

德国部分的意思是“错误的ioctl(I/O控制)的设备”,并没有出现在dmesg,这就是为什么我觉得我的ioctl函数中没有调用驱动程序。

+0

是'有史以来xpad_probe'叫? – 2013-03-23 10:27:08

+0

是的,我测试了我的驱动程序是通过将不同的输入事件分配给按钮来使用的,并查看我用于在dmesg中识别我的驱动程序的打印件 – Ongy 2013-03-24 07:56:36

回答

0

如果你看看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设备。