/*******************************************************************************
版权所有：	
文件名称：	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  __DFTU_V4_HV0102__         1 // sunxi 20180724 第二版

#define PROTECT_AC_ADJUST		 //保护电流校准

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


//----------------------------- 设备架构  ---------------------------
#define EQU_SLOT_NUM_MAX		16
#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			2	// 一个装置支持AC板的最大槽数。1 -> 2 DTUv5采用两块采样板
#define EQU_SLOT_AC_CHN			16   // 每个槽中支持的最大AC通道数
#define EQU_DB_YX_NUM			32	// 数据总线长度

#define	EQU_SLOT_NUM_06			6 // DTUv5 目前配置卡槽数量为6，后续根据需求修改
#define EQU_SLOT_AC_BEGIN06		0 // 定义6卡槽DTUv5中AC采样板的卡槽开始位置

//----------------------------- 线路开关  ---------------------------
#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时钟根据外部晶体频率和系统配置算出来


//----------------------------- 中断级别  ---------------------------
//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_CAN			5	// CAN总线

//非实时。级别相同的，依MCF54418的规则，排前面的优先级更高。
//非实时中断，如果没有指定优先级，在request_irq函数中将默认指定为2。


//----------------------------- 外部中断  ---------------------------


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

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

//CS1,外部AD1
//--------------------------------  网络  --------------------------------
//
#define CFG_ETH_MAX_PHY 		    3 // 实体网口phy数量
#define CFG_ETH_MAX_LOGIC           4 // 逻辑网卡最大数量

//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_256_DOTS_PER_PERIOD        // 一周波采256点
 
#ifdef    CFG_256_DOTS_PER_PERIOD
#define CFG_ADC_MOD_NUM             8    //256采样时8个点抽一个，抽取32个计算,比率为8
#else
#define CFG_ADC_MOD_NUM             4
#endif

#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  --------------------------------
#define CFG_DTIM_GPS_CAP		1		// GPS对时，捕获(与微秒定时器共用)

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

//TODO. noted by sunxi: 根据实际情况，定义串口号
#define CFG_UART_HMI				1	//

/* T536版fuxi串口分配 注意uart11 13实际没接任何东西 */
#define CFG_UART_485_0				6
#define CFG_UART_485_1				4
#define CFG_UART_232_0				3
#define CFG_UART_232_1				1
#define CFG_UART_GPS				14
#define CFG_UART_BK_0				11
#define CFG_UART_BK_1				13
#define CFG_UART_CHIP_S1			10	// 南网加密芯片用

#define CFG_UART_GPRS_IN			10

#define CFG_UART_NUM_MAX   			7	// 最大UART数量 标准化端子4 gps1 备用2

#define CFG_ETH_NUM_MAX   		    3 	// 网络数量

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

//-------------------------------- I2C ----------------------------------------
/* 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		 */

//-------------------------------- 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)


//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)


//GPS_对时,使用两个管脚，一个用作捕获，一个用作检查检查管脚电平。
//这是因为用作捕获的管脚，在MCF5441X上没有办法取得管脚的状态
#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()			{}

//LED
#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



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

#define CFG_BSP_DEBUG	1

#endif //_BSPCONFIG_H_
