void usb_drv_stall(int endpoint, bool stall, bool in) { if (in) { if (stall) DIEPCTL(endpoint) |= 0x00200000; else DIEPCTL(endpoint) &= ~0x00200000; } else { if (stall) DOEPCTL(endpoint) |= 0x00200000; else DOEPCTL(endpoint) &= ~0x00200000; } }
static void reset_endpoints(void) { unsigned i; int ep; /* disable all endpoints except EP0 */ FOR_EACH_IN_EP_AND_EP0(i, ep) { endpoints[ep][DIR_IN].active = false; endpoints[ep][DIR_IN].busy = false; endpoints[ep][DIR_IN].status = -1; if(endpoints[ep][DIR_IN].wait) wakeup_signal(&endpoints[ep][DIR_IN].complete); endpoints[ep][DIR_IN].wait = false; if(DIEPCTL(ep) & DEPCTL_epena) DIEPCTL(ep) = DEPCTL_snak; else DIEPCTL(ep) = 0; }
static void ep_send(int ep, const void *ptr, int length) { endpoints[ep].busy = true; endpoints[ep].size = length; DIEPCTL(ep) |= 0x8000; /* EPx OUT ACTIVE */ int blocksize = usb_drv_port_speed() ? 512 : 64; int packets = (length + blocksize - 1) / blocksize; if (!length) { DIEPTSIZ(ep) = 1 << 19; /* one empty packet */ DIEPDMA(ep) = NULL; } else { DIEPTSIZ(ep) = length | (packets << 19); DIEPDMA(ep) = ptr; } clean_dcache(); DIEPCTL(ep) |= 0x84000000; /* EPx OUT ENABLE CLEARNAK */ }
int usb_drv_request_endpoint(int type, int dir) { size_t ep; int ret = -1; if (dir == USB_DIR_IN) ep = 1; else ep = 2; while (ep < USB_NUM_ENDPOINTS) { if (!endpoints[ep].active) { endpoints[ep].active = true; ret = ep | dir; uint32_t newbits = (type << 18) | 0x10000000; if (dir) DIEPCTL(ep) = (DIEPCTL(ep) & ~0x000C0000) | newbits; else DOEPCTL(ep) = (DOEPCTL(ep) & ~0x000C0000) | newbits; break; } ep += 2; } return ret; }
bool usb_drv_stalled(int endpoint, bool in) { if (in) return DIEPCTL(endpoint) & 0x00200000 ? true : false; else return DOEPCTL(endpoint) & 0x00200000 ? true : false; }