static void read_callback(struct libusb_transfer *transfer) { int res; linRdTr *lintr = (linRdTr*)transfer->user_data; yInterfaceSt *iface = lintr->iface; switch(transfer->status){ case LIBUSB_TRANSFER_COMPLETED: //HALLOG("%s:%d pkt_arrived (len=%d)\n",iface->serial,iface->ifaceno,transfer->actual_length); yPktQueuePushD2H(iface,&lintr->tmppkt,NULL); if (iface->flags.yyySetupDone) { res=libusb_submit_transfer(lintr->tr); if(res<0){ HALLOG("%s:%d libusb_submit_transfer errror %X\n",iface->serial,iface->ifaceno,res); } } return; case LIBUSB_TRANSFER_ERROR: HALLOG("%s:%d pkt error\n",iface->serial,iface->ifaceno); res=libusb_submit_transfer(lintr->tr); if(res<0){ HALLOG("%s:%d libusb_submit_transfer errror %X\n",iface->serial,iface->ifaceno,res); } break; case LIBUSB_TRANSFER_TIMED_OUT : HALLOG("%s:%d pkt timeout\n",iface->serial,iface->ifaceno); break; case LIBUSB_TRANSFER_CANCELLED: HALLOG("%s:%d pkt_cancelled (len=%d) \n",iface->serial,iface->ifaceno,transfer->actual_length); if(transfer->actual_length==64){ yPktQueuePushD2H(iface,&lintr->tmppkt,NULL); } break; case LIBUSB_TRANSFER_STALL: HALLOG("%s:%d pkt stall\n",iface->serial,iface->ifaceno); res=libusb_submit_transfer(lintr->tr); if(res<0){ HALLOG("%s:%d libusb_submit_transfer errror %X\n",iface->serial,iface->ifaceno,res); } break; case LIBUSB_TRANSFER_NO_DEVICE: HALLOG("%s:%d pkt_cancelled (len=%d)\n",iface->serial,iface->ifaceno,transfer->actual_length); return; case LIBUSB_TRANSFER_OVERFLOW: HALLOG("%s:%d pkt_overflow (len=%d)\n",iface->serial,iface->ifaceno,transfer->actual_length); break; default: HALLOG("%s:%d unknown state %X\n",iface->serial,iface->ifaceno,transfer->status); break; } }
static void Handle_IOHIDDeviceIOHIDReportCallback( void * inContext, // context from IOHIDDeviceRegisterInputReportCallback IOReturn inResult, // completion result for the input report operation void * inSender, // IOHIDDeviceRef of the device this report is from IOHIDReportType inType, // the report type uint32_t inReportID, // the report ID uint8_t * inReport, // pointer to the report data CFIndex InReportLength) // the actual size of the input report { yInterfaceSt *iface= (yInterfaceSt*) inContext; yPktQueuePushD2H(iface,&iface->tmprxpkt,NULL); memset(&iface->tmprxpkt,0xff,sizeof(USB_Packet)); }