Exemplo n.º 1
0
/*
************************************************************************************************************
*
*                                             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;
}
Exemplo n.º 3
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;
}
Exemplo n.º 4
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;
}