21 static uint8_t usb_error = 0;
22 static uint8_t usb_task_state;
37 return ( usb_task_state);
41 usb_task_state = state;
52 for(uint8_t i = 0; i < p->
epcount; i++) {
53 if((pep)->epAddr == ep)
80 uint8_t USB::SetAddress(uint8_t addr, uint8_t ep,
EpInfo **ppep, uint16_t *nak_limit) {
126 uint8_t
USB::ctrlReq(uint8_t addr, uint8_t ep, uint8_t bmReqType, uint8_t bRequest, uint8_t wValLo, uint8_t wValHi,
127 uint16_t wInd, uint16_t total, uint16_t nbytes, uint8_t* dataptr,
USBReadParser *p) {
128 bool direction =
false;
133 uint16_t nak_limit = 0;
135 rcode = SetAddress(addr, ep, &pep, &nak_limit);
140 direction = ((bmReqType & 0x80) > 0);
161 uint16_t left = total;
167 uint16_t read = nbytes;
170 rcode = InTransfer(pep, nak_limit, &read, dataptr);
192 rcode = OutTransfer(pep, nak_limit, nbytes, dataptr);
206 uint8_t
USB::inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t* data, uint8_t bInterval ) {
208 uint16_t nak_limit = 0;
210 uint8_t rcode = SetAddress(addr, ep, &pep, &nak_limit);
213 USBTRACE3(
"(USB::InTransfer) SetAddress Failed ", rcode, 0x81);
214 USBTRACE3(
"(USB::InTransfer) addr requested ", addr, 0x81);
215 USBTRACE3(
"(USB::InTransfer) ep requested ", ep, 0x81);
218 return InTransfer(pep, nak_limit, nbytesptr, data, bInterval);
221 uint8_t USB::InTransfer(
EpInfo *pep, uint16_t nak_limit, uint16_t *nbytesptr, uint8_t* data, uint8_t bInterval ) {
225 uint16_t nbytes = *nbytesptr;
256 if(pktsize > nbytes) {
263 int16_t mem_left = (int16_t)nbytes - *((int16_t*)nbytesptr);
268 data =
bytesRd(
rRCVFIFO, ((pktsize > mem_left) ? mem_left : pktsize), data);
271 *nbytesptr += pktsize;
276 if((pktsize < maxpktsize) || (*nbytesptr >= nbytes))
283 }
else if(bInterval > 0)
295 uint16_t nak_limit = 0;
297 uint8_t rcode = SetAddress(addr, ep, &pep, &nak_limit);
302 return OutTransfer(pep, nak_limit, nbytes, data);
305 uint8_t USB::OutTransfer(
EpInfo *pep, uint16_t nak_limit, uint16_t nbytes, uint8_t *data) {
307 uint8_t *data_p = data;
308 uint16_t bytes_tosend, nak_count;
309 uint16_t bytes_left = nbytes;
313 if(maxpktsize < 1 || maxpktsize > 64)
323 bytes_tosend = (bytes_left >= maxpktsize) ? maxpktsize : bytes_left;
331 while(rcode && ((
long)(millis() - timeout) < 0
L)) {
335 if(nak_limit && (nak_count == nak_limit))
363 bytes_left -= bytes_tosend;
364 data_p += bytes_tosend;
381 uint8_t retry_count = 0;
382 uint16_t nak_count = 0;
384 while((
long)(millis() - timeout) < 0
L) {
388 while((
long)(millis() - timeout) < 0
L)
408 if(nak_limit && (nak_count == nak_limit))
429 static unsigned long delay = 0;
431 bool lowspeed =
false;
462 rcode = devConfig[i]->
Poll();
464 switch(usb_task_state) {
470 rcode = devConfig[i]->
Release();
479 if((
long)(millis() - delay) >= 0
L)
502 delay = millis() + 20;
545 p0->
lowspeed = (lowspeed) ?
true :
false;
548 uint8_t bAddress = addrPool.
AllocAddress(parent,
false, port);
558 p->lowspeed = lowspeed;
561 rcode =
setAddr(0, 0, bAddress);
571 uint8_t USB::AttemptConfig(uint8_t driver, uint8_t parent, uint8_t port,
bool lowspeed) {
576 uint8_t rcode = devConfig[driver]->
ConfigureDevice(parent, port, lowspeed);
586 }
else if(rcode ==
hrJERR && retries < 3) {
593 rcode = devConfig[driver]->
Init(parent, port, lowspeed);
594 if(rcode ==
hrJERR && retries < 3) {
656 uint8_t devConfigIndex;
703 uint16_t vid = udd->idVendor;
704 uint16_t pid = udd->idProduct;
705 uint8_t klass = udd->bDeviceClass;
706 uint8_t subklass = udd->bDeviceSubClass;
713 for(devConfigIndex = 0; devConfigIndex <
USB_NUMDEVICES; devConfigIndex++) {
714 if(!devConfig[devConfigIndex])
continue;
715 if(devConfig[devConfigIndex]->GetAddress())
continue;
716 if(devConfig[devConfigIndex]->DEVSUBCLASSOK(subklass) && (devConfig[devConfigIndex]->VIDPIDOK(vid, pid) || devConfig[devConfigIndex]->DEVCLASSOK(klass))) {
717 rcode = AttemptConfig(devConfigIndex, parent, port, lowspeed);
723 if(devConfigIndex < USB_NUMDEVICES) {
729 for(devConfigIndex = 0; devConfigIndex <
USB_NUMDEVICES; devConfigIndex++) {
730 if(!devConfig[devConfigIndex])
continue;
731 if(devConfig[devConfigIndex]->GetAddress())
continue;
732 if(devConfig[devConfigIndex]->DEVSUBCLASSOK(subklass) && (devConfig[devConfigIndex]->VIDPIDOK(vid, pid) || devConfig[devConfigIndex]->DEVCLASSOK(klass)))
continue;
733 rcode = AttemptConfig(devConfigIndex, parent, port, lowspeed);
756 if(!devConfig[i])
continue;
757 if(devConfig[i]->GetAddress() == addr)
758 return devConfig[i]->
Release();
764 //get device descriptor 767 return (
ctrlReq(addr, ep,
bmREQ_GET_DESCR,
USB_REQUEST_GET_DESCRIPTOR, 0x00,
USB_DESCRIPTOR_DEVICE, 0x0000, nbytes, nbytes, dataptr, NULL));
771 uint8_t
USB::getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t* dataptr) {
772 return (
ctrlReq(addr, ep,
bmREQ_GET_DESCR,
USB_REQUEST_GET_DESCRIPTOR, conf,
USB_DESCRIPTOR_CONFIGURATION, 0x0000, nbytes, nbytes, dataptr, NULL));
778 const uint8_t bufSize = 64;
779 uint8_t buf[bufSize];
791 return (
ctrlReq(addr, ep,
bmREQ_GET_DESCR,
USB_REQUEST_GET_DESCRIPTOR, conf,
USB_DESCRIPTOR_CONFIGURATION, 0x0000, total, bufSize, buf, p));
796 uint8_t
USB::getStrDescr(uint8_t addr, uint8_t ep, uint16_t ns, uint8_t index, uint16_t langid, uint8_t* dataptr) {
797 return (
ctrlReq(addr, ep,
bmREQ_GET_DESCR,
USB_REQUEST_GET_DESCRIPTOR, index,
USB_DESCRIPTOR_STRING, langid, ns, ns, dataptr, NULL));
802 uint8_t rcode =
ctrlReq(oldaddr, ep,
bmREQ_SET,
USB_REQUEST_SET_ADDRESS, newaddr, 0x00, 0x0000, 0x0000, 0x0000, NULL, NULL);
811 return (
ctrlReq(addr, ep,
bmREQ_SET,
USB_REQUEST_SET_CONFIGURATION, conf_value, 0x00, 0x0000, 0x0000, 0x0000, NULL, NULL));
814 #endif // defined(USB_METHODS_INLINE) uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t *dataptr)
#define USB_ERROR_EP_NOT_FOUND_IN_TBL
#define USB_ATTACHED_SUBSTATE_WAIT_RESET
#define USB_ERROR_EPINFO_IS_NULL
EpInfo * getEpInfoEntry(uint8_t addr, uint8_t ep)
#define USB_DESCRIPTOR_STRING
#define USB_ATTACHED_SUBSTATE_SETTLE
uint8_t getVbusState(void)
#define USB_DEV_CONFIG_ERROR_DEVICE_INIT_INCOMPLETE
#define USB_REQUEST_GET_DESCRIPTOR
#define USB_DESCRIPTOR_DEVICE
#define USB_ERROR_INVALID_MAX_PKT_SIZE
uint8_t setConf(uint8_t addr, uint8_t ep, uint8_t conf_value)
#define USB_STATE_DETACHED
uint8_t setEpInfoEntry(uint8_t addr, uint8_t epcount, EpInfo *eprecord_ptr)
virtual uint8_t ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed)
uint8_t ctrlReq(uint8_t addr, uint8_t ep, uint8_t bmReqType, uint8_t bRequest, uint8_t wValLo, uint8_t wValHi, uint16_t wInd, uint16_t total, uint16_t nbytes, uint8_t *dataptr, USBReadParser *p)
#define USB_DESCRIPTOR_CONFIGURATION
virtual UsbDevice * GetUsbDevicePtr(uint8_t addr)=0
uint8_t setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr)
#define USB_STATE_RUNNING
#define USB_NAK_MAX_POWER
virtual UsbDevice * GetUsbDevicePtr(uint8_t addr)
union SETUP_PKT::@33 wVal_u
void setUsbTaskState(uint8_t state)
uint8_t outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *data)
#define USB_ATTACHED_SUBSTATE_RESET_DEVICE
uint8_t * bytesRd(uint8_t reg, uint8_t nbytes, uint8_t *data_p)
virtual void ResetHubPort(uint8_t port)
uint8_t * bytesWr(uint8_t reg, uint8_t nbytes, uint8_t *data_p)
uint8_t getStrDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t index, uint16_t langid, uint8_t *dataptr)
#define USB_REQUEST_SET_ADDRESS
#define USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE
uint8_t getUsbTaskState(void)
#define USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL
#define USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED
#define USB_DETACHED_SUBSTATE_ILLEGAL
#define USB_ATTACHED_SUBSTATE_WAIT_RESET_COMPLETE
void regWr(uint8_t reg, uint8_t data)
uint8_t inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t *data, uint8_t bInterval=0)
#define USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL
#define USB_STATE_CONFIGURING
uint8_t dispatchPkt(uint8_t token, uint8_t ep, uint16_t nak_limit)
virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
uint8_t regRd(uint8_t reg)
AddressPool & GetAddressPool()
#define USB_ERROR_INVALID_ARGUMENT
uint8_t Configuring(uint8_t parent, uint8_t port, bool lowspeed)
union SETUP_PKT::@32 ReqType_u
#define USBTRACE3(s, r, l)
virtual void FreeAddress(uint8_t addr)
virtual uint8_t Release()
virtual uint8_t AllocAddress(uint8_t parent, bool is_hub=false, uint8_t port=0)
#define USB_REQUEST_SET_CONFIGURATION
#define USB_DETACHED_SUBSTATE_WAIT_FOR_DEVICE
uint8_t DefaultAddressing(uint8_t parent, uint8_t port, bool lowspeed)
#define USB_DETACHED_SUBSTATE_INITIALIZE
uint8_t getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr)
defined(USB_METHODS_INLINE)
#define USB_ATTACHED_SUBSTATE_WAIT_SOF
uint8_t ReleaseDevice(uint8_t addr)
#define USB_ERROR_TRANSFER_TIMEOUT
#define USB_ERROR_CONFIG_REQUIRES_ADDITIONAL_RESET