/* ************************************************************************************************************ * * function * * name : * * parmeters : * * return : * * note : * * ************************************************************************************************************ */ int sunxi_codec_wink(void *buffer, uint length) { #if 0 if(!hdma) { printf("sunxi codec error : cant stop without dma\n"); return -1; } sunxi_dma_stop(hdma); flush_cache((uint)buffer, length); sunxi_dma_start(hdma, (uint)buffer, (uint)(&sunxi_codec->dac_txdata), length); #endif return 0; }
int emacrx_dma_inblk(dma_addr_t buff_addr, __u32 len) { int ret; #if defined CONFIG_ARCH_SUN4I || defined CONFIG_ARCH_SUN5I struct dma_hw_conf emac_hwconf = { .xfer_type = DMAXFER_D_SWORD_S_SWORD, .hf_irq = SW_DMA_IRQ_FULL, .cmbk = 0x03030303, .dir = SW_DMA_RDEV, .from = emacrx_dma.dma_addr, .address_type = DMAADDRT_D_LN_S_IO, .drqsrc_type = DRQ_TYPE_EMAC }; ret = sw_dma_setflags(emacrx_dma.channel, SW_DMAF_AUTOSTART); if (ret != 0) return ret; #else dma_config_t emac_hwconf = { .xfer_type = { .src_data_width = DATA_WIDTH_32BIT, .src_bst_len = DATA_BRST_4, .dst_data_width = DATA_WIDTH_32BIT, .dst_bst_len = DATA_BRST_4 }, .address_type = { .src_addr_mode = DDMA_ADDR_IO, .dst_addr_mode = DDMA_ADDR_LINEAR }, .bconti_mode = false, .src_drq_type = D_SRC_EMAC_RX, .dst_drq_type = D_DST_SRAM, .irq_spt = CHAN_IRQ_FD }; #endif ret = sunxi_dma_config(&emacrx_dma, &emac_hwconf, 0x03030303); if (ret != 0) return ret; ret = sunxi_dma_enqueue(&emacrx_dma, buff_addr, len, 1); if (ret != 0) return ret; ret = sunxi_dma_start(&emacrx_dma); if (ret != 0) return ret; return 0; }
/* ************************************************************************************************************ * * 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_codec_start(void *buffer, uint length, uint loop_mode) { #if 0 sunxi_dma_setting_t dma_cfg; if(!hdma) { hdma = sunxi_dma_request(0); if(!hdma) { printf("sunxi codec error : request dma failed\n"); return -1; } } dma_cfg.cfg.src_drq_type = DMAC_CFG_DEST_TYPE_DRAM; dma_cfg.cfg.src_addr_mode = 0; //源端地址线性递增 dma_cfg.cfg.src_burst_length = 0; //burst = 1 dma_cfg.cfg.src_data_width = 1; //一次传输16bit dma_cfg.cfg.dst_drq_type = DMAC_CFG_SRC_TYPE_CODEC; dma_cfg.cfg.dst_addr_mode = 1; //目的端地址不变 dma_cfg.cfg.dst_burst_length = 0; //burst = 1 dma_cfg.cfg.dst_data_width = 1; //一次接收16bit dma_cfg.loop_mode = loop_mode; dma_cfg.wait_cyc = 4; dma_cfg.data_block_size = 1 * 16/8; dma_cfg.loop_mode = loop_mode; sunxi_dma_setting(hdma, &dma_cfg); flush_cache((uint)buffer, length); sunxi_dma_start(hdma, (uint)buffer, (uint)(&sunxi_codec->dac_txdata), length); #endif return 0; }