/* ************************************************************************************************************ * * function * * name : * * parmeters : * * return : * * note : * * ************************************************************************************************************ */ int sunxi_udc_start_recv_by_dma(uint mem_buf, uint length) { uint old_ep_idx; uint fifo; old_ep_idx = USBC_GetActiveEp(sunxi_udc_source.usbc_hd); USBC_SelectActiveEp(sunxi_udc_source.usbc_hd, SUNXI_USB_BULK_OUT_EP_INDEX); //选择当前EP //usb控制器选择dma传输方式 USBC_Dev_ConfigEpDma(sunxi_udc_source.usbc_hd, USBC_EP_TYPE_RX); //选择buffer fifo = USBC_SelectFIFO(sunxi_udc_source.usbc_hd, SUNXI_USB_BULK_OUT_EP_INDEX); //刷掉cache flush_cache(mem_buf, length); //使能dma传输 sunxi_ubuf.request_size = length; sunxi_usb_dbg("dma start\n"); sunxi_dma_start(sunxi_udc_source.dma_recv_channal, fifo, mem_buf, length); //恢复EP USBC_SelectActiveEp(sunxi_udc_source.usbc_hd, old_ep_idx); //恢复原有EP return 0; }
/* ************************************************************************************************************ * * function * * name : * * parmeters : * * return : * * note : * * ************************************************************************************************************ */ int sunxi_udc_start_recv_by_dma(uint mem_buf, uint length) { uint old_ep_idx; usb_dma_trans_unaliged_bytes = length & (sizeof(int) - 1); length &= ~(sizeof(int) - 1); usb_dma_trans_unaligned_buf = (uchar *)mem_buf + length; old_ep_idx = USBC_GetActiveEp(sunxi_udc_source.usbc_hd); USBC_SelectActiveEp(sunxi_udc_source.usbc_hd, SUNXI_USB_BULK_OUT_EP_INDEX); //选择当前EP //usb控制器选择dma传输方式 USBC_Dev_ConfigEpDma(sunxi_udc_source.usbc_hd, USBC_EP_TYPE_RX); //刷掉cache flush_cache(mem_buf, length); //使能dma传输 sunxi_ubuf.request_size = length; sunxi_usb_dbg("dma start 0x%x, length 0x%x\n", mem_buf, length); usb_dma_start(sunxi_udc_source.dma_recv_channal, mem_buf, length); //恢复EP USBC_SelectActiveEp(sunxi_udc_source.usbc_hd, old_ep_idx); //恢复原有EP return 0; }