/*******************************************************************************
版权所有：	
文件名称：	bspconfig.h
文件版本：	01.01
创建作者:	sunxi
创建日期：	2012-05-10
功能说明：	冷火实时LINUX的配置文件。
其它说明：
修改记录：
*/

#ifndef _BSPCONFIG_H_
#define	_BSPCONFIG_H_

#include "rt.h"
#include "MCF54418.h"
#include "gpio_def.h"
#include "build_info.h"
#include "defineSys.h"
//----------------------------- BSP版本  ---------------------------
// #define BSP_FTU					1	// 单回路配电终端，f308
//#define BSP_DTU2					2	// DTU2.0 f306
//#define BSP_DTU3					3	// DTU3.0
  #define BSP_DFTU					4	// DTU、FTU混合版本；支持4回路二遥标准型DTU、单回路FTU；支持电磁式、电子式互感器。
#define BSP_VERSION					BSP_DFTU

#define  __DFTU_V4_HV0102__         1 // sunxi 20180724 第二版


//BSP类型.如果是FTU,打开宏BSP_TYPE_FTU。如果是DTU，打开宏BSP_TYPE_DTU。两者只能选其一，不能同时打开。
#define BSP_TYPE_FTU
//#define BSP_TYPE_DTU

//#define VER_NUM			 		0x00010205          	// 版本号
//#define VER_TIME                "2019-02-09 13:12:26"  // 程序生成时间

#define PROTECT_AC_ADJUST		 //保护电流校准

#define EQUIP_NAME_STRING		"FS-DFTU"           	// 装置名称
#define EQUIP_TYPE_STRING		"FS-DFTU"           	// 装置类型
#define KO_FILE_NAME			"/app/dtu_t536"
#define KO_FILE_NAME_1			"dtu_t536"


//----------------------------- 设备架构  ---------------------------
#define EQU_SLOT_NUM_MAX		3
#define EQU_SLOT_MAIN			0	// 主板
#define EQU_SLOT_KZ				1	// 控制板
#define EQU_SLOT_HMI			2	// 面板

#define EQU_SLOT_AC_BEGIN		1	// 采样板起始槽位
#define EQU_SLOT_AC_NUM			1	// 一个装置支持AC板的最大槽数。
#define EQU_SLOT_AC_CHN			16   // 每个槽中支持的最大AC通道数
#define EQU_DB_YX_NUM			32	// 数据总线长度


//----------------------------- 线路开关  ---------------------------
#define SWITCH_NUM_MAX			6  // 开关数量，本装置实际支持的开关数，不包含级联部分。
#define SWITCH_NUM_EXT			31 // 扩展开关数量，后面部分供级联用。
#define SWITCH_NUM_EXT_PUB		32 // 扩展开关数量加公共部分，后面部分供级联用。此值不能超过32


//----------------------------- 设备级联  ---------------------------
#ifdef FUN_NETWORK_ADD40
	#define CFG_LINK_104_NUM		48	// 104级联数目
#else
	#define CFG_LINK_104_NUM		8	// 104级联数目
#endif
#define CFG_LINK_101_NUM		6	// 101级联数目
#define CFG_LONK_EQU_SOE_NUM	10	// 级联装置保存SOE数量



//----------------------------- CPU主时钟  ---------------------------
#define	CFG_EXT_OSC_CLK	50000000	//外部晶体频率
#define CFG_CPU_CLK		250000000	//CPU时钟根据外部晶体频率和系统配置算出来

#define CFG_VECTOR_ADDRESS  0x40000000


//----------------------------- 中断级别  ---------------------------
//MCF54418用3bits表示中断级别(LEVEL),其中0表示不产生中断，7表示不可屏蔽中断。
//数字越大，中断优先级越高。由于我们将来有可能在一颗CPU上同时运行保护和人机功能，
//所以我们将中断分为两个部分:实时(保护)和非实时(人机)。中断级别1～3分配给非实时部分，
//4～6分配给实时部分。在原Linux中关中断时只屏蔽中断1～3，不屏蔽4～6。

//MCF54418有三个中断控制器INTC0、INTC1、INTC2,每个中断控制器有64个中断源。在设置为相同
//中断级别的情况下，INTC0的优先级最高，INTC2最低；在相同的中断控制器中，数值大的优先级高，
//数值小的优先级低: 63最高，0最低。
//NET1:			INTC0(49~61)
//NET0:			INTC0(36~48)
//DTM(0~3):		INTC0(32~35)
//UART(0~3):	INTC0(26~29)
//DMA			INTC0(8~24)
//EPORT			INTC0(1~7)
//UART(4~9):	INTC1(48~53)
//CAN1:			INTC1(04~07)
//CAN0:			INTC1(00~03)
//PIT(0~3):		INTC2(13~16)


//实时
#define CFG_INT_LEVEL_DMA			6	// 采样DMA中断
#define CFG_INT_LEVEL_PIT			6	// PIT3,156US
#define CFG_INT_LEVEL_CLOCK			5	// GPS对时，ms定时器
#define CFG_INT_LEVEL_FREQ			5	// 频率测量
#define CFG_INT_LEVEL_CAN			5	// CAN总线
#define CFG_INT_LEVEL_5MS			4	// 保护中断，PIT2,5ms，保护中断在特定的情况下持续时间太长，所以优先级不能高于clock和测频。

//非实时。级别相同的，依MCF54418的规则，排前面的优先级更高。
//非实时中断，如果没有指定优先级，在request_irq函数中将默认指定为2。
#define CFG_INT_LEVEL_UART			3	// 2个外扩485，一个调试UART、一个打印UART、一个面板通讯485.
#define CFG_INT_LEVEL_DTIM_KERNEL	2	// LINUX 内核 DTIM
#define CFG_INT_LEVEL_ETHERNET		1	// 2个ETHERNET口


//----------------------------- 外部中断  ---------------------------
#define CFG_EPORT_VECTOR_BEGIN		64

//IRQ1，GPS信号输入管脚,非中断
#define CFG_INT_VECTOR_IRQ1	(CFG_EPORT_VECTOR_BEGIN + 1)

//IRQ2,INT_B,DP83849
#define CFG_INT_VECTOR_NET_0	(CFG_EPORT_VECTOR_BEGIN + 2)

//IRQ3,INT_A,DP83849
#define CFG_INT_VECTOR_NET_1	(CFG_EPORT_VECTOR_BEGIN + 3)

//IRQ4,DREQ0
#define CFG_INT_VECTOR_IRQ4	(CFG_EPORT_VECTOR_BEGIN + 4)

//IRQ6,无
#define CFG_INT_VECTOR_IRQ6	(CFG_EPORT_VECTOR_BEGIN + 6)

//IRQ7 ,无
#define CFG_INT_VECTOR_IRQ7	(CFG_EPORT_VECTOR_BEGIN + 7)




//--------------------------------  FlexBus  -----------------------------------
//目前假设CPU最高频率为250MHZ,那么FlexBus的时钟频率为62.5MHZ,周期16ns。
//默认情况下每个占用256M地址空间，基址为片选索引乘256M。

//CS0,NOR FLASH,在U-BOOT中设置，kernel中不重新设置。

//CS1,外部AD1
//--------------------------------  网络  --------------------------------
//
#define CFG_ETH_MAX_PHY 		   4
#if defined NET3_IP5
  #define CFG_ETH_MAX_LOGIC			5 //逻辑网卡最大数量
#elif defined NET4_IP5
  #define CFG_ETH_MAX_LOGIC			5 //逻辑网卡最大数量
#else
  #define CFG_ETH_MAX_LOGIC			3 //逻辑网卡最大数量
#endif

//--------------------------------  ADC  --------------------------------
//

//#define __MINI_DTU__    //小型化DTU

#ifdef  __MINI_DTU__
#define     BRAM_CTRL_0         0x80000000
#else
#define     BRAM_CTRL_0         0x40000000
#endif

#define     MEM_LEN             (1024 * 4)
#define     DIN_OFFSET          0x9000
#define     WRITE_PTR_OFFSET    0x0FF0
#define     BRAM_LEN            0x1000


#define FREN1_CNT_OFFSET                0x0FF4
#define ADC_FOLLOW_FREN1_OFFSET         0x0000
#define ADC_WRITE_PTR_OFFSET            0x0FF0

#define ADC_CH01_OFFSET                 0x1000
#define ADC_CH23_OFFSET                 0x2000
#define ADC_CH45_OFFSET                 0x3000
#define ADC_CH67_OFFSET                 0x4000
#define ADC_CH89_OFFSET                 0x5000
#define ADC_CHAB_OFFSET                 0x6000
#define ADC_CHCD_OFFSET                 0x7000
#define ADC_CHEF_OFFSET                 0x8000

#define CFG_ADC_BASE_ADDR               0x1000 


#define BRAM_CTRL_MEM_SIZE              0x1000

//FUXI 共享内存地址，请参看《fuxi核间通信结构体定义.doc》
//1. linux核->裸核空间定义如下：
#define SHM_ADDR_D_FREQ_TR              	0x00000000 //频率跟踪
#define SHM_ADDR_D_RFV_1              		0x00000040 //第一片AD7616参考电压范围
#define SHM_ADDR_D_RFV_2              		0x00000080 //第二片AD7616参考电压范围
#define SHM_ADDR_D_RFV_3              		0x000000C0 //第三片AD7616参考电压范围
#define SHM_ADDR_D_RFV_4              		0x00000100 //第四片AD7616参考电压范围
#define SHM_ADDR_D_TIME              		0x00001000 //系统时间 linux向裸核校时
#define SHM_ADDR_D_HB              			0x00001040 //心跳


//2. 裸核->linux核空间定义如下：
#define SHM_ADDR_U_TIME              		0x00001000 //系统时间 裸核向linux校时
#define SHM_ADDR_U_FREQ              		0x00001040 //频率
#define SHM_ADDR_U_DC              			0x00001080 //直流
#define SHM_ADDR_U_WP              			0x000010C0 //Ad7616采样点写指针
#define SHM_ADDR_U_WR              			0x00001100 //打印信息读写指针
#define SHM_ADDR_U_VER              		0x00001140 //裸核版本信息
#define SHM_ADDR_U_PRO_W_F              	0x00001180 //裸核程序空间写完标志结构体

#define SHM_ADDR_U_DEBUG_MSG              	0x00005000 //打印缓冲区

#define SHM_ADDR_U_E907_PRO             	0x00005200 //存放裸核的程序

#define SHM_ADDR_U_ADC_1             		0x00040000 //第一片AD7616 采样数据区
#define SHM_ADDR_U_ADC_2             		0x00060000 //第二片AD7616 采样数据区
#define SHM_ADDR_U_ADC_3             		0x00080000 //第三片AD7616 采样数据区
#define SHM_ADDR_U_ADC_4             		0x000A0000 //第四片AD7616 采样数据区


#define SHM_ADC_SIZE      (SHM_ADDR_U_ADC_2 - SHM_ADDR_U_ADC_1)



//--------------------------------  ADC  --------------------------------
//
#define CFG_ADC_DOTS_PER_PERIOD		32						// 每个周波的采样点数。
#define CFG_ADC_DOTS_PER_CHANNEL	256						// 每个ADC通道保存的采样点数(8个周波)。
#define CFG_ADC_DOTS_MASK			(CFG_ADC_DOTS_PER_CHANNEL-1)// 每个ADC通道保存的采样点数的MASK。
#define CFG_ADC_BUF_MASK 			(~(CFG_ADC_DOTS_PER_CHANNEL*2)) 	// 提供给MAC设置用(short->byte*2)

#define CFG_ADC_OS_BASE				0						// 过采样基数
#define CFG_ADC_OS_NUM				(1<<CFG_ADC_OS_BASE)	// 过采样倍数

#define CFG_ADC_CHANNEL				16					// ADC采样的通道数
#define CFG_ADC_CHANNEL_DC			1					// 直流ADC通道数量
#define CFG_ADC_CHANNEL_ALL			(CFG_ADC_CHANNEL + CFG_ADC_CHANNEL_DC) // 所有通道数
#define CFG_ADC_CHANNEL_ZERO		(CFG_ADC_CHANNEL_ALL)	// 全0通道索引

#define CFG_ADC_DMA_CHANNEL 		8										// ADC占用4个DMA通道8~11
#define CFG_ADC_DMA_CHANNEL_REC 	(CFG_ADC_DMA_CHANNEL+EQU_SLOT_AC_NUM)	// ADC录波占用1个DMA通道.
#define CFG_ADC_DMA_VECTOR_REC		(64+16+EQU_SLOT_AC_NUM)					// DMA通道8对应INTC0的中断向量16.



//-----------------------------------------------------------------------------

//--------------------------------  PIT Timers  --------------------------------
#define CFG_PIT_KERNEL			0	// linux 内核调度定时器
#define CFG_PIT_1				1	// CAN 1ms定时器 (优先级高于linux kernel)
#define CFG_PIT_5MS				2 	// 5ms保护中断
#define CFG_PIT_SAMPLE			3 	// 156us采样中断

#define CFG_PIT_VECTOR_BEGIN	(192 + 13)	//中断向量
#define CFG_PIT_CD_BEGIN		(32)

/*PMR寄存器值PMRn[PM] = (T * fsys/2) / 2^PCSRn[PRE] - 1*/
//数字大的PIT中断优先级高
#define PIT_PERIOD_156US		((CFG_CPU_CLK/2)/6400/1 - 1)	// 1分频
#define PIT_PERIOD_5MS 			((CFG_CPU_CLK/2)/200/16 - 1)	// 16分频

//--------------------------------  DMA Timers  --------------------------------
#ifdef __DFTU_V4_HV0102__ // sunxi 20180724 第二版
#define CFG_DTIM_FREQ0			2		// 测频0
#else // sunxi 20180724 第一版
#define CFG_DTIM_FREQ0			0		// 测频0
#endif
#define	CFG_DTIM_FREQ1		3		//测频1
#define CFG_DTIM_GPS_CAP		1		// GPS对时，捕获(与微秒定时器共用)
#define CFG_DTIM_GPS_REF		0		// GPS对时，参考输出
#define CFG_DTIM_USTIMER		(CFG_DTIM_GPS_CAP)	// 微秒定时器(与GPS对时共用)

#define CFG_DTIM_VECTOR_BEGIN	(64 + 32)	//中断向量

//-------------------------------- 测频 ----------------------------------------
#define CFG_FREQ_NUM			2			//一路测频


//-------------------------------- UART ----------------------------------------
#define CFG_UART_INT_VECTOR(x)		((x<4)? (90+x):(176+x))

/*
FUXI:
UART0 -> /dev/ttyS0
UART1 -> /dev/ttyS1

CFG_UART_232_0 -> /dev/ttyS2
CFG_UART_232_1 -> /dev/ttyS3
CFG_UART_485_0 -> /dev/ttyS4
CFG_UART_485_1 -> /dev/ttyS5
CFG_UART_485_2 -> /dev/ttyS8

...

*/

//TODO. noted by sunxi: 根据实际情况，定义串口号
#define CFG_UART_RT_CONSOLE			0	//内部已实现console功能

#define CFG_UART_HMI				1	//
#define CFG_UART_232_0				2	//232_2	
#define CFG_UART_232_1				3	//232_3
#define CFG_UART_485_0				4	//485_4

#define CFG_UART_485_1				5	//485_5
#define CFG_UART_485_2				8	//485_8
#define CFG_UART_485_3				7
#define CFG_UART_GPRS_IN			10	//此UART物理上不存在，虚拟给内部GPRS用
#define CFG_UART_GPS				(CFG_UART_232_0)//暂定
#define CFG_UART_CHIP_S1			11	//此UART物理上不存在，虚拟给南网加密芯片用

#define CFG_UART_NUM_MAX   			11	// 最大UART数量


#ifdef __GOOSE_USING_DOUBLE_ETH__
	#define CFG_ETH_NUM_MAX   		3 	//网络数量
#else
	#define CFG_ETH_NUM_MAX   		2
#endif

//-------------------------------- CAN ----------------------------------------
#define CFG_CAN_VECTOR_BEGIN	(128 + 0)	//中断向量


//-------------------------------- DMA ----------------------------------------
#define CFG_DMA_VECTOR_BEGIN	(64 + 8)	//中断向量


//-------------------------------- I2C ----------------------------------------
#if 1
/* I2C CMODULE 2 */
#define MCF_I2AR     *(volatile unsigned char *)(0xEC010000)	/* I2C Address 		 */
#define MCF_I2FDR    *(volatile unsigned char *)(0xEC010004)	/* I2C Frequency Divider */
#define MCF_I2CR     *(volatile unsigned char *)(0xEC010008)	/* I2C Control		 */
#define MCF_I2SR     *(volatile unsigned char *)(0xEC01000C)	/* I2C Status		 */
#define MCF_I2DR     *(volatile unsigned char *)(0xEC010010)	/* I2C Data I/O		 */
#else
/* I2C MODULE 0 */
#define MCF_I2AR     *(volatile unsigned char *)(0xFC058000)	/* I2C Address 		 */
#define MCF_I2FDR    *(volatile unsigned char *)(0xFC058004)	/* I2C Frequency Divider */
#define MCF_I2CR     *(volatile unsigned char *)(0xFC058008)	/* I2C Control		 */
#define MCF_I2SR     *(volatile unsigned char *)(0xFC05800C)	/* I2C Status		 */
#define MCF_I2DR     *(volatile unsigned char *)(0xFC058010)	/* I2C Data I/O		 */
#endif

//-------------------------------- E2PROM(24LC256) -----------------------------
#ifdef SOE_PARA_ALL_SAVE
#define CFG_E2PROM_SIZE			(256*1024)
#else
#define CFG_E2PROM_SIZE			(128*1024)
#endif

#define CFG_E2PROM_PAGE_SIZE	64


//-------------------------------- RTC(DS1338) ---------------------------------
#define CFG_RTC_BUFFER_SIZE		(16)
#define CFG_RTC_NVRAM_SIZE		(1)

//-------------------------------- DSPI ----------------------------------------
#define CFG_DSPI_INDEX 			0

//-------------------------------- FLASH(AT45DB321) ----------------------------
#define CFG_FLASH_PAGE_SIZE		512											//页面大小
#define CFG_FLASH_PAGE_NUM		8192										//页面数
#define CFG_FLASH_SIZE			(CFG_FLASH_PAGE_SIZE*CFG_FLASH_PAGE_NUM)//FLASH的大小


//--------------------------------  GPIO  --------------------------------------
/*
// 核心板GPIO配置
NOR_WP:MII0_COL/RMII1_MDC/ULPI_STP/GPIOJ0
WDOG:DSPI0_PCS0/SS_B/I2C3_SDA/SDHC_DAT3/GPIOD7
RUN:SDHC_DAT1/PWMA2/DSPI1_PCS1/GPIOF0
ERR:SDHC_DAT2/PWMB1/DSPI1_PCS2/GPIOF1
PWM1:SDHC_CMD/PWMB0/DSPI1_SIN/GPIOG6
PWM2:SDHC_CLK/PWMA0/DSPI1_SCK/GPIOG5
PWM3:SDHC_DAT0/PWMB2/DSPI1_SOUT/GPIOG7
PWM4:SDHC_DAT3/PWMA1/DSPI1_PCS0/GPIOF2
DSPIO_PCS1:DSPI0_PCS1/SBF_CS_B/GPIOC0
GPIO_0:SSI0_MCLK/SSI_CLKIN/SIM1_CLK/GPIOH4
GPIO_1:SIM0_XMT/PWM_FAULT2/SDHC_DAT7/GPIOG4/RGPIO
GPIO_2:SIM0_VEN/PWM_FAULT0/GPIOG3/RGPIO
GPIO_3:SIM0_CLK/PWM_FAULT1/SDHC_DAT4/GPIOG0/RGPIO
GPIO_4:SIM0_RST/PWM_FORCE/SDHC_DAT6/GPIOG2/RGPIO
GPIO_5:SIM0_PD/PWM_SYNC/SDHC_DAT5/GPIOG1/RGPIO
GPIO_6:DDATA[0]/GPIOI6
GPIO_7:DDATA[1]/GPIOI7
GPIO_8:DDATA[2]/GPIOH0
GPIO_9:DDATA[3]/GPIOH1
GPIO_10:MII0_TXER/RMII1_MDIO/ULPI_DATA4/GPIOK7

*/


//看门狗/运行灯(看门狗边沿有效,运行灯低有效)
#define GPIO_WATCHDOG_BIT		7
#define GPIO_WATCHDOG_LOW()		GPIO_D_L(GPIO_WATCHDOG_BIT)
#define GPIO_WATCHDOG_HIGH()	GPIO_D_H(GPIO_WATCHDOG_BIT)
#define GPIO_WATCHDOG_STATUS()	GPIO_D_S(GPIO_WATCHDOG_BIT)
#define GPIO_WATCHDOG_INIT()	GPIO_D_L(GPIO_WATCHDOG_BIT);	\
								GPIO_D_O(GPIO_WATCHDOG_BIT)
//NOR flash写保护(低禁止写) J0
#define GPIO_WP_NORFLASH_BIT	0
#define GPIO_WP_NORFLASH_LOW()	GPIO_J_L(GPIO_WP_NORFLASH_BIT)
#define GPIO_WP_NORFLASH_HIGH()	GPIO_J_H(GPIO_WP_NORFLASH_BIT)
#define GPIO_WP_NORFLASH_INIT()	GPIO_J_L(GPIO_WP_NORFLASH_BIT);	\
								GPIO_J_O(GPIO_WP_NORFLASH_BIT)

#if 0
//GPIO_DSPI_CS_FLASH = C0
#define GPIO_DSPI_CS_FLASH_BIT	0
#define GPIO_DSPI_CS_FLASH_LOW()		GPIO_C_L(GPIO_DSPI_CS_FLASH_BIT)
#define GPIO_DSPI_CS_FLASH_HIGH()		GPIO_C_H(GPIO_DSPI_CS_FLASH_BIT)
#define GPIO_DSPI_CS_FLASH_INIT()		GPIO_DSPI_CS_FLASH_HIGH();\
										GPIO_C_O(GPIO_DSPI_CS_FLASH_BIT)
#else
//ESAM加密芯片
//DSPI0_CTRN:IRQ7:C6(电源控制)
//#define GPIO_ESAM_POWER_BIT			6
#define GPIO_ESAM_POWER_LOW()		esam_power_ctrl(0)//GPIO_C_L(GPIO_ESAM_POWER_BIT)
#define GPIO_ESAM_POWER_HIGH()		esam_power_ctrl(1)//GPIO_C_H(GPIO_ESAM_POWER_BIT)
//#define GPIO_ESAM_POWER_INIT()	GPIO_C_L(GPIO_ESAM_POWER_BIT);GPIO_C_O(GPIO_ESAM_POWER_BIT)

//GPIO_DSPI_CS_ESAM = C0(片选控制)
//#define GPIO_DSPI_CS_ESAM_BIT		0
//#define GPIO_DSPI_CS_ESAM_LOW()		GPIO_C_L(GPIO_DSPI_CS_ESAM_BIT)
//#define GPIO_DSPI_CS_ESAM_HIGH()	GPIO_C_H(GPIO_DSPI_CS_ESAM_BIT)
//#define GPIO_DSPI_CS_ESAM_INIT()	GPIO_DSPI_CS_ESAM_HIGH();GPIO_C_O(GPIO_DSPI_CS_ESAM_BIT)
#endif

//GPS_对时,使用两个管脚，一个用作捕获，一个用作检查检查管脚电平。
//这是因为用作捕获的管脚，在MCF5441X上没有办法取得管脚的状态
//GPS_INT1 = IRQ1/PC1
//GPS_INT2 = T3IN
#define GPIO_GPS_INT_BIT		1
#define GPIO_GPS_INT_STATUS()	GPIO_C_S(GPIO_GPS_INT_BIT)
#define GPIO_GPS_INT_INIT()		if(0)//do{ MCF_PAD_PAR_TIMER |= (3<<(CFG_DTIM_GPS_CAP*2));}while(0)

//GPS对时输出（给各个分板）
#define GPIO_GPS_LOW()			{}
#define GPIO_GPS_HIGH()			{}
#define GPIO_GPS_INIT()			{}
//外部ADC
//ADC_BUSY1:IRQ4:C4
#define GPIO_ADC_BUSY1_BIT			4
#define GPIO_ADC_BUSY1_STATUS()		GPIO_C_S(GPIO_ADC_BUSY1_BIT)
#define GPIO_ADC_BUSY1_INIT()		GPIO_C_I(GPIO_ADC_BUSY1_BIT)


//ADC_RESET:GPIO_1:G4
#define GPIO_ADC_RESET_BIT			4
#define GPIO_ADC_RESET_LOW()		GPIO_G_L(GPIO_ADC_RESET_BIT)
#define GPIO_ADC_RESET_HIGH()		GPIO_G_H(GPIO_ADC_RESET_BIT)
#define GPIO_ADC_RESET_INIT()		GPIO_G_L(GPIO_ADC_RESET_BIT);	\
									GPIO_G_O(GPIO_ADC_RESET_BIT)

//ADC_CONVST:GPIO_2:G3
#define GPIO_ADC_CONVST_BIT			3
#define GPIO_ADC_CONVST_LOW()		GPIO_G_L(GPIO_ADC_CONVST_BIT)
#define GPIO_ADC_CONVST_HIGH()		GPIO_G_H(GPIO_ADC_CONVST_BIT)
#define GPIO_ADC_CONVST_INIT()		GPIO_G_L(GPIO_ADC_CONVST_BIT);	\
									GPIO_G_O(GPIO_ADC_CONVST_BIT)


//LED
//GPIO_LED_RUN F0
#define GPIO_LED_RUN_BIT		0
#define GPIO_LED_RUN_ON()		GPIO_F_L(GPIO_LED_RUN_BIT)
#define GPIO_LED_RUN_OFF()		GPIO_F_H(GPIO_LED_RUN_BIT)
#define GPIO_LED_RUN_STATUS()	GPIO_F_S(GPIO_LED_RUN_BIT)
#define GPIO_LED_RUN_INIT()		GPIO_F_H(GPIO_LED_RUN_BIT);	\
								GPIO_F_O(GPIO_LED_RUN_BIT)
//GIIO_LED_ERR F1
#define GPIO_LED_ERR_BIT		1
#define GPIO_LED_ERR_ON()		GPIO_F_L(GPIO_LED_ERR_BIT)
#define GPIO_LED_ERR_OFF()		GPIO_F_H(GPIO_LED_ERR_BIT)
#define GPIO_LED_ERR_STATUS()	GPIO_F_S(GPIO_LED_ERR_BIT)
#define GPIO_LED_ERR_INIT()		GPIO_F_H(GPIO_LED_ERR_BIT);	\
								GPIO_F_O(GPIO_LED_ERR_BIT)


#ifdef __DFTU_V4_HV0102__ // sunxi 20180724 第二版
//GPIO_LED_COMM 去掉了
#define GPIO_LED_COMM_ON()		do{}while(0)
#define GPIO_LED_COMM_OFF()		do{}while(0)
#define GPIO_LED_COMM_STATUS()	0
#define GPIO_LED_COMM_INIT()	do{}while(0)


//GPIO_LED_ACT 去掉了
#define GPIO_LED_ACT_ON()		do{}while(0)
#define GPIO_LED_ACT_OFF()		do{}while(0)
#define GPIO_LED_ACT_STATUS()	0
#define GPIO_LED_ACT_INIT()		do{}while(0)
#else // sunxi 20180724 第一版
//GPIO_LED_COMM H4
#define GPIO_LED_COMM_BIT		4
#define GPIO_LED_COMM_ON()		GPIO_H_L(GPIO_LED_COMM_BIT)
#define GPIO_LED_COMM_OFF()		GPIO_H_H(GPIO_LED_COMM_BIT)
#define GPIO_LED_COMM_STATUS()	GPIO_H_S(GPIO_LED_COMM_BIT)
#define GPIO_LED_COMM_INIT()	GPIO_H_H(GPIO_LED_COMM_BIT);	\
								GPIO_H_O(GPIO_LED_COMM_BIT)

//GPIO_LED_ACT G0
#define GPIO_LED_ACT_BIT		0
#define GPIO_LED_ACT_ON()		GPIO_G_L(GPIO_LED_ACT_BIT)
#define GPIO_LED_ACT_OFF()		GPIO_G_H(GPIO_LED_ACT_BIT)
#define GPIO_LED_ACT_STATUS()	GPIO_G_S(GPIO_LED_ACT_BIT)
#define GPIO_LED_ACT_INIT()		GPIO_G_H(GPIO_LED_ACT_BIT);	\
								GPIO_G_O(GPIO_LED_ACT_BIT)
#endif


//开出(16路,低有效)
//KOUT0 I6
#define GPIO_KOUT0_BIT			6
#define GPIO_KOUT0_ON()			GPIO_I_L(GPIO_KOUT0_BIT)
#define GPIO_KOUT0_OFF()		GPIO_I_H(GPIO_KOUT0_BIT)
#define GPIO_KOUT0_INIT()		GPIO_I_H(GPIO_KOUT0_BIT);	\
								GPIO_I_O(GPIO_KOUT0_BIT)
//KOUT1 I7
#define GPIO_KOUT1_BIT			7
#define GPIO_KOUT1_ON()			GPIO_I_L(GPIO_KOUT1_BIT)
#define GPIO_KOUT1_OFF()		GPIO_I_H(GPIO_KOUT1_BIT)
#define GPIO_KOUT1_INIT()		GPIO_I_H(GPIO_KOUT1_BIT);	\
								GPIO_I_O(GPIO_KOUT1_BIT)
//KOUT2 H0
#define GPIO_KOUT2_BIT			0
#define GPIO_KOUT2_ON()			GPIO_H_L(GPIO_KOUT2_BIT)
#define GPIO_KOUT2_OFF()		GPIO_H_H(GPIO_KOUT2_BIT)
#define GPIO_KOUT2_INIT()		GPIO_H_H(GPIO_KOUT2_BIT);	\
								GPIO_H_O(GPIO_KOUT2_BIT)
//KOUT3 H1
#define GPIO_KOUT3_BIT			1
#define GPIO_KOUT3_ON()			GPIO_H_L(GPIO_KOUT3_BIT)
#define GPIO_KOUT3_OFF()		GPIO_H_H(GPIO_KOUT3_BIT)
#define GPIO_KOUT3_INIT()		GPIO_H_H(GPIO_KOUT3_BIT);	\
								GPIO_H_O(GPIO_KOUT3_BIT)

//KOUT4 G2
#define GPIO_KOUT4_BIT			2
#define GPIO_KOUT4_ON()			GPIO_G_L(GPIO_KOUT4_BIT)
#define GPIO_KOUT4_OFF()		GPIO_G_H(GPIO_KOUT4_BIT)
#define GPIO_KOUT4_INIT()		GPIO_G_H(GPIO_KOUT4_BIT);	\
								GPIO_G_O(GPIO_KOUT4_BIT)

//KOUT5 G1
#define GPIO_KOUT5_BIT			1
#define GPIO_KOUT5_ON()			GPIO_G_L(GPIO_KOUT5_BIT)
#define GPIO_KOUT5_OFF()		GPIO_G_H(GPIO_KOUT5_BIT)
#define GPIO_KOUT5_INIT()		GPIO_G_H(GPIO_KOUT5_BIT);	\
								GPIO_G_O(GPIO_KOUT5_BIT)

#ifdef __DFTU_V4_HV0102__ // sunxi 20180724 第二版
//KOUT6 H4
#define GPIO_KOUT6_BIT			4
#define GPIO_KOUT6_ON()			GPIO_H_L(GPIO_KOUT6_BIT)
#define GPIO_KOUT6_OFF()		GPIO_H_H(GPIO_KOUT6_BIT)
#define GPIO_KOUT6_INIT()		GPIO_H_H(GPIO_KOUT6_BIT);	\
								GPIO_H_O(GPIO_KOUT6_BIT);


//KOUT7  G0
#define GPIO_KOUT7_BIT			0
#define GPIO_KOUT7_ON()			GPIO_G_L(GPIO_KOUT7_BIT)
#define GPIO_KOUT7_OFF()		GPIO_G_H(GPIO_KOUT7_BIT)
#define GPIO_KOUT7_INIT()		GPIO_G_H(GPIO_KOUT7_BIT);	\
								GPIO_G_O(GPIO_KOUT7_BIT);
#else // sunxi 20180724 第一版
//KOUT6 E5
#define GPIO_KOUT6_BIT			5
#define GPIO_KOUT6_ON()			GPIO_E_L(GPIO_KOUT6_BIT)
#define GPIO_KOUT6_OFF()		GPIO_E_H(GPIO_KOUT6_BIT)
#define GPIO_KOUT6_INIT()		GPIO_E_H(GPIO_KOUT6_BIT);	\
								GPIO_E_O(GPIO_KOUT6_BIT);	\
								{MCF_GPIO_PAR_UART2 =(MCF_GPIO_PAR_UART2 & MCF_GPIO_PAR_UART2_U2RTS_MASK);}while(0)

#if 0
//KOUT7  K7
#define GPIO_KOUT7_BIT			7
#define GPIO_KOUT7_ON()			GPIO_K_L(GPIO_KOUT7_BIT)
#define GPIO_KOUT7_OFF()		GPIO_K_H(GPIO_KOUT7_BIT)
#define GPIO_KOUT7_INIT()		GPIO_K_H(GPIO_KOUT7_BIT);	\
								GPIO_K_O(GPIO_KOUT7_BIT);   \

								do{ MCF_PAD_PAR_FEC = 0X05;}while(0)
#else
//KOUT7 G0
#define GPIO_KOUT7_BIT			0
#define GPIO_KOUT7_ON()			GPIO_G_L(GPIO_KOUT7_BIT)
#define GPIO_KOUT7_OFF()		GPIO_G_H(GPIO_KOUT7_BIT)
#define GPIO_KOUT7_INIT()		GPIO_G_H(GPIO_KOUT7_BIT);	\
								GPIO_G_O(GPIO_KOUT7_BIT);

#endif

#endif



//PWM0 G6
#define GPIO_KOUT_PWM0_BIT			6
#define GPIO_KOUT_PWM0_ON()			GPIO_G_L(GPIO_KOUT_PWM0_BIT)
#define GPIO_KOUT_PWM0_OFF()		GPIO_G_H(GPIO_KOUT_PWM0_BIT)
#define GPIO_KOUT_PWM0_INIT()		GPIO_G_H(GPIO_KOUT_PWM0_BIT);	\
									GPIO_G_O(GPIO_KOUT_PWM0_BIT)
//PWM1 G5
#define GPIO_KOUT_PWM1_BIT			5
#define GPIO_KOUT_PWM1_ON()			GPIO_G_L(GPIO_KOUT_PWM1_BIT)
#define GPIO_KOUT_PWM1_OFF()		GPIO_G_H(GPIO_KOUT_PWM1_BIT)
#define GPIO_KOUT_PWM1_INIT()		GPIO_G_H(GPIO_KOUT_PWM1_BIT);	\
									GPIO_G_O(GPIO_KOUT_PWM1_BIT)
//PWM2 G7
#define GPIO_KOUT_PWM2_BIT			7
#define GPIO_KOUT_PWM2_ON()			GPIO_G_L(GPIO_KOUT_PWM2_BIT)
#define GPIO_KOUT_PWM2_OFF()		GPIO_G_H(GPIO_KOUT_PWM2_BIT)
#define GPIO_KOUT_PWM2_INIT()		GPIO_G_H(GPIO_KOUT_PWM2_BIT);	\
									GPIO_G_O(GPIO_KOUT_PWM2_BIT)
//PWM3 F2
#define GPIO_KOUT_PWM3_BIT			2
#define GPIO_KOUT_PWM3_ON()			GPIO_F_L(GPIO_KOUT_PWM3_BIT)
#define GPIO_KOUT_PWM3_OFF()		GPIO_F_H(GPIO_KOUT_PWM3_BIT)
#define GPIO_KOUT_PWM3_INIT()		GPIO_F_H(GPIO_KOUT_PWM3_BIT);	\
									GPIO_F_O(GPIO_KOUT_PWM3_BIT)

//KOUT_EN0 C5
#define GPIO_KOUT_EN0_BIT			5
#define GPIO_KOUT_EN0_ON()			GPIO_C_H(GPIO_KOUT_EN0_BIT)
#define GPIO_KOUT_EN0_OFF()			GPIO_C_L(GPIO_KOUT_EN0_BIT)
#define GPIO_KOUT_EN0_INIT()		GPIO_C_L(GPIO_KOUT_EN0_BIT);	\
									GPIO_C_O(GPIO_KOUT_EN0_BIT)

//KOUT_EN1 T2IN
#ifdef __DFTU_V4_HV0102__ // sunxi 20180724 第二版 H7
#define GPIO_KOUT_EN1_BIT			7
#define GPIO_KOUT_EN1_ON()			GPIO_K_H(GPIO_KOUT_EN1_BIT)
#define GPIO_KOUT_EN1_OFF()			GPIO_K_L(GPIO_KOUT_EN1_BIT)
#define GPIO_KOUT_EN1_INIT()		GPIO_K_L(GPIO_KOUT_EN1_BIT);	\
									GPIO_K_O(GPIO_KOUT_EN1_BIT)
#else // sunxi 20180724 第一版 D1
#define GPIO_KOUT_EN1_BIT			1
#define GPIO_KOUT_EN1_ON()			GPIO_D_H(GPIO_KOUT_EN1_BIT)
#define GPIO_KOUT_EN1_OFF()			GPIO_D_L(GPIO_KOUT_EN1_BIT)
#define GPIO_KOUT_EN1_INIT()		GPIO_D_L(GPIO_KOUT_EN1_BIT);	\
									GPIO_D_O(GPIO_KOUT_EN1_BIT)
#endif

//测试管脚
#if 0
#define MCF_GPIO_PAR_FBCTL_ALE_MASK		(0x3F)
#define GPIO_TP1_BIT			7
#define GPIO_TP1_LOW()			GPIO_A_L(GPIO_TP1_BIT)
#define GPIO_TP1_HIGH()			GPIO_A_H(GPIO_TP1_BIT)
#define GPIO_TP1_STATUS()		GPIO_A_S(GPIO_TP1_BIT)
#define GPIO_TP1_INIT()			GPIO_A_L(GPIO_TP1_BIT); \
								GPIO_A_O(GPIO_TP1_BIT);	\
								do{ MCF_PAD_PAR_FBCTL &= MCF_GPIO_PAR_FBCTL_ALE_MASK;}while(0)

#define MCF_GPIO_PAR_FBCTL_FBCLK		(0x08)
#define GPIO_TP2_BIT			7
#define GPIO_TP2_LOW()			GPIO_B_L(GPIO_TP2_BIT)
#define GPIO_TP2_HIGH()			GPIO_B_H(GPIO_TP2_BIT)
#define GPIO_TP2_STATUS()		GPIO_B_S(GPIO_TP2_BIT)
#define GPIO_TP2_INIT()			GPIO_B_L(GPIO_TP2_BIT); \
								GPIO_B_O(GPIO_TP2_BIT);	\
								do{ MCF_PAD_PAR_FBCTL &= ~MCF_GPIO_PAR_FBCTL_FBCLK;}while(0)

#define MCF_GPIO_PAR_BE_BE0_MASK		(0xFC)
#define GPIO_TP3_BIT			0
#define GPIO_TP3_LOW()			GPIO_A_L(GPIO_TP3_BIT)
#define GPIO_TP3_HIGH()			GPIO_A_H(GPIO_TP3_BIT)
#define GPIO_TP3_STATUS()		GPIO_A_S(GPIO_TP3_BIT)
#define GPIO_TP3_INIT()			GPIO_A_L(GPIO_TP3_BIT); \
								GPIO_A_O(GPIO_TP3_BIT);	\
								do{ MCF_PAD_PAR_BE &= MCF_GPIO_PAR_BE_BE0_MASK;}while(0)

//目前是NF_WP管脚
#define MCF_GPIO_PAR_BE_BE1_MASK		(0xF3)
#define GPIO_TP4_BIT			1
#define GPIO_TP4_LOW()			GPIO_A_L(GPIO_TP4_BIT)
#define GPIO_TP4_HIGH()			GPIO_A_H(GPIO_TP4_BIT)
#define GPIO_TP4_INIT()			GPIO_A_L(GPIO_TP4_BIT); \
								GPIO_A_O(GPIO_TP4_BIT);	\
								do{ MCF_PAD_PAR_BE &= MCF_GPIO_PAR_BE_BE1_MASK;}while(0)

#endif

#if 0 //这个管脚目前做事件捕获，不做普通测试管脚了。
#define GPIO_TP9_BIT			7
#define GPIO_TP9_LOW()			GPIO_E_L(GPIO_TP9_BIT)
#define GPIO_TP9_HIGH()			GPIO_E_H(GPIO_TP9_BIT)
#define GPIO_TP9_STATUS()		GPIO_E_S(GPIO_TP9_BIT)
#define GPIO_TP9_INIT()			GPIO_E_L(GPIO_TP9_BIT); \
								GPIO_E_O(GPIO_TP9_BIT);

#endif



#define MCF_REG08(x)	x
#define MCF_REG16(x)	x
#define MCF_REG32(x)	x

#define CFG_BSP_DEBUG	1


//linux
#define PROC_NAME_BSP_VERSION	"bspversion"	//Linux bsp version file's name


#define CFG_IOCTL_TYPE		0XF8
#define CFG_IOCTL_NR_CLOCK	0
#define CFG_IOCTL_NR_CAN	32

#endif //_BSPCONFIG_H_
