/************************************************************************/
/* CQBBEL GNU CC Common Control Software / (C) Toshio MURAI 2011, 2012	*/
/*      This is Free Software;   You can redistribute this software     */
/*      and/or modify it under the terms of the GNU General Public      */
/*      License version 3, or (at your option) any later version.       */
/************************************************************************/

#include	"io.h"

#define	SETCPU()	\
	{	\
	/* ウォッチドッグタイマディセーブル */	\
	WDT->LCK = 0x1ACCE551;	/* ロック解除1 */	\
	WDT->LCK = 0xE5331AAE;	/* ロック解除2 */	\
	WDT->CTL = 0x00000000;	/* ディセーブル */	\
	}

/*	On Board LED 	1 bit  P1.18 (L.on)	*/
#define	SETBOARDLED()	\
	{	\
	/* LED点灯初期化 */	\
	GPIOPFR->RF  &= ~0x0008;	/* PFx:GPIO選択 */	\
	GPIODDR->RF  |= 0x0008;	/* PF3:出力方向 */		\
	GPIOPDOR->RF |= 0x0008;	/* PF3:"H"レベル出力 */	\
	GPIOPZR->RF  |= 0x0008;	/* 擬似HiZ機能 ON */	\
	}

#define	REVERSELED()	\
	{	\
		GPIOPDOR->RF ^= 0x0008;	\
	}

/*	8bit Dip Switch 8bit	J2:1-8 (A0-A7)= P4.0-P4.7	*/
#define	SETDIPSWITCH()	\
	{	\
	GPIOADE->ADE   &= 0xFFFFF00F;	/* A-D入力チャネル11(P1B)〜4(P14):ディセーブル */	\
	GPIOPFR->R1  &= 0x00000FF0;	/* P1B〜P14:GPIOを選択 */	\
	GPIODDR->R1  &= 0xF00F;		/* P1B〜P14:入力方向 */	\
	}

#define	GETDIPSWITCH()		 ((~(GPIOPDIR->R1 >> 4)) & 0xFF)

/*	7seg LED 15bit Hight/Low	J2:23-38 (D0-D15) P3.0-P3.7 P2.0-P2.7	*/
#define	SET7SEGLED()	\
	{	\
		GPIOPFR->R4  &= 0xFFFF83FF;	/* P4E〜P4A:GPIOを選択 */	\
		GPIOPFR->R7  &= 0xFFFFF800;	/* P7A〜P70:GPIOを選択 */	\
		GPIOPDOR->R4 |= 0x7C00;		/* P4E〜P4A:"H"レベル出力 */	\
		GPIOPDOR->R7 |= 0x07FF;		/* P7A〜P70:"H"レベル出力 */	\
		GPIODDR->R4  |= 0x7C00;		/* P4E〜P4A:出力方向 */	\
		GPIODDR->R7  |= 0x07FF;		/* P7A〜P70:出力方向 */	\
	}

#define	PUT7SEGHIGH(val)	\
	{	\
		/* ビット7:P7A 〜 ビット0:P73 (負論理) */	\
		GPIOPDOR->R7 = (GPIOPDOR->R7 & 0xF807) | ((val & 0xFF) <<  3);\
	}

#define	PUT7SEGLOW(val)		\
	{	\
	/* ビット7:P72 〜 ビット5:P70 (負論理) */	\
	GPIOPDOR->R7 = (GPIOPDOR->R7 & 0xFFF8) | ((val & 0xE0) >>  5);	\
	/* ビット4:P4E 〜 ビット0:P4A (負論理) */	\
	GPIOPDOR->R4 = (GPIOPDOR->R4 & 0x83FF) | ((val & 0x1F) << 10);	\
\
	}

#define	GET7SEGHIGH()		((GPIOPDOR->R7 >>3) & 0xFF)

#define	GET7SEGLOW()		(((GPIOPDOR->R4 >>10) &0x1F) | ((GPIOPDOR->R7 <<5) &0xE0) )

#define	SETIRQ()	\
	{	\
	GPIOEPFR->R6 = 0x000000;	\
	GPIOPFR->R7  |= 0x00002000;	\
	GPIOPFR->RF  |= 0x00000007;	\
	GPIOPZR->RF  |= 0x0007;	\
	EXTI->ENIR = 0x00000000L;	/*All inhibit the interupt	0x0000F000*/	\
	do {	\
		EXTI->ELVR=0xAF000000L;/*AF	10 10 11 11 (AF)		3-2(Rise) 1-0(Fall)*/	\
	} while(EXTI->ELVR != 0xAF000000L);	\
	EXTI->EICL = 0x00000000L;	\
	EXTI->ENIR = 0x0000F000L;/*0x0000F000;	I12-15 Enable inhibit the interupt*/	\
	/*	NVIC enable	*/	\
	IRQENABLE->IRQ0_31 = 0x000000020L;	\
	}


#define	CLEARIRQ0()	{do{EXTI->EICL &= ~0x00001000;}while(EXTI->EIRR & 0x00001000);}
#define	CLEARIRQ1()	{do{EXTI->EICL &= ~0x00002000;}while(EXTI->EIRR & 0x00002000);}
#define	CLEARIRQ2()	{do{EXTI->EICL &= ~0x00004000;}while(EXTI->EIRR & 0x00004000);}
#define	CLEARIRQ3()	{do{EXTI->EICL &= ~0x00008000;}while(EXTI->EIRR & 0x00008000);}

/*	Timer 1 msec interrupt	*/
#define	SETTIMER()	\
	{	\
  /*SysTick_LOAD  = 4000000L;//10秒？*/	\
		SYSTICK->LOAD  = 500L;/*4MHz/8=500,000Hz 400の方が近い？ */	\
		SYSTICK->CTRL  = 0x00000002; /* set clock source and Interrupt enable*/	\
		SYSTICK->VAL   =  0; /* clear  the counte	*/	\
		SYSTICK->CTRL |= 0x1; /* enable the counter*/	\
	}
	
#define	CLEARTIMERINTERRUPT()	\
	{	\
	}

/*	AD Converter	J1:1(AN0) P0.23 */
#define	PCAD	0x00001000
#define	SETAD()	\
	{	\
	/*	AN16=PB0	AN17=PB1 18 19 20 21 22 23=PB7  */	\
	GPIOADE->ADE   |= 0x00FF0000;	/* A-D入力チャネル16-23(PB0-7)ADC  */	\
	ADCU0->SCIS32=0x0001;	/*(0x01 = AN16のみ使う 0x00FF 16-23まで使う）*/	\
	ADCU0->ADSS32 = 0x00;	/*AD16-31まで　　ADSTの0側を使う*/\
	ADCU0->ADSR |= 0x40;	/*FDAS　　　LSB設定　　　・FIFOデータ配置設定(ADSR:FDAS="1"書込み)*/\
	ADCU0->ADCR &= 0xF0;	/*割り込み禁止/スキャン変換割込/優先変換割込/変換結果比較割込/FIFO オーバラン割込*/\
		/*・割込み未使用(ADCR:SCIE="0"書込み)*/\
	ADCU0->SFNS= 0x00;	/*FIFO Clear Singel Convert Mode(SCCR：SFCLR=0b1,RPT=0b0)  SFNS FIFO= 0x00;*/\
	ADCU0->SCCR= 0x10;	/*上位は、SFCCLR, SSTRが設定設定されている。*/\
		/*ADCU0->ADCEN |= 0x01;//(Enable)   0x02(Ready)	5.16. A/D 動作許可設定レジスタ(ADCEN)*/\
	do { ADCU0->ADCEN |= 0x01;} while(ADCU0->ADCEN & 0x02);	\
	}

#define	STARTAD0()	\
	{	\
	ADCU0->SCCR= 0x11;		/* Start	SCCR:SSRT*/		\
	/*while(!(ADCU0->SCFD &0x00001000)); Data Valid SCFD:INVL="0"	NG 	*/\
	/*	while(!(ADCU0->ADCR &0x00080)); Scan Interrupt Request Bit NG	*/\
	while(ADCU0->ADSR &0x00001); /*スキャン変換ステータスフラグ*/\
	}

#define	GETAD0()	(((ADCU0->SCFD >>(16+4)) &0xFF)); 	
		
/*	RS232C/UART	*/
#define	SETUART()	\
	{	\
	}

#define	PUTCHAR(data)	\
	{	\
	}

#define	WAITUART()	\
	{	\
	}

#define GETCHAR()	(0)

#define	CLEARSENDFLAG()	{}

#define	CLEARRECFLAG()	{}

/*	Interrupt Handler	*/
#define	ENABLEINTERRUPT()	\
	{	\
	}

#define	DISABLEINTERRUPT()	\
	{	\
	}

#define	DUMMYINTERRUPT()	\
	{	\
	}

#define	INTERRUPTATTRIBUTE	
#define	ARMINTERRUPTATTRIBUTE	

#define	TIMEINTR()	(0)	
#define	IRQ0INTR()	(EXTI->EIRR & 0x00001000)
#define	IRQ1INTR()	(EXTI->EIRR & 0x00002000)
#define	IRQ2INTR()	(EXTI->EIRR & 0x00004000)
#define	IRQ3INTR()	(EXTI->EIRR & 0x00008000)
