///=====================================================================
//文件名称：gec.c文件
//制作单位：SD-Arm(sumcu.suda.edu.cn)
//更新记录：20181201-20200829
//【备注】：与芯片无关
//=====================================================================
#include "gec.h"
//#include "OsApi.h"

//=====================================================================
//函数名称：Reset_Check
//函数返回：标志0或1
//参数说明：无
//功能概要：冷复位返回1，热复位返回0
//=====================================================================
uint32_t Reset_Check()
{
     //若是冷复位，给有关全局变量赋初值
	if(IS_POWERON_RESET)
	{
		return 1;
	}
	return 0;
}


//=====================================================================
//函数名称：pin_reset_judge（“复位按钮”判断）
//函数返回：无
//参数说明：无
//功能概要：若是1分钟内，按“复位按钮”次数超过6次，则回到BIOS绿灯闪烁状态
//更改记录：20200416，王宜怀改
//=====================================================================
void pin_reset_judge()
{
    uint32_t count=0;
    //根据是否是按“复位按钮”复位，分别执行不同功能
    if(IS_PIN_RESET_OCCURED)    //是按“复位按钮”
    {
        CLEAR_PIN_RESET_FLAG;   //写1清标志位
        while (count< 0x20000)
        {
            count++;
        }                      //增加20ms延时更稳定
        count=0;
        gRst_Count++;
        if(gRst_Count<6)        //还没到六次
        {
            while (count< 0xa00000)//1s内必须按下一次，否则清零
            {
                count++;
            }
            gRst_Count=0;
        }
        else
        {
            //【20200829】复位后重置动态命令，解决按复位键六次以上
            //            误调动态命令问题
            flash_erase(GEC_DYNAMIC_START);      //擦除动态命令首扇区
            uint8_t n[4]={0x00,0x20,0x70,0x47};   //动态命令区初始机器码
            flash_write_physical(GEC_DYNAMIC_START*MCU_SECTORSIZE+
                                   MCU_FLASH_ADDR_START,4,n);
            //为进入BIOS状态做准备
            gRst_Count=0;
            memcpy((void*)gcUpdateFlag,"RESET>=6\0",9);
        }
    }
    else     //不是按“复位按钮”
    {
        gRst_Count=0;
        CLEAR_PIN_RESET_FLAG;   //写1清标志位
    }
}

//=====================================================================
//函数名称：user_reset
//函数返回：无
//参数说明：USER工程在flash中的起始地址
//功能概要：（1）给栈指针SP寄存器赋值（来自User中断向量表第一项）
//         （2）转至USER的Reset_Handler（来自User中断向量表第二项）执行
//修改记录：WYH，20190925
//=====================================================================
void user_reset(volatile uint32_t addr)
{
    __asm(" push	{r0, r1, lr};");
    //（1）给栈指针SP寄存器赋值（来自User中断向量表第一项）
    __asm(" mov r1,r0;");     	//r0中为C语言默认的第一个参数
    __asm(" ldr r1,[r1];");    //取出USER程序SP的值
    __asm(" mov sp,r1;");      //赋给CPU内部SP寄存器
    
    //（2）转至USER的Reset_Handler（来自User中断向量表第二项）执行
    __asm(" ldr r0,[r0,#4];");   //r0←User的Reset_Handler地址
    __asm(" blx r0;");           //跳转至USER程序Reset_Handler函数
    
    //（3）结尾（实际不会执行到此）
    __asm(" pop	    {r0, r1, pc};");
}

//=========================================================================
//函数名称：shakeDataInit
//参数说明：无
//函数返回：无
//功能概要：握手帧数据初始化
//=========================================================================
void shakeDataInit()
{
    memset(&gShakeData.uecomType,0,25);
    memcpy(gShakeData.mcuType,MCU_TYPE,sizeof(MCU_TYPE));
    memcpy(gShakeData.BIOSVersion,BIOS_TYPE,sizeof(BIOS_TYPE));
    gShakeData.uStartAds = GEC_USERBASE;
    gShakeData.replaceNum = (MCU_SECTOR_NUM-GEC_USER_SECTOR_START)*
                            MCU_SECTORSIZE;
    gShakeData.reserveNum = 0;
}

//======================================================================
//函数名称：dynamic_cmd
//函数返回：无
//参数说明：无
//说明：具体功能动态改变。
//======================================================================
__attribute__((section (".dynamic_command"))) uint8_t dynamic_cmd(vuint8_t gcRecvBufp[],vuint16_t * gcRecvLenp){
    return 0;
}

//=====================================================================
//函数名称：reserved_func
//功能概要：保留函数
//参数说明：无
//函数返回：无
//=====================================================================
void reserved_func()
{
    return ;
}
//构件固化相关内容
#define LISTINFO      (((((('L'<<8)|'I')<<8)|'S')<<8)|'T')//LIST（用四个字符代表构件名）
#define LISTINFO_0_10 ((0<<16)|10)                        //0-10
#define SYSTEM        (((((('S'<<8)|'Y')<<8)|'S')<<8)|'T')//SYST
#define SYSTEM_11_30  ((11<<16)|30)                       //SYST：11-30
#define IMEI_1		  0xFFFFFFFF 
#define IMEI_2		  0xFFFFFFFF 
#define IMEI_3		  0xFFFFFFFF 
#define IMEI_4		  0xFFFFFFFF 
#define RTTHREAD      		(((((('R'<<8)|'T')<<8)|'T')<<8)|'H')//RTTHREAD
#define RTTHREAD_31_65    	((31<<16)|65)                       //31-65
/*********新增构建示例1（1/2）***********/
//#define CF_FLASH_1      (((((('F'<<8)|'L')<<8)|'A')<<8)|'S')
//#define CF_FLASH_2      (((((('H'<<8)|' ')<<8)|' ')<<8)|' ')//（用八个字符代表构件名）
//#define CF_FLASH_31_49  ((31<<16)|49)    

__attribute__((section (".component_list"))) void *  ComponentFun[MCU_SECTORSIZE/2]= {
    //===================================函数列表参数区===========================================
    (void *)   LISTINFO,                                      //0：构件函数列表参数区
    (void *)   LISTINFO_0_10,                                 //1：该区域占用编号0-10
    (void *)((uint32_t) MCU_SECTORSIZE/2),                    //2：列表容量（单位：uint32_t）
    (void *)((uint32_t)   31),                                //3：下一个可使用的下标
    (void *)((uint32_t)   MCU_FLASH_ADDR_START+GEC_COMPONENT_FUN_START*MCU_SECTORSIZE),       //4：构件函数代码区首地址
    (void *)((uint32_t)   MCU_FLASH_ADDR_START+(GEC_COMPONENT_FUN_END+1)*MCU_SECTORSIZE-1),   //5：构件函数代码区尾地址
    (void *)((uint32_t)   MCU_FLASH_ADDR_START+GEC_COMPONENT_FUN_START*MCU_SECTORSIZE),       //6：构件函数代码区下一次写入地址
    (void *)((uint32_t)   0),                                 //7：构件函数代码区有效使用空间
    (void *)((uint32_t)   0),       	                      //8：构件函数代码区无效使用空间
    (void *)((uint32_t)   (GEC_COMPONENT_FUN_END-GEC_COMPONENT_FUN_START+1)*MCU_SECTORSIZE),  //9：构件函数代码区空闲空间
    (void *)   reserved_func,       	                      //10：预留
    //===================================系统相关区===========================================
    (void *)   SYSTEM,                                        //11：系统相关区
    (void *)   SYSTEM_11_30,                                  //12：该区域占用编号11-30
    (void *)   ((uint32_t)MCU_FLASH_ADDR_START),              //13：BIOS划分的起始地址
    (void *)   ((uint32_t)MCU_FLASH_ADDR_START+(GEC_BIOS_SECTOR_END+1)*MCU_SECTORSIZE-1),	//14：BIOS划分的结束地址
    (void *)   ((uint32_t)MCU_FLASH_ADDR_START),       	      //15：BIOS实际的起始地址
    (void *)   0xffffffff,       	                          //16：BIOS实际的结束地址(串口更新后上位机写入)
    (void *)   ((uint32_t)MCU_FLASH_ADDR_START+GEC_DYNAMIC_START*MCU_SECTORSIZE),	        //17：动态命令的起始地址
    (void *)   ((uint32_t)MCU_FLASH_ADDR_START+(GEC_DYNAMIC_END+1)*MCU_SECTORSIZE-1),		//18：动态命令的结束地址(动态命令区域不允许干涉)
    (void *)   ((uint32_t)MCU_FLASH_ADDR_START+GEC_USER_SECTOR_START*MCU_SECTORSIZE),       //19：User划分的起始地址
    (void *)   ((uint32_t)MCU_FLASH_ADDR_START+(GEC_USER_SECTOR_END+1)*MCU_SECTORSIZE-1),   //20：User划分的结束地址
    (void *)   0xffffffff,       	                          //21：User实际的起始地址(串口更新后上位机写入)
    (void *)   0xffffffff,       	                          //22：User实际的结束地址(串口更新后上位机写入)
    (void *)   ((uint32_t)MCU_FLASH_ADDR_START+GEC_USER_INFO_START*MCU_SECTORSIZE),         //23：User信息区的起始地址
    (void *)   ((uint32_t)MCU_FLASH_ADDR_START+(GEC_USER_INFO_END+1)*MCU_SECTORSIZE-1),     //24：User信息区的结束地址
    (void *)   gcUpdateFlag,                                  //25：更新标志
    (void *)   reserved_func,                                 //26：BIOS中user串口中断处理程序
    (void *)   reserved_func,       	                      //27：预留
    (void *)   reserved_func,       	                      //28：预留
    (void *)   reserved_func,       	                      //29：预留
    (void *)   reserved_func,       	                      //30：预留
    //=====================================RT-Thread区===============================================
	(void *)   RTTHREAD,                                      //31：RT-Thread构件区
	(void *)   RTTHREAD_31_65,                                //32：该区域占用编号31-65
	(void *)   reserved_func,                                 //33：堆初始化函数预留，mbdeos保留，RT-Thread未用到
	(void *)   OS_start,                                      //34：操作系统启动函数
	(void *)   rt_thread_create,                                 //35：线程创建函数
	(void *)   rt_thread_startup,                                  //36：线程启动函数
	(void *)   rt_thread_delay,                                   //37：线程等待函数
	(void *)   rt_thread_self,       	                      //38：获取当前线程控制块地址
	(void *)   reserved_func,       	                      //39：预留
	(void *)   reserved_func,       	                      //40：预留
    //事件
    (void *)   rt_event_create,       	                          //41：事件创建函数
	(void *)   rt_event_recv,       	                          //42：事件接收函数
	(void *)   rt_event_send,       	                      	  //43：事件发送函数
    (void *)   reserved_func,       	                      //44：预留
	(void *)   reserved_func,       	                      //45：预留
	//信号量
    (void *)   rt_sem_create,       	                          //46：信号量创建函数
	(void *)   rt_sem_take,       	                              //47：信号量获取函数
	(void *)   rt_sem_release,       	                      	  //48：信号量释放函数
    (void *)   reserved_func,       	                          //49：获取信号量个数函数
	(void *)   reserved_func,       	                      //50：预留
	(void *)   reserved_func,       	                      //51：预留
	//互斥量
    (void *)   rt_mutex_create,       	                          //52：互斥量创建函数
	(void *)   rt_mutex_take,       	                          //53：互斥量获取函数
	(void *)   rt_mutex_release,       	                      //54：互斥量释放函数
    (void *)   reserved_func,       	                      //55：预留
	(void *)   reserved_func,      	                          //56：预留
	//消息队列
	(void *)   rt_mq_create,       	                          //57：消息队列创建函数
	(void *)   rt_mq_send,       	                              //58：消息发送函数
	(void *)   rt_mq_recv,       	                              //59：消息接收函数
    (void *)   rt_malloc,       	                              //60：动态申请空间函数
	(void *)   rt_sprintf,       	                              //61：此函数将填充格式化的字符串以缓冲
    (void *)   reserved_func,       	                          //62：获取消息队列消息数目
    //系统时间函数区
    (void *)   rt_tick_get,     	                              //63：获取systick嘀嗒计数值
	(void *)   reserved_func,      	                          //64：预留
	(void *)   reserved_func      	                          //65：预留
    //*********************************以下为构件区域（不删除）********************************
    //==================================新增构建示例2（2/2）===================================
    //	(void *)   CF_flash_read_logic,    	                      //41：flash读逻辑地址
    //	(void *)   CF_flash_read_physical, 	                      //42：flash写逻辑地址
    //	(void *)   CF_flash_protect,       	                      //43：flash扇区保护
    //	(void *)   CF_flash_unprotect,       	                  //44：flash扇区判空
    //	(void *)   CF_flash_isempty,     	                      //45：flash扇区解保护
    //	(void *)   CF_flash_write_DoubleWord,                     //46：flash双字写入操作
    //	(void *)   reserved_func,  			                      //47：预留
    //	(void *)   reserved_func,  			                      //48：预留
    //	(void *)   reserved_func,  			                      //49：预留
};


