//  Copyright (C) 2016, mituhiromatuura all right reserved.

#include <kernel.h>
#include "iodefine.h"

#include "dma.h"
#include "exti.h"
#include "gpio.h"
#include "lcd.h"

#define GPIO_CAMERA_ADDR	(uint32_t)(GPIO_PDIR + 4 * CAMERA_PORT)

static
void dma_init(int dma_ch, int irq_ch)
{
	v32_t *dmaca	= (v32_t *)(DMAC_DMACA  + 0x10 * dma_ch);
	v32_t *dmacb	= (v32_t *)(DMAC_DMACB  + 0x10 * dma_ch);
	v32_t *dmacsa	= (v32_t *)(DMAC_DMACSA + 0x10 * dma_ch);
	v32_t *dmacda	= (v32_t *)(DMAC_DMACDA + 0x10 * dma_ch);

	int drqsel_bit = 28 + irq_ch;

	*(v32_t *)DMAC_DMACR	= 0;					//停止
	*(v32_t *)INTREQ_DRQSEL	= 0;					//要求選択レジスタクリア

	*dmaca	= ((0x20 + drqsel_bit) << 23)	//IS:転送要求トリガは外部割込み
			| (0 << 16)						//BC:ブロック数1
			| ((1-1) << 0)					//TC:波形データ配列の要素数
			;

	*dmacb	= (2 << 28)						//MS:Demand転送モード
			| (0 << 26)						//TW:ビット幅8
			| (1 << 25)						//FS:転送元アドレス固定
			| (1 << 24)						//FD:転送先アドレス固定
			| (1 << 23)						//RC:BC・TCリロード許可
			| (1 << 22)						//RS:転送元アドレスリロード許可
			| (1 << 21)						//RD:転送先アドレスリロード許可
			| (0 << 20)						//EI:転送異常終了割り込み禁止
			| (0 << 19)						//CI:転送正常終了割り込み禁止
			| (1 << 0)						//EM:EBビットをクリアしない
			;

	*dmacsa	= GPIO_CAMERA_ADDR;				//転送元アドレス
	*dmacda	= LCD_DAT_REG_ADDR;				//転送先アドレス

	*BITBAND((unsigned int)dmaca, 31) = 1;			//EB:個別チャネル動作許可
	*BITBAND(INTREQ_DRQSEL, drqsel_bit) = 1;		//外部割込みをDMAの起動に使用

	*BITBAND(DMAC_DMACR, 31) = 1;					//DE:全チャネル動作許可
	return;
}

void init_dma(void)
{
	gpio_ade_set(CAMERA_PORT, 0x00, 0);
	gpio_ade_set(CAMERA_PORT, 0x01, 0);
	gpio_ade_set(CAMERA_PORT, 0x02, 0);
	gpio_ade_set(CAMERA_PORT, 0x03, 0);
	gpio_ade_set(CAMERA_PORT, 0x04, 0);
	gpio_ade_set(CAMERA_PORT, 0x05, 0);
	gpio_ade_set(CAMERA_PORT, 0x06, 0);
	gpio_ade_set(CAMERA_PORT, 0x07, 0);

	dma_init(DMA_CH, EXTI_CH);
	return;
}
