int yyySetup(yInterfaceSt *iface,char *errmsg) { char str[32]; int i; CFIndex deviceCount; IOHIDDeviceRef *dev_refs; if (yContext->osx_flags & YCTX_OSX_MULTIPLES_HID) { if (YISERR(setupHIDManager(yContext, &iface->hid,errmsg))) { return YAPI_IO_ERROR; } // get all device detected by the OSX dev_refs = getDevRef(&iface->hid, &deviceCount); } else { dev_refs = getDevRef(&yContext->hid, &deviceCount); } if(dev_refs == NULL) { return YERRMSG(YAPI_IO_ERROR,"Device disapear before yyySetup"); } for(i=0 ; i < deviceCount ;i++){ u16 vendorid; u16 deviceid; IOHIDDeviceRef dev = dev_refs[i]; vendorid = get_int_property(dev,CFSTR(kIOHIDVendorIDKey)); deviceid = get_int_property(dev,CFSTR(kIOHIDProductIDKey)); if (iface->vendorid == vendorid && iface->deviceid == deviceid){ char serial[YOCTO_SERIAL_LEN * 2]; memset(serial, 0, YOCTO_SERIAL_LEN * 2); get_txt_property(dev,serial,YOCTO_SERIAL_LEN * 2, CFSTR(kIOHIDSerialNumberKey)); if (YSTRCMP(serial, iface->serial) == 0){ HALLOG("right Interface detected (%x:%x:%s)\n",vendorid,deviceid,iface->serial); iface->devref = dev; break; } } } yFree(dev_refs); if (i == deviceCount) { return YERRMSG(YAPI_IO_ERROR,"Unable to match device detected"); } IOReturn ret = IOHIDDeviceOpen(iface->devref, kIOHIDOptionsTypeNone); if (ret != kIOReturnSuccess) { YSPRINTF(str,32,"Unable to open device (0x%x)",ret); return YERRMSG(YAPI_IO_ERROR,str); } yPktQueueInit(&iface->rxQueue); yPktQueueInit(&iface->txQueue); /* Create the Run Loop Mode for this device. printing the reference seems to work. */ sprintf(str, "yocto_%p", iface->devref); iface->run_loop_mode = CFStringCreateWithCString(NULL, str, kCFStringEncodingASCII); /* Attach the device to a Run Loop */ IOHIDDeviceScheduleWithRunLoop(iface->devref, yContext->usb_run_loop, iface->run_loop_mode); IOHIDDeviceRegisterInputReportCallback( iface->devref, // IOHIDDeviceRef for the HID device (u8*) &iface->tmprxpkt, // pointer to the report data USB_PKT_SIZE, // number of bytes in the report (CFIndex) &Handle_IOHIDDeviceIOHIDReportCallback, // the callback routine iface); // context passed to callback // save setuped iface pointer in context in order // to retreive it durring unplugcallback for (i=0; i< SETUPED_IFACE_CACHE_SIZE ; i++) { if(yContext->setupedIfaceCache[i]==NULL){ yContext->setupedIfaceCache[i] = iface; break; } } if (i==SETUPED_IFACE_CACHE_SIZE) { return YERRMSG(YAPI_IO_ERROR,"Too many setuped USB interfaces"); } iface->flags.yyySetupDone = 1; return 0; }
int yyySetup(yInterfaceSt *iface,char *errmsg) { int res,j; int error; struct libusb_config_descriptor *config; const struct libusb_interface_descriptor* ifd; HALLOG("%s:%d yyySetup %X:%X\n",iface->serial,iface->ifaceno,iface->vendorid,iface->deviceid); if(iface->devref==NULL){ return YERR(YAPI_DEVICE_NOT_FOUND); } if((res=libusb_open(iface->devref,&iface->hdl))!=0){ return yLinSetErr("libusb_open", res,errmsg); } if((res=libusb_kernel_driver_active(iface->hdl,iface->ifaceno))<0){ error= yLinSetErr("libusb_kernel_driver_active",res,errmsg); goto error; } if(res){ HALLOG("%s:%d need to detach kernel driver\n",iface->serial,iface->ifaceno); if((res = libusb_detach_kernel_driver(iface->hdl,iface->ifaceno))<0){ error= yLinSetErr("libusb_detach_kernel_driver",res,errmsg); goto error; } } HALLOG("%s:%d Claim interface\n",iface->serial,iface->ifaceno); if((res = libusb_claim_interface(iface->hdl,iface->ifaceno))<0){ error= yLinSetErr("libusb_claim_interface", res,errmsg); goto error; } res=getDevConfig(iface->devref,&config); if(res<0){ error=YERRMSG(YAPI_IO_ERROR,"unable to get configuration descriptor"); goto error; } ifd = &config->interface[iface->ifaceno].altsetting[0]; for (j = 0; j < ifd->bNumEndpoints; j++) { //HALLOG("endpoint %X size=%d \n",ifd->endpoint[j].bEndpointAddress,ifd->endpoint[j].wMaxPacketSize); if((ifd->endpoint[j].bEndpointAddress & LIBUSB_ENDPOINT_DIR_MASK) == LIBUSB_ENDPOINT_IN){ iface->rdendp = ifd->endpoint[j].bEndpointAddress; }else{ iface->wrendp = ifd->endpoint[j].bEndpointAddress; } } yPktQueueInit(&iface->rxQueue); yPktQueueInit(&iface->txQueue); iface->flags.yyySetupDone = 1; for(j=0;j< NB_LINUX_USB_TR ; j++){ iface->rdTr[j].iface = iface; iface->rdTr[j].tr=libusb_alloc_transfer(0); YASSERT(iface->rdTr[j].tr); libusb_fill_interrupt_transfer( iface->rdTr[j].tr, iface->hdl, iface->rdendp, (u8*)&iface->rdTr[j].tmppkt, sizeof(USB_Packet), read_callback, &iface->rdTr[j], 0/*5 sec*/); HALLOG("%s:%d libusb_TR filled (%d)\n",iface->serial,iface->ifaceno,j); } //HALLOG("%s:%d yyyRead\n",iface->serial ,iface->ifaceno); for(j=0;j< NB_LINUX_USB_TR ; j++){ //HALLOG("%s:%d libusb_TR transmit (%d)\n",iface->serial,iface->ifaceno,j); res=libusb_submit_transfer(iface->rdTr[j].tr); if(res<0){ return yLinSetErr("libusb_submit_transfer",res,errmsg); } } HALLOG("%s:%d yyySetup done\n",iface->serial,iface->ifaceno); return YAPI_SUCCESS; error: libusb_close(iface->hdl); return error; }