static void ep_recv(int ep, void *ptr, int length) { endpoints[ep].busy = true; endpoints[ep].size = length; DOEPCTL(ep) &= ~0x20000; /* EPx UNSTALL */ DOEPCTL(ep) |= 0x8000; /* EPx OUT ACTIVE */ int blocksize = usb_drv_port_speed() ? 512 : 64; int packets = (length + blocksize - 1) / blocksize; if (!length) { DOEPTSIZ(ep) = 1 << 19; /* one empty packet */ DOEPDMA(ep) = NULL; } else { DOEPTSIZ(ep) = length | (packets << 19); DOEPDMA(ep) = ptr; } clean_dcache(); DOEPCTL(ep) |= 0x84000000; /* EPx OUT ENABLE CLEARNAK */ }
static void prepare_setup_ep0(void) { logf("usb-drv: prepare EP0"); /* setup DMA */ DOEPDMA(0) = (unsigned long)AS3525_PHYSICAL_ADDR(&_ep0_setup_pkt); /* Setup EP0 OUT with the following parameters: * packet count = 1 * setup packet count = 1 * transfer size = 8 (setup packet) */ DOEPTSIZ(0) = (1 << DEPTSIZ0_supcnt_bitp) | (1 << DEPTSIZ0_pkcnt_bitp) | 8; /* Enable endpoint, clear nak */ ep0_state = EP0_WAIT_SETUP; DOEPCTL(0) |= DEPCTL_epena | DEPCTL_cnak; }