int yyySetup(yInterfaceSt *iface,char *errmsg) { char str[32]; yyyInitPktQueue(iface); yInitializeCriticalSection(&iface->yyyCS); if(iface->devref==NULL){ return YERR(YAPI_DEVICE_NOT_FOUND); } 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); } /* 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 return 0; }
int yyyWrite(yInterfaceSt *iface,USB_Packet *pkt,char *errmsg) { IOReturn res; yEnterCriticalSection(&iface->yyyCS); if(iface->devref==NULL){ yLeaveCriticalSection(&iface->yyyCS); return YERR(YAPI_DEVICE_NOT_FOUND); } res = IOHIDDeviceSetReport(iface->devref, kIOHIDReportTypeOutput, 0, /* Report ID*/ (u8*)pkt, sizeof(USB_Packet)); yLeaveCriticalSection(&iface->yyyCS); if (res != kIOReturnSuccess) { dbglog("IOHIDDeviceSetReport failed with 0x%x\n", res); return YERR(YAPI_IO_ERROR); } return 0; }
//return 0 if a read is still pending int yyyReadIdle(yInterfaceSt *iface,char *errmsg) { yEnterCriticalSection(&iface->yyyCS); if(iface->devref==NULL){ yLeaveCriticalSection(&iface->yyyCS); return YERR(YAPI_DEVICE_NOT_FOUND); } yLeaveCriticalSection(&iface->yyyCS); return YAPI_SUCCESS; }
int yyySignalOutPkt(yInterfaceSt *iface, char *errmsg) { int res =YAPI_SUCCESS; pktItem *pktitem; yPktQueuePopH2D(iface, &pktitem); while (pktitem!=NULL){ if(iface->devref==NULL){ yFree(pktitem); return YERR(YAPI_IO_ERROR); } res = IOHIDDeviceSetReport(iface->devref, kIOHIDReportTypeOutput, 0, /* Report ID*/ (u8*)&pktitem->pkt, sizeof(USB_Packet)); yFree(pktitem); if (res != kIOReturnSuccess) { dbglog("IOHIDDeviceSetReport failed with 0x%x\n", res); return YERRMSG(YAPI_IO_ERROR,"IOHIDDeviceSetReport failed");; } yPktQueuePopH2D(iface, &pktitem); } return YAPI_SUCCESS; }
int yyySetup(yInterfaceSt *iface,char *errmsg) { return YERR(YAPI_NOT_SUPPORTED); }
int yyyWrite(yInterfaceSt *iface,USB_Packet *pkt,char *errmsg) { return YERR(YAPI_NOT_SUPPORTED); }
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; }