⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dma_b.c

📁 基于Linux的ffmepg decoder
💻 C
📖 第 1 页 / 共 5 页
字号:
			mDmaSType2b(DMA_DATA_2D) |
			mDmaLType2b(DMA_DATA_SEQUENTAIL) |
			mDmaLen12b(SIZE_V / 4) |
			mDmaID4b(ID_CHN_YUV),
	#else
		// CHNI_RGB + 0
			DONT_CARE,
		// CHNI_RGB + 1
			mDmaLocMemAddr14b(BUFFER_RGB_OFF_0),		// watch-out
		// CHNI_RGB + 2
			mDmaSysWidth6b(RGB_PIXEL_SIZE * PIXEL_Y / 8) |
			mDmaSysOff14b((RGB_PIXEL_SIZE * DEFAULT_STRIDE / 4) + 1 - (RGB_PIXEL_SIZE * PIXEL_Y / 4)) |
			mDmaLocWidth4b(DONT_CARE) |
			mDmaLocOff8b(DONT_CARE),
		// CHNI_RGB + 3
			mDmaIntChainMask1b(TRUE) |
			mDmaEn1b(TRUE) |
			mDmaChainEn1b(TRUE) |
			mDmaDir1b(DMA_DIR_2SYS) |
			mDmaSType2b(DMA_DATA_2D) |
			mDmaLType2b(DMA_DATA_SEQUENTAIL) |
			mDmaLen12b(RGB_PIXEL_SIZE * SIZE_Y / 4) |
			mDmaID4b(ID_CHN_RGB),
	#endif
	///////////////////////////////////////////////////
	// 9
	// CHNI_LOAD_PREDITOR + 0
		DONT_CARE,
	// CHNI_LOAD_PREDITOR + 1
		mDmaLocMemAddr14b(PREDICTOR0_OFF),		// watch-out
	// CHNI_LOAD_PREDITOR + 2
		mDmaSysWidth6b(DONT_CARE) |
		mDmaSysOff14b(DONT_CARE) |
		mDmaLocWidth4b(4) |
		mDmaLocOff8b(8 + 1 - 4),
	// CHNI_LOAD_PREDITOR + 3
		mDmaIntChainMask1b(TRUE) |
		mDmaEn1b(TRUE) |
		mDmaChainEn1b(TRUE) |				// chain to store_preditor
		mDmaDir1b(DMA_DIR_2LOCAL) |
		mDmaSType2b(DMA_DATA_SEQUENTAIL) |
		mDmaLType2b(DMA_DATA_2D) |
		mDmaLen12b(0x10) |
		mDmaID4b(ID_CHN_ACDC),
	////////////////////////////////////////////////////////////////
	// 10
	// CHNI_STORE_PREDITOR + 0
		DONT_CARE,
	// CHNI_STORE_PREDITOR + 1
		mDmaLocMemAddr14b(PREDICTOR8_OFF),
	// CHNI_STORE_PREDITOR + 2
		mDmaSysWidth6b(DONT_CARE) |
		mDmaSysOff14b(DONT_CARE) |
		mDmaLocWidth4b(4) |
		mDmaLocOff8b(8 + 1 - 4),
	// CHNI_STORE_PREDITOR + 3
		mDmaLoc3dOff8b(DONT_CARE) |
		mDmaIntChainMask1b(FALSE) |
		mDmaEn1b(TRUE) |
		mDmaChainEn1b(FALSE) |
		mDmaDir1b(DMA_DIR_2SYS) |
		mDmaSType2b(DMA_DATA_SEQUENTAIL) |
		mDmaLType2b(DMA_DATA_2D) |
		mDmaLen12b(0x10) |
		mDmaID4b(ID_CHN_ACDC)

};
void dma_dec_commandq_init(DECODER * dec)
{
	uint32_t * dma_cmd_tgl0 = (uint32_t *)((uint32_t)dec->pu32BaseAddr + DMA_CMD_OFF_0);
	uint32_t * dma_cmd_tgl1 = (uint32_t *)((uint32_t)dec->pu32BaseAddr + DMA_CMD_OFF_1);
#if 0
	volatile MDMA * ptDma = (MDMA *)((uint32_t)dec->pu32BaseAddr + DMA_OFF);

	// move toggle 0 dma command
	ptDma->GRPC = 0;		// always do
	ptDma->SMaddr = mDmaSysMemAddr29b(u32dma_const0);
	ptDma->LMaddr =
		mDmaLocMemAddr14b(DMA_CMD_OFF_0) |
		mDmaLoc2dWidth4b(8) |
		mDmaLoc2dOff8b(1) |
		mDmaLoc3dWidth4b(2);
	ptDma->BlkWidth = 
		mDmaSysWidth6b(DONT_CARE) |
		mDmaSysOff14b(DONT_CARE) |
		mDmaLocWidth4b(8) |
		mDmaLocOff8b(1);
	ptDma->Control =
		mDmaIntChainMask1b(FALSE) |
		mDmaEn1b(TRUE) |
		mDmaChainEn1b(FALSE) |
		mDmaDir1b(DMA_DIR_2LOCAL) |
		mDmaSType2b(DMA_DATA_SEQUENTAIL) |
		mDmaLType2b(DMA_DATA_2D) |
		mDmaLen12b(sizeof(u32dma_const0)/sizeof(uint32_t)) |
		mDmaID4b(0);
	// wait DMA
	mFa526DrainWrBuf();
	while((ptDma->Status & BIT0) == 0)
		;
	// move toggle 1 dma command
	ptDma->SMaddr = mDmaSysMemAddr29b(u32dma_const1);
	ptDma->LMaddr =
		mDmaLocMemAddr14b(DMA_CMD_OFF_1) |
		mDmaLoc2dWidth4b(8) |
		mDmaLoc2dOff8b(1) |
		mDmaLoc3dWidth4b(2);
	ptDma->Control =
		mDmaIntChainMask1b(FALSE) |
		mDmaEn1b(TRUE) |
		mDmaChainEn1b(FALSE) |
		mDmaDir1b(DMA_DIR_2LOCAL) |
		mDmaSType2b(DMA_DATA_SEQUENTAIL) |
		mDmaLType2b(DMA_DATA_2D) |
		mDmaLen12b(sizeof(u32dma_const1)/sizeof(uint32_t)) |
		mDmaID4b(0);
	// wait DMA
	mFa526DrainWrBuf();
	while((ptDma->Status & BIT0) == 0)
		;
#else
	memcpy (dma_cmd_tgl0, u32dma_const0, sizeof (u32dma_const0));
	memcpy (dma_cmd_tgl1, u32dma_const1, sizeof (u32dma_const1));
#endif
	#if (OUTPUT_FMT == OUTPUT_FMT_YUV)
		dma_cmd_tgl0[CHNP_YUV_Y + 2] =
		dma_cmd_tgl0[CHNI_YUV_Y + 2] =
		dma_cmd_tgl1[CHNP_YUV_Y + 2] =
		dma_cmd_tgl1[CHNI_YUV_Y + 2] =
			mDmaSysWidth6b(PIXEL_Y / 8) |
			mDmaSysOff14b((dec->output_stride / 4) + 1 - (PIXEL_Y / 4)) |
			mDmaLocWidth4b(DONT_CARE) |
			mDmaLocOff8b(DONT_CARE);
		dma_cmd_tgl0[CHNP_YUV_U + 2] =
		dma_cmd_tgl0[CHNP_YUV_V + 2] =
		dma_cmd_tgl0[CHNI_YUV_U + 2] =
		dma_cmd_tgl0[CHNI_YUV_V + 2] =
		dma_cmd_tgl1[CHNP_YUV_U + 2] =
		dma_cmd_tgl1[CHNP_YUV_V + 2] =
		dma_cmd_tgl1[CHNI_YUV_U + 2] =
		dma_cmd_tgl1[CHNI_YUV_V + 2] =
			mDmaSysWidth6b(PIXEL_U / 8) |
			mDmaSysOff14b(((dec->output_stride /2) / 4) + 1 - (PIXEL_U / 4)) |
			mDmaLocWidth4b(DONT_CARE) |
			mDmaLocOff8b(DONT_CARE);
	
	#else
		dma_cmd_tgl0[CHNP_RGB + 2] =
		dma_cmd_tgl0[CHNI_RGB + 2] =
		dma_cmd_tgl1[CHNP_RGB + 2] =
		dma_cmd_tgl1[CHNI_RGB + 2] =
			mDmaSysWidth6b(RGB_PIXEL_SIZE * PIXEL_Y / 8) |
			mDmaSysOff14b((RGB_PIXEL_SIZE * dec->output_stride / 4) + 1 - (RGB_PIXEL_SIZE * PIXEL_Y / 4)) |
			mDmaLocWidth4b(DONT_CARE) |
			mDmaLocOff8b(DONT_CARE);
	#endif

	dma_cmd_tgl0[CHNP_REF_4MV_Y0 + 2] = 
	dma_cmd_tgl0[CHNP_REF_4MV_Y1 + 2] = 
	dma_cmd_tgl0[CHNP_REF_4MV_Y2 + 2] = 
	dma_cmd_tgl0[CHNP_REF_4MV_Y3 + 2] = 
	dma_cmd_tgl1[CHNP_REF_4MV_Y0 + 2] = 
	dma_cmd_tgl1[CHNP_REF_4MV_Y1 + 2] = 
	dma_cmd_tgl1[CHNP_REF_4MV_Y2 + 2] = 
	dma_cmd_tgl1[CHNP_REF_4MV_Y3 + 2] = 
		mDmaSysWidth6b(2 * SIZE_U / 8) |
		mDmaSysOff14b((dec->mb_width * 2 * SIZE_U / 4) + 1 - (2 * SIZE_U / 4)) |
		mDmaLocWidth4b(PIXEL_U / 4) |
		mDmaLocOff8b((8 * PIXEL_U / 4) + 1 - (PIXEL_U / 4));
	dma_cmd_tgl0[CHNP_REF_1MV_Y + 2] =
	dma_cmd_tgl1[CHNP_REF_1MV_Y + 2] =
		mDmaSysWidth6b(3 * SIZE_U / 8) |
		mDmaSysOff14b((dec->mb_width * 2 * SIZE_U / 4) + 1 - (3 * SIZE_U / 4)) |
		mDmaLocWidth4b(PIXEL_U / 4) |
		mDmaLocOff8b(((8 * PIXEL_U) / 4) + 1 - (PIXEL_U / 4));
	dma_cmd_tgl0[CHNP_REF_4MV_U + 2] = 
	dma_cmd_tgl0[CHNP_REF_4MV_V + 2] = 
	dma_cmd_tgl0[CHNP_REF_1MV_U + 2] = 
	dma_cmd_tgl0[CHNP_REF_1MV_V + 2] = 
	dma_cmd_tgl1[CHNP_REF_4MV_U + 2] = 
	dma_cmd_tgl1[CHNP_REF_4MV_V + 2] = 
	dma_cmd_tgl1[CHNP_REF_1MV_U + 2] = 
	dma_cmd_tgl1[CHNP_REF_1MV_V + 2] = 
		mDmaSysWidth6b(2 * SIZE_U / 8) |
		mDmaSysOff14b((dec->mb_width * SIZE_U / 4) + 1 - (2 * SIZE_U / 4)) |
		mDmaLocWidth4b(PIXEL_U / 4) |
		mDmaLocOff8b(((8 * PIXEL_U) / 4) + 1 - (PIXEL_U / 4));

	dma_cmd_tgl0[CHNP_IMG_Y + 2] =
	dma_cmd_tgl0[CHNI_IMG_Y + 2] =
	dma_cmd_tgl1[CHNP_IMG_Y + 2] =
	dma_cmd_tgl1[CHNI_IMG_Y + 2] =
		mDmaSysWidth6b(2 * SIZE_U / 8) |
		mDmaSysOff14b((dec->mb_width * 2 * SIZE_U / 4) + 1 - (2 * SIZE_U / 4)) |
		mDmaLocWidth4b(PIXEL_U / 4) |
		mDmaLocOff8b((2 * PIXEL_U / 4) + 1 - (PIXEL_U / 4));
}
#else
void dma_dec_commandq_init(DECODER * dec)
{
	uint32_t * dma_cmd_tgl0 = (uint32_t *)((uint32_t)dec->pu32BaseAddr + DMA_CMD_OFF_0);
	uint32_t * dma_cmd_tgl1 = (uint32_t *)((uint32_t)dec->pu32BaseAddr + DMA_CMD_OFF_1);
	///////////////////////////////////////////////////
	// i-frame
	// vld->toggle			vld(load)	dmc	img(yuv)	rgb
	//		0			1			0		1
	//		1			0			1		0
	//		...
	///////////////////////////////////////////////////
	// Toggle 0
	///////////////////////////////////////////////////
	dma_cmd_tgl0[CHNI_IMG_Y + 1] =
		mDmaLoc2dWidth4b(8) |								// 8 lines/block
		mDmaLoc2dOff8b(1 - (PIXEL_U - 1) * (2 * PIXEL_U) / 4) |	// jump to next block
		mDmaLoc3dWidth4b(2) |								// 2 block/row
		mDmaLocMemAddr14b(INTER_Y_OFF_0);
		mDmaLocInc2b(DMA_INCL_0);
	dma_cmd_tgl0[CHNI_IMG_Y + 2] =
		mDmaSysWidth6b(2 * SIZE_U / 8) |
		mDmaSysOff14b((dec->mb_width * 2 * SIZE_U / 4) + 1 - (2 * SIZE_U / 4)) |
		mDmaLocWidth4b(PIXEL_U / 4) |
		mDmaLocOff8b((2 * PIXEL_U / 4) + 1 - (PIXEL_U / 4));
	dma_cmd_tgl0[CHNI_IMG_Y + 3] =
		mDmaLoc3dOff8b(1) |						// jump to next row
		mDmaIntChainMask1b(TRUE) |
		mDmaEn1b(TRUE) |
		mDmaChainEn1b(TRUE) |
		mDmaDir1b(DMA_DIR_2SYS) |
		mDmaSType2b(DMA_DATA_2D) |
		mDmaLType2b(DMA_DATA_4D) |
		mDmaLen12b(4 * SIZE_U / 4) |
		mDmaID4b(ID_CHN_IMG);
	dma_cmd_tgl0[CHNI_IMG_U + 1] = mDmaLocMemAddr14b(INTER_U_OFF_0);
	// dont care block width
	dma_cmd_tgl0[CHNI_IMG_U + 3] =
		mDmaLoc3dOff8b(DONT_CARE) |
		mDmaIntChainMask1b(TRUE) |
		mDmaEn1b(TRUE) |
		mDmaChainEn1b(TRUE) |
		mDmaDir1b(DMA_DIR_2SYS) |
		mDmaSType2b(DMA_DATA_SEQUENTAIL) |
		mDmaLType2b(DMA_DATA_SEQUENTAIL) |
		mDmaLen12b(SIZE_U / 4) |
		mDmaID4b(ID_CHN_IMG);
	dma_cmd_tgl0[CHNI_IMG_V + 1] = mDmaLocMemAddr14b(INTER_V_OFF_0);
	// dont care block width
	dma_cmd_tgl0[CHNI_IMG_V + 3] =
		mDmaLoc3dOff8b(DONT_CARE) |
		mDmaIntChainMask1b(TRUE) |
		mDmaEn1b(TRUE) |
		mDmaChainEn1b(TRUE) |
		mDmaDir1b(DMA_DIR_2SYS) |
		mDmaSType2b(DMA_DATA_SEQUENTAIL) |
		mDmaLType2b(DMA_DATA_SEQUENTAIL) |
		mDmaLen12b(SIZE_V / 4) |
		mDmaID4b(ID_CHN_IMG);
	///////////////////////////////////////////////////
	#if (OUTPUT_FMT == OUTPUT_FMT_YUV)
		dma_cmd_tgl0[CHNI_YUV_Y + 1] =
			mDmaLoc2dWidth4b(16) |				// 16 lines/MB
			mDmaLoc2dOff8b(DONT_CARE) |
			mDmaLoc3dWidth4b(DONT_CARE) |			// 2 block/row
			mDmaLocMemAddr14b(INTER_Y_OFF_0);
			mDmaLocInc2b(DMA_INCL_0);
		dma_cmd_tgl0[CHNI_YUV_Y + 2] =
			mDmaSysWidth6b(PIXEL_Y / 8) |
			mDmaSysOff14b((dec->output_stride / 4) + 1 - (PIXEL_Y / 4)) |
			mDmaLocWidth4b(DONT_CARE) |
			mDmaLocOff8b(DONT_CARE);
		dma_cmd_tgl0[CHNI_YUV_Y + 3] =
			mDmaLoc3dOff8b(DONT_CARE) |
			mDmaIntChainMask1b(TRUE) |
			mDmaEn1b(TRUE) |
			mDmaChainEn1b(TRUE) |
			mDmaDir1b(DMA_DIR_2SYS) |
			mDmaSType2b(DMA_DATA_2D) |
			mDmaLType2b(DMA_DATA_SEQUENTAIL) |
			mDmaLen12b(SIZE_Y / 4) |
			mDmaID4b(ID_CHN_YUV);
		dma_cmd_tgl0[CHNI_YUV_U + 1] = mDmaLocMemAddr14b(INTER_U_OFF_0);
		dma_cmd_tgl0[CHNI_YUV_U + 2] =
			mDmaSysWidth6b(PIXEL_U / 8) |
			mDmaSysOff14b(((dec->output_stride / 2) / 4) + 1 - (PIXEL_U / 4)) |
			mDmaLocWidth4b(DONT_CARE) |
			mDmaLocOff8b(DONT_CARE);
		dma_cmd_tgl0[CHNI_YUV_U + 3] =
			mDmaLoc3dOff8b(DONT_CARE) |
			mDmaIntChainMask1b(TRUE) |
			mDmaEn1b(TRUE) |
			mDmaChainEn1b(TRUE) |
			mDmaDir1b(DMA_DIR_2SYS) |
			mDmaSType2b(DMA_DATA_2D) |
			mDmaLType2b(DMA_DATA_SEQUENTAIL) |
			mDmaLen12b(SIZE_U / 4) |
			mDmaID4b(ID_CHN_YUV);
		dma_cmd_tgl0[CHNI_YUV_V + 1] = mDmaLocMemAddr14b(INTER_V_OFF_0);
		dma_cmd_tgl0[CHNI_YUV_V + 2] =
			mDmaSysWidth6b(PIXEL_V / 8) |
			mDmaSysOff14b(((dec->output_stride / 2) / 4) + 1 - (PIXEL_V / 4)) |
			mDmaLocWidth4b(DONT_CARE) |
			mDmaLocOff8b(DONT_CARE);
		dma_cmd_tgl0[CHNI_YUV_V + 3] =
			mDmaLoc3dOff8b(DONT_CARE) |
			mDmaIntChainMask1b(TRUE) |
			mDmaEn1b(TRUE) |
			mDmaChainEn1b(TRUE) |
			mDmaDir1b(DMA_DIR_2SYS) |
			mDmaSType2b(DMA_DATA_2D) |
			mDmaLType2b(DMA_DATA_SEQUENTAIL) |
			mDmaLen12b(SIZE_V / 4) |
			mDmaID4b(ID_CHN_YUV);
	#else
		dma_cmd_tgl0[CHNI_RGB + 1] = mDmaLocMemAddr14b(BUFFER_RGB_OFF_1);		// watch-out
		dma_cmd_tgl0[CHNI_RGB + 2] =
			mDmaSysWidth6b(RGB_PIXEL_SIZE * PIXEL_Y / 8) |
			mDmaSysOff14b((RGB_PIXEL_SIZE * dec->output_stride / 4) + 1 - (RGB_PIXEL_SIZE * PIXEL_Y / 4)) |
			mDmaLocWidth4b(DONT_CARE) |
			mDmaLocOff8b(DONT_CARE);
		dma_cmd_tgl0[CHNI_RGB + 3] =
			mDmaIntChainMask1b(TRUE) |
			mDmaEn1b(TRUE) |
			mDmaChainEn1b(TRUE) |
			mDmaDir1b(DMA_DIR_2SYS) |
			mDmaSType2b(DMA_DATA_2D) |
			mDmaLType2b(DMA_DATA_SEQUENTAIL) |
			mDmaLen12b(RGB_PIXEL_SIZE * SIZE_Y / 4) |
			mDmaID4b(ID_CHN_RGB);
	#endif
	///////////////////////////////////////////////////
	dma_cmd_tgl0[CHNI_LOAD_PREDITOR + 1] = mDmaLocMemAddr14b(PREDICTOR4_OFF);		// watch-out
	dma_cmd_tgl0[CHNI_LOAD_PREDITOR + 2] = 
		mDmaSysWidth6b(DONT_CARE) |
		mDmaSysOff14b(DONT_CARE) |
		mDmaLocWidth4b(4) |
		mDmaLocOff8b(8 + 1 - 4);
	dma_cmd_tgl0[CHNI_LOAD_PREDITOR + 3] = 
		mDmaIntChainMask1b(TRUE) |
		mDmaEn1b(TRUE) |
		mDmaChainEn1b(TRUE) |				// chain to store_preditor
		mDmaDir1b(DMA_DIR_2LOCAL) |
		mDmaSType2b(DMA_DATA_SEQUENTAIL) |
		mDmaLType2b(DMA_DATA_2D) |
		mDmaLen12b(0x10) |
		mDmaID4b(ID_CHN_ACDC);
	////////////////////////////////////////////////////////////////
	dma_cmd_tgl0[CHNI_STORE_PREDITOR + 1] = mDmaLocMemAddr14b(PREDICTOR8_OFF);
	dma_cmd_tgl0[CHNI_STORE_PREDITOR + 2] =
		mDmaSysWidth6b(DONT_CARE) |
		mDmaSysOff14b(DONT_CARE) |
		mDmaLocWidth4b(4) |
		mDmaLocOff8b(8 + 1 - 4);
	dma_cmd_tgl0[CHNI_STORE_PREDITOR + 3] =
		mDmaLoc3dOff8b(DONT_CARE) |
		mDmaIntChainMask1b(FALSE) |
		mDmaEn1b(TRUE) |
		mDmaChainEn1b(FALSE) |
		mDmaDir1b(DMA_DIR_2SYS) |
		mDmaSType2b(DMA_DATA_SEQUENTAIL) |
		mDmaLType2b(DMA_DATA_2D) |
		mDmaLen12b(0x10) |
		mDmaID4b(ID_CHN_ACDC);
	///////////////////////////////////////////////////
	// i-frame
	// vld->toggle			vld(load)	dmc	img(yuv)	rgb
	//		0			1			0		1
	//		1			0			1		0
	//		...
	///////////////////////////////////////////////////
	// Toggle 1
	///////////////////////////////////////////////////
	dma_cmd_tgl1[CHNI_IMG_Y + 1] =
		mDmaLoc2dWidth4b(8) |								// 8 lines/block
		mDmaLoc2dOff8b(1 - (PIXEL_U - 1) * (2 * PIXEL_U) / 4) |	// jump to next block
		mDmaLoc3dWidth4b(2) |								// 2 block/row
		mDmaLocMemAddr14b(INTER_Y_OFF_1) |
		mDmaLocInc2b(DMA_INCL_0);
	dma_cmd_tgl1[CHNI_IMG_Y + 2] =
		mDmaSysWidth6b(2 * SIZE_U / 8) |
		mDmaSysOff14b((dec->mb_width * 2 * SIZE_U / 4) + 1 - (2 * SIZE_U / 4)) |
		mDmaLocWidth4b(PIXEL_U / 4) |
		mDmaLocOff8b((2 * PIXEL_U / 4) + 1 - (PIXEL_U / 4));
	dma_cmd_tgl1[CHNI_IMG_Y + 3] =
		mDmaLoc3dOff8b(1) |						// jump to next row
		mDmaIntChainMask1b(TRUE) |
		mDmaEn1b(TRUE) |
		mDmaChainEn1b(TRUE) |
		mDmaDir1b(DMA_DIR_2SYS) |
		mDmaSType2b(DMA_DATA_2D) |

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -