diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c097e3a --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +# 忽略整个目录及其所有子文件和子目录 +/configs/ +/IAR/ +/IAR_Norflash/ +/SES/ +/configs/** +/IAR/** +/IAR_Norflash/** +/SES/** \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..5e4d050 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "files.associations": { + "ADC.C": "cpp" + } +} \ No newline at end of file diff --git a/24c02.c b/24c02.c new file mode 100644 index 0000000..71993f8 --- /dev/null +++ b/24c02.c @@ -0,0 +1,420 @@ +#include +#include +#include +#include "sdrv_spi.h" +#include "irq_num.h" +#include "clock_ip.h" +#include "IAP_Task.h" + +#define _nop_() udelay(1); +#define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();} +#define bit bool + +#define MASTER_TEST_LEN 100//෢100ֽڵ + +static uint8_t m_rx_buf_u8[MASTER_TEST_LEN] __attribute__((__aligned__(32))); +static uint8_t m_tx_buf_u8[MASTER_TEST_LEN] __attribute__((__aligned__(32))); + +static struct sdrv_spi g_master; + +void iic_start(void); +void iic_stop(void); +void iic_ack(bit ackbit); +void iic_sendbyte(unsigned char byt); +void wrbyte_24c02(unsigned int add,unsigned char dat); +void delay(unsigned char t); + +bit iic_waitack(void); +unsigned char i2c_recbyte(void); +unsigned char rdbyte_24c02(unsigned int add); +unsigned char wrEE_CRC_Bak(unsigned char add,unsigned char *eeData,unsigned char len,unsigned char addbak); +unsigned char rdEE_CRC_Bak(unsigned char add,unsigned char *eeData,unsigned char len,unsigned char addbak); + + +////FM25CL64ָ +#define FM25CL64_WREN 0x06 //ʹ +#define FM25CL64_WRDI 0x04 //ʧ +#define FM25CL64_RDSR 0x05 //״̬ +#define FM25CL64_WRSR 0x01 //д״̬ +#define FM25CL64_READ 0x03 // +#define FM25CL64_WRITE 0x02 //д + + +#define MAX_FM25CL64_LEN 8192//8kֽ + +static const struct spi_device_config device_mode0_8bits_ss0 = { + .sclk_freq = 1000000, + .cpol = SCK_IDLE_LOW, + .cpha = DATA_CPT_ON_FIRST_SCK_EDGE, + .cs_pol = CS_ACTIVE_LOW, + .cs_sel = CS_SEL_SS0, + .width = SPI_DATA_WIDTH_BYTE, + .fream_delay = 0, + .clk2cs_delay = 0, + .clk2cs_end_delay = 0, + .is_lsb_mode = false, + +}; + +static struct spi_common_config spi_master = { + .is_spi_mode = true, + .is_half_mode = false, + .is_master = true, + .base = APB_SPI6_BASE, + .irq = SPI6_SPI_INTR_NUM, +#if CONFIG_E3 + .clk = &g_ckgen_ip_spi_sf_1_to_4, +#else + .clk = &g_ckgen_ip_spi_sf_1_to_3, +#endif +}; + + + + + +void initSpi() +{ + /* Init Spi Instance */ + sdrv_spi_init(&g_master, &spi_master); + sdrv_spi_config_device(&g_master, &device_mode0_8bits_ss0); +} + + + + + + + +void SDAOut(bit c) +{ +// sdrv_pinctrl_set_input_select(GPIO_Y3, PIN_IS_CMOS); +// sdrv_gpio_set_pin_direction(GPIO_Y3, GPIO_DIR_OUT); + sdrv_gpio_set_pin_output_level(GPIO_Y3, c); +} + +void SCLOut(bit c) +{ + sdrv_gpio_set_pin_output_level(GPIO_Y2, c); +} + +void iic_start(void) +{ + SDAOut(1); + _nop_(); + SCLOut(1); + somenop; + SDAOut(0); + somenop; + SCLOut(0); +} + +void iic_stop(void) +{ + SDAOut(0); + _nop_(); + SCLOut(1); + somenop; + SDAOut(1); +} + +void iic_ack(bit ackbit) +{ + if(ackbit) + SDAOut(0); + else + SDAOut(1); + somenop; + SCLOut(1); + somenop; + SCLOut(0); + SDAOut(1); + somenop; +} + +bit iic_waitack(void) +{ + SDAOut(1); + somenop; + SCLOut(1); +// sdrv_pinctrl_set_input_select(GPIO_Y3, PIN_IS_CMOS_SCHMITT); +// sdrv_gpio_set_pin_direction(GPIO_Y3, GPIO_DIR_IN); + somenop; + if(sdrv_gpio_read_pin_input_level(GPIO_Y3)) + { + SCLOut(0); + iic_stop(); + return 0; + } + else + { + SCLOut(0); + return 1; + } +} + +void iic_sendbyte(unsigned char byt) +{ + unsigned char i; + for(i=0;i<8;i++) + { + if(byt&0x80) + SDAOut(1); + else + SDAOut(0); + somenop; + SCLOut(1); + byt <<= 1; + somenop; + SCLOut(0); + } +} + +unsigned char iic_recbyte(void) +{ + unsigned char da; + unsigned char i; + for(i=0;i<8;i++) + { + SCLOut(1); +// sdrv_pinctrl_set_input_select(GPIO_Y3, PIN_IS_CMOS_SCHMITT); +// sdrv_gpio_set_pin_direction(GPIO_Y3, GPIO_DIR_IN); + somenop; + da <<= 1; + +// P1_IOCR01 = 0x0020; // load port control register 1 + if(sdrv_gpio_read_pin_input_level(GPIO_Y3)) + da |= 0x01; + SCLOut(0); + somenop; + } + return da; +} + +void wrbyte_24c02(unsigned int add,unsigned char dat) +{ +#if EN_24C02 + unsigned char eeprom_page = 0; + unsigned char eeprom_add = 0; + unsigned char device_add = 0; +//------------------------------------------------- + eeprom_page = add/256;//ҳ + eeprom_add = add%256; + if(eeprom_page >= 3)//ĿǰE2һ4ҳ1k + { + eeprom_page = 3; + } + // Device Address 1100 0 p1 p0 R/W + device_add = (0xa0 | (eeprom_page << 1));// + +// ssdk_printf(SSDK_CRIT, "eeprom_page:0x%x\r\n", eeprom_page); +// ssdk_printf(SSDK_CRIT, "eeprom_add:0x%x\r\n", eeprom_add); +// ssdk_printf(SSDK_CRIT, "device_add:0x%x\r\n", device_add); + + iic_start(); + iic_sendbyte(device_add); + iic_waitack(); + iic_sendbyte(eeprom_add); + iic_waitack(); + iic_sendbyte(dat); + iic_waitack(); + iic_stop(); + udelay(3000);//ʱ3ms д궼Ҫʱ +#else + if(add >= MAX_FM25CL64_LEN)//ַ + { + printf("E2 len error!\r\n"); + } + else + { + m_tx_buf_u8[0] = FM25CL64_WREN;//дʹ + if (sdrv_spi_sync_transmit(&g_master, m_tx_buf_u8, m_rx_buf_u8,1,1)) + { + printf("E2 write Failed!\r\n"); + } + + m_tx_buf_u8[0] = FM25CL64_WRITE;//д + m_tx_buf_u8[1] = (uint8_t)( add >> 8);// 8λַ + m_tx_buf_u8[2] = (uint8_t)( add );// + m_tx_buf_u8[3] = dat;// + + if (sdrv_spi_sync_transmit(&g_master, m_tx_buf_u8, m_rx_buf_u8,4,4)) + { + printf("E2 write Failed!\r\n"); + } + } +#endif +} + +unsigned char rdbyte_24c02(unsigned int add) +{ + +#if EN_24C02 + unsigned char eeprom_page = 0; + unsigned char eeprom_add = 0; + unsigned char device_add = 0; + unsigned char da; +//------------------------------------------------- + + eeprom_page = add/256;//ҳ + eeprom_add = add%256; + if(eeprom_page >= 3)//ĿǰE2һ4ҳ1k + { + eeprom_page = 3; + } + + // Device Address 1100 000 R/W + iic_start(); + device_add = (0xa0 | (eeprom_page << 1));// αд + iic_sendbyte(device_add); + iic_waitack(); + iic_sendbyte(eeprom_add); + iic_waitack(); + iic_start(); + + device_add = (0xa1 | (eeprom_page << 1));// + + ssdk_printf(SSDK_CRIT, "device_add:0x%x\r\n", device_add); + + iic_sendbyte(device_add); + iic_waitack(); + da = iic_recbyte(); + iic_ack(0); + iic_stop(); +//CAN_sendAck(add, da); + return da; +#else + if(add >= MAX_FM25CL64_LEN)//ַ + { + printf("E2 len error!\r\n"); + } + else + { + m_tx_buf_u8[0] = FM25CL64_READ;// + m_tx_buf_u8[1] = (uint8_t)( add >> 8);// 8λַ + m_tx_buf_u8[2] = (uint8_t)( add );// + m_tx_buf_u8[3] = 0xFF;// + + if (sdrv_spi_sync_transmit(&g_master, m_tx_buf_u8, m_rx_buf_u8,4,4)) + { + printf("E2 write Failed!\r\n"); + } + + return m_rx_buf_u8[3]; + } +#endif + return 0xFF; +} + + +#ifdef _EEROM_CRC_ +#define POLY 0x1021 +/** +* Calculating CRC-16 in 'C' +* @para addr, start of data +* @para num, length of data +* @para crc, incoming CRC +*/ +unsigned int crc16(unsigned char *addr, int num, unsigned int crc) +{ + int i; + for (; num > 0; num--) /* Step through bytes in memory */ + { + crc = crc ^ ((*addr) << 8); /* Fetch byte from memory, XOR into CRC top byte*/ + addr++; + for (i = 0; i < 8; i++) /* Prepare to rotate 8 bits */ + { + if (crc & 0x8000) /* b15 is set... */ + crc = (crc << 1) ^ POLY; /* rotate and XOR with polynomic */ + else /* b15 is clear... */ + crc <<= 1; /* just rotate */ + } /* Loop for 8 bits */ + crc &= 0xFFFF; /* Ensure CRC remains 16-bit value */ + } /* Loop until num=0 */ + return(crc); /* Return updated CRC */ +} + +//дȷԶдһݣдͲд +unsigned char wrEE_CRC_Bak(unsigned char add,unsigned char *eeData,unsigned char len,unsigned char addbak) +{ + uword crc_Res; + unsigned char index; + unsigned char flagEEwrOK; + + crc_Res = crc16(eeData, len-2, 0xffff); //ݵУ + eeData[len-2] = (ubyte)(crc_Res ); + eeData[len-1] = (ubyte)(crc_Res >> 8); + + for(index=0;index +#include +#include +#include +#include "IAP_Task.h" +#include "wdt_refresh.h" +#include "pinmux_cfg.h" +#include +#include "sdrv_rstgen.h" +#include +#include +#include +#include "eth_cfg.h" +#include "sdrv_eth.h" +#include "interface_ethernet.h" + +u32 fileDataLen = 0; //IAP file data length +u32 fileCheckSum = 0; //IAP file data checksum +u32 flashProgramLen = 0; //length of data written to backup area +//iapFileHeader iapPara; //IAP file parameters + +CBL_CMD_LIST g_cmdList = {0}; +volatile uint16_t g_updateModeCnt = 0;// +uint32_t g_recvLen = 0; +uint16_t g_canAddr = 0; + +uint8_t des_ipaddr[4] = {192,168,17,3};//本机IP + + +//uint8_t CH395GWIPAddr[4] = {192,168,17,1};//网关 +//uint8_t CH395IPMask[4] = {255,255,255,0};//掩码 + +//uint8_t OwnMasterIpArr[4] = {192,168,17,117};//ַ目标IP + +uint8_t g_recvData[1028] = {0}; + +uint8_t g_recvDataCheck[1028] = {0}; + +uint8_t g_eflashRWBuffer[DATA_SIZE] = {0x00}; + +SystemDataRecord g_systemDataRecord = {0,0,0,0}; + +volatile uint8_t g_canRxMsgFlag = 0;//接收到CAN数据后的标志 +volatile uint16_t Eth_Rx_Flag = 0;//接收到CAN数据后的标志 + +extern uint8_t SocketId; + +ENET_RxBuf ENET_RxBuf_1 = {0}; +uint8_t g_RedData[1024] = {0}; +uint8_t debugdata[4] = {0,0,0,0}; + +Flash_RxBuf Flash_RxBuf_1 = {0}; +Flash_RxBuf Flash_RxBuf_2 = {0}; + +uint8_t writeflashTime = 0;//最大循环写入3次 +uint32_t AppBinSize = 0;//数据总长度,用来判断数据长度 +uint32_t WriteflashSize = 0;//写的flash数据长度 + +uint32_t OTA_CANTxID = 0x02;//默认发送ID为0x02 +uint32_t OTA_CANRxID = 0x01;//默认接收ID为0x01 +uint32_t WDT_CANRxID = 0x03;//默认接收ID为0x03 + +uint8_t flash_eth_time = 0;//接收启动超时标志 +uint8_t ethCmdSTT = 0; + +bool WDTReFresh_flag = false;//busoff标志 +/********************************************************************* + * @fn IAP_EEPROM_ERASE + * + * @brief erase Data-Flash block, minimal block is 256B + * + * @param Page_Address - the address of the page being erased. + * Length - Erased data length + * + * @return none + */ +void IAP_EEPROM_ERASE(uint32_t Page_Address, uint32_t Length) +{ + u16 pageNum = Length / FLASH_PAGE_SIZE; + u16 lastDataNum = Length % FLASH_PAGE_SIZE; + u32 Len_PAGE = 0; +//----------------------------------------------------- + if(0 != (lastDataNum))//判断是否整除 + { + pageNum = pageNum+1; + } + Len_PAGE = pageNum * FLASH_PAGE_SIZE;//计算擦写长度 + + sdrv_spi_nor_erase(&flash, Page_Address,Len_PAGE); +} + +/********************************************************************* + * @fn IAP_EEPROM_WRITE + * + * @brief write Data-Flash data block + * + * @param StartAddr - the address of the page being written. + * Buffer - data buff + * Length - written data length + * + * @return FLASH_Status + */ +void IAP_EEPROM_WRITE( u32 StartAddr, u8 *Buffer, u32 Length ) +{ + + u16 pageNum = Length / FLASH_PAGE_Write; + u16 lastDataNum = Length % FLASH_PAGE_Write; + u32 Len_PAGE = 0; + int write_sta = 0; +//----------------------------------------------------- + if(0 != (lastDataNum))//判断是否整除 + { + pageNum = pageNum+1; + } + Len_PAGE = pageNum * FLASH_PAGE_Write;//计算擦写长度 + write_sta = sdrv_spi_nor_write(&flash, StartAddr, Buffer, Len_PAGE); + + if(write_sta != 0) + { + printf("flash fail!"); + } +} + +/********************************************************************* + * @fn IAP_EEPROM_READ + * + * @brief read Data-Flash data block + * + * @param StartAddr - the address of the page being read. + * Buffer - data buff + * Length - read data length + * + * @return none + */ +void IAP_EEPROM_READ( u32 StartAddr, u8 *Buffer, u32 Length ) +{ + u16 pageNum = Length / FLASH_PAGE_Write; + u16 lastDataNum = Length % FLASH_PAGE_Write; + u32 Len_PAGE = 0; +//----------------------------------------------------- + if(0 != (lastDataNum))//判断是否整除 + { + pageNum = pageNum+1; + } + Len_PAGE = pageNum * FLASH_PAGE_Write;//计算擦写长度 + sdrv_spi_nor_read(&flash, StartAddr, Buffer, Len_PAGE); +} + + +/** + * bootMsgTx + * + * @param[in] Mode: 模式 0:can下载,1:以太网下载 + * @param[in] Cmd: 发送的命令 + * @param[in] *Buffer: 需要发送的数据 + * + * @brief 发送下载时反馈给上位机的数据 + */ +void bootMsgTx(uint8_t Mode,uint16_t Cmd,uint8_t *Buffer,uint8_t len) +{ + uint16_t port = 0; +//------------------------------------------------------------------------------ + switch(Mode) + { + case DOWNLOAD_CAN://can下载 + CAN_Send_Msg(&g_flexcan_handle,Cmd, FLEXCAN_STANDARD_FRAME, FLEXCAN_FrameTypeData, Buffer,len, TX_MB_INDEX); + break; + + case DOWNLOAD_ETH://以太网下载 + if(0x02 == Cmd) + { + port = BOOT_TX_PORT; + } + + UdpSendToData(UDPCB_1, Buffer,len, des_ipaddr, port); + break; + default:; + } +} +/** + * CAN_BootGetAddrData + * + * @param[in] none + * @return : 节点地址。 + * + * @brief 获取节点地址信息 + */ + +uint16_t CAN_BootGetAddrData(void) +{ + return 0x10;//返回的地址值需要根据实际情况进行修改 +} + +/** + * DataRecord_WriteUpgrade + * +* @param[in] upgradeFlag NORMAL_ON(0):normal start, CAN_BOOTLOADER_UPGRADE(1):bootloader upgrade +* @return 0, success.-1, fail, other:flash ctrl fail + * + * @brief Unlock the eflash control + */ +int DataRecord_WriteUpgrade(uint8_t upgradeFlag) +{ + IAP_EEPROM_READ( DATA_START_ADDR, (uint8_t *)&g_systemDataRecord, 4 ); + + IAP_EEPROM_ERASE(DATA_START_ADDR, FLASH_PAGE_SIZE); + + g_systemDataRecord.canBootloaderUpgrade = 0; + IAP_EEPROM_WRITE(DATA_START_ADDR, (uint8_t *)&g_systemDataRecord, 4); + + + IAP_EEPROM_READ( DATA_START_ADDR, (uint8_t *)&g_systemDataRecord, 4 ); + + if (g_systemDataRecord.canBootloaderUpgrade == upgradeFlag) + { + return 0; + } + else + { + return -1; + } +} +/** + * goToApp + * + * @param[in] none + * @return : none + * + * @brief APP跳转 + */ +void goToApp(void) +{ + /* global reset */ + /* soft reset flash */ +// flash.sw_rst = true;//跳转前先非初始化 +// sdrv_spi_nor_deinit(&flash); +// /* soft reset xspi host */ +// sdrv_spi_nor_drv_deinit(&flash); + + printf("goToApp\r\n"); + sdrv_gpio_set_pin_output_level(GPIO_B9, 0); //测量时间 + arch_invalidate_cache_range(0x01978000,0x8000);//清除 dcache + sdrv_core_force_remap(SDRV_REMAP_SF, APP_Flash_adr+0x10000000); + +} +/** + * CAN_BootExecutiveCommand + * + * @param[in] pRxMessage CAN总线消息 + * @return : none + * + * @brief 执行主机下发的命令 + */ +void CAN_BootExecutiveCommand(ENET_RxBuf *pRxMessage) +{ + uint16_t canCmd = 0;//ID的bit0~bit3位为命令码 + uint16_t crcData = 0; + static uint32_t s_startAddr = 0; + static uint32_t RgEasySize = 0; + uint8_t ENETTxMessage[8] = {0,0,0,0,0,0,0}; + static uint8_t CAN_BootExecutiveStt = 0; + uint8_t WriteE2adr = 0;//写地址中间值 + static uint8_t EnterRegion = 0;//区域 + + uint8_t psn_data[4]__attribute__((__aligned__(4))); //实际数据接收数据 注意4字节对齐 注意需要4字节对齐。 + +//--------------------------------------------------------------------------- + canCmd = (pRxMessage->RxData[0] << 8) + pRxMessage->RxData[1]; + + printf("Flash_RxBufLenNow :0x%x,Flash_RxBufSta :0x%x,Flash_RxBufLen:0x%x\r\n",Flash_RxBuf_1.Flash_RxBufLenNow, Flash_RxBuf_1.Flash_RxBufSta,Flash_RxBuf_1.Flash_RxBufLen); + printf("Flash2_RxBufLenNow :0x%x,Flash2_RxBufSta :0x%x,Flash2_RxBufLen:0x%x\r\n",Flash_RxBuf_2.Flash_RxBufLenNow, Flash_RxBuf_2.Flash_RxBufSta,Flash_RxBuf_2.Flash_RxBufLen); + printf("CAN_BootExecutiveStt :0x%x, canCmd:0x%x\r\n", CAN_BootExecutiveStt,canCmd); + + switch(canCmd) + { + case ENTER_UPDATE_MODE: //boot重启 + /* global reset */ + /* soft reset flash */ + flash.sw_rst = true; + sdrv_spi_nor_deinit(&flash); + /* soft reset xspi host */ + sdrv_spi_nor_drv_deinit(&flash); + + //20250822 修改为点击连接就修改IP,这样不需要外部来修改参数 + wrbyte_24c02(BOOT_DES_IP, (pRxMessage->RxData[2])); + wrbyte_24c02(BOOT_DES_IP+1,(pRxMessage->RxData[3])); + wrbyte_24c02(BOOT_DES_IP+2,(pRxMessage->RxData[4])); + wrbyte_24c02(BOOT_DES_IP+3,(pRxMessage->RxData[5])); + + + for(;;) + { + ssdk_printf(SSDK_INFO, "Restart!\r\n"); + udelay(100000); + } + break; + + case READ_VERSION: + if(BOOT0_index == (pRxMessage->RxData[2])) + { + ENETTxMessage[0] = (uint8_t)(READ_VERSION>>8); + ENETTxMessage[1] = (uint8_t)(READ_VERSION); + ENETTxMessage[2] = BOOT0_index; + ENETTxMessage[3] = rdbyte_24c02(BOOT0_VERSION_E2adr); + ENETTxMessage[4] = rdbyte_24c02(BOOT0_VERSION_E2adr+1); + ENETTxMessage[5] = rdbyte_24c02(BOOT0_VERSION_E2adr+2); + ENETTxMessage[6] = rdbyte_24c02(BOOT0_VERSION_E2adr+3); + ENETTxMessage[7] = rdbyte_24c02(BOOT0_VERSION_E2adr+4); + + bootMsgTx(Flash_RxBuf_1.Download_Mode, OTA_CANTxID, ENETTxMessage, 8); + } + else if(BOOT1_index == (pRxMessage->RxData[2])) + { + ENETTxMessage[0] = (uint8_t)(READ_VERSION>>8); + ENETTxMessage[1] = (uint8_t)(READ_VERSION); + ENETTxMessage[2] = BOOT1_index; + ENETTxMessage[3] = rdbyte_24c02(BOOT1_VERSION_E2adr); + ENETTxMessage[4] = rdbyte_24c02(BOOT1_VERSION_E2adr+1); + ENETTxMessage[5] = rdbyte_24c02(BOOT1_VERSION_E2adr+2); + ENETTxMessage[6] = rdbyte_24c02(BOOT1_VERSION_E2adr+3); + ENETTxMessage[7] = rdbyte_24c02(BOOT1_VERSION_E2adr+4); + bootMsgTx(Flash_RxBuf_1.Download_Mode, OTA_CANTxID, ENETTxMessage, 8); + } + else if(APP_index == (pRxMessage->RxData[2])) + { + ENETTxMessage[0] = (uint8_t)(READ_VERSION>>8); + ENETTxMessage[1] = (uint8_t)(READ_VERSION); + ENETTxMessage[2] = APP_index; + ENETTxMessage[3] = rdbyte_24c02(APP_VERSION_E2adr); + ENETTxMessage[4] = rdbyte_24c02(APP_VERSION_E2adr+1); + ENETTxMessage[5] = rdbyte_24c02(APP_VERSION_E2adr+2); + ENETTxMessage[6] = rdbyte_24c02(APP_VERSION_E2adr+3); + ENETTxMessage[7] = rdbyte_24c02(APP_VERSION_E2adr+4); + bootMsgTx(Flash_RxBuf_1.Download_Mode, OTA_CANTxID, ENETTxMessage, 8); + } + else{} + break; + + case CRC_UPDATE: + switch(CAN_BootExecutiveStt) + { + case 0: + if(BOOT0_index == (pRxMessage->RxData[4])) + { + IAP_EEPROM_ERASE(BOOT0_Flash_adr,FLASH_BLOCK_SIZE);// 擦除4K + s_startAddr = BOOT0_Flash_adr; + } + else if(BOOT1_index == (pRxMessage->RxData[4])) + { + IAP_EEPROM_ERASE(BOOT1_Flash_adr,FLASH_BLOCK_SIZE);// + s_startAddr = BOOT1_Flash_adr; + } + else if(APP_index == (pRxMessage->RxData[4])) + { + IAP_EEPROM_ERASE(APP_Flash_adr,FLASH_BLOCK_SIZE);// + s_startAddr = APP_Flash_adr; + } + else{} + RgEasySize = FLASH_BLOCK_SIZE;//擦除长度,擦除多长那就下载多长 + CAN_BootExecutiveStt = 10; + break; + //循环烧写flash + case 10: + if(FlashBufComplete == (Flash_RxBuf_1.Flash_RxBufSta))//接收完成 缓存1 + { + crcData = crc16_ccitt(&Flash_RxBuf_1.RxData[0], Flash_RxBuf_1.Flash_RxBufLen); + + if(crcData == (Flash_RxBuf_1.Flash_RxBufCRC)) + { + Flash_RxBuf_1.Flash_RxBufSta = FlashBufCRCPass; + ENETTxMessage[0] = (uint8_t)(CRC_UPDATE>>8); + ENETTxMessage[1] = (uint8_t)(CRC_UPDATE); + ENETTxMessage[2] = CRC_Pass; + +// ssdk_printf(SSDK_CRIT, "0x%x,ENETTxMessage[0]:0x%x,0x%x,CRC_Pass:0x%x\r\n",ENETTxMessage[0],ENETTxMessage[2]); + + bootMsgTx(Flash_RxBuf_1.Download_Mode, OTA_CANTxID, ENETTxMessage, 3); + + if(RgEasySize >= Flash_RxBuf_1.Flash_RxBufLen)//擦除长度是否大于写数据长度 + { +// ssdk_printf(SSDK_CRIT, "RxData1[0] :0x%x,RxData1[1]:0x%x\r\n",Flash_RxBuf_1.RxData[0],Flash_RxBuf_1.RxData[1]); + + External_wdt_refresh();//喂狗 4K喂狗一次 + IAP_EEPROM_WRITE(s_startAddr, &Flash_RxBuf_1.RxData[0], Flash_RxBuf_1.Flash_RxBufLen);//20230209修改写flash不需要转换为32位,就是单个字节 + s_startAddr = s_startAddr + (Flash_RxBuf_1.Flash_RxBufLen);//烧写地址累加 + RgEasySize = RgEasySize - Flash_RxBuf_1.Flash_RxBufLen;//擦除总长度-当前写入的长度 + Flash_RxBuf_1.Flash_RxBufSta = FlashBufWrite; + CAN_BootExecutiveStt = 10; + } + else//擦除之后也得写1K,已经校验通过了 + { + External_wdt_refresh();//喂狗 4K喂狗一次 + CAN_BootExecutiveStt = 10;//擦除长度写完,重新擦除 + IAP_EEPROM_ERASE(s_startAddr,FLASH_BLOCK_SIZE);// + RgEasySize = FLASH_BLOCK_SIZE;//重新为4K + +// ssdk_printf(SSDK_CRIT, "RxData1[0] :0x%x,RxData1[1]:0x%x\r\n",Flash_RxBuf_1.RxData[0],Flash_RxBuf_1.RxData[1]); + + IAP_EEPROM_WRITE(s_startAddr, &Flash_RxBuf_1.RxData[0], Flash_RxBuf_1.Flash_RxBufLen);//20230209修改写flash不需要转换为32位,就是单个字节 + s_startAddr = s_startAddr + (Flash_RxBuf_1.Flash_RxBufLen);//烧写地址累加 + RgEasySize = RgEasySize - Flash_RxBuf_1.Flash_RxBufLen;//擦除总长度-当前写入的长度 + Flash_RxBuf_1.Flash_RxBufSta = FlashBufWrite; + } + } + else//CRC 校验不通过 + { + CAN_BootExecutiveStt = 10; + + Flash_RxBuf_1.Flash_RxBufSta = FlashBufCRCFail; + ENETTxMessage[0] = (uint8_t)(CRC_UPDATE>>8); + ENETTxMessage[1] = (uint8_t)(CRC_UPDATE); + ENETTxMessage[2] = CRC_Fail; + + ssdk_printf(SSDK_CRIT, "CCCRCfail:0x%x,RxCRCfail:0x%x\r\n",crcData,Flash_RxBuf_1.Flash_RxBufCRC); + bootMsgTx(Flash_RxBuf_1.Download_Mode, OTA_CANTxID, ENETTxMessage, 3); + + } + } + else if(FlashBufComplete == (Flash_RxBuf_2.Flash_RxBufSta))//接收完成 缓存2 + { + crcData = crc16_ccitt(&Flash_RxBuf_2.RxData[0], Flash_RxBuf_2.Flash_RxBufLen); + if(crcData == (Flash_RxBuf_2.Flash_RxBufCRC)) + { + CAN_BootExecutiveStt = 10; + + Flash_RxBuf_2.Flash_RxBufSta = FlashBufCRCPass; + ENETTxMessage[0] = (uint8_t)(CRC_UPDATE>>8); + ENETTxMessage[1] = (uint8_t)(CRC_UPDATE); + ENETTxMessage[2] = CRC_Pass; + + bootMsgTx(Flash_RxBuf_1.Download_Mode, OTA_CANTxID, ENETTxMessage, 3); + + if(RgEasySize > 0) + { +// ssdk_printf(SSDK_CRIT, "RxData2[0] :0x%x,RxData2[1]:0x%x\r\n",Flash_RxBuf_2.RxData[0],Flash_RxBuf_2.RxData[1]); + External_wdt_refresh();//喂狗 4K喂狗一次 + IAP_EEPROM_WRITE(s_startAddr, &Flash_RxBuf_2.RxData[0], Flash_RxBuf_2.Flash_RxBufLen);//20230209修改写flash不需要转换为32位,就是单个字节 + s_startAddr = s_startAddr + (Flash_RxBuf_2.Flash_RxBufLen);//烧写地址累加 + RgEasySize = RgEasySize - Flash_RxBuf_2.Flash_RxBufLen;//擦除总长度-当前写入的长度 + Flash_RxBuf_2.Flash_RxBufSta = FlashBufWrite; + CAN_BootExecutiveStt = 10; + } + else//擦除之后也得写1K,已经校验通过了 + { + External_wdt_refresh();//喂狗 4K喂狗一次 + CAN_BootExecutiveStt = 10;//擦除长度写完,重新擦除 + IAP_EEPROM_ERASE(s_startAddr,FLASH_BLOCK_SIZE);// + RgEasySize = FLASH_BLOCK_SIZE;//重新为4K + +// ssdk_printf(SSDK_CRIT, "RxData2[0] :0x%x,RxData2[1]:0x%x\r\n",Flash_RxBuf_2.RxData[0],Flash_RxBuf_2.RxData[1]); + + IAP_EEPROM_WRITE(s_startAddr, &Flash_RxBuf_2.RxData[0], Flash_RxBuf_2.Flash_RxBufLen);//20230209修改写flash不需要转换为32位,就是单个字节 + s_startAddr = s_startAddr + (Flash_RxBuf_2.Flash_RxBufLen);//烧写地址累加 + RgEasySize = RgEasySize - Flash_RxBuf_2.Flash_RxBufLen;//擦除总长度-当前写入的长度 + Flash_RxBuf_2.Flash_RxBufSta = FlashBufWrite; + } + } + else//CRC 校验不通过 + { + CAN_BootExecutiveStt = 10; + + Flash_RxBuf_2.Flash_RxBufSta = FlashBufCRCFail; + ENETTxMessage[0] = (uint8_t)(CRC_UPDATE>>8); + ENETTxMessage[1] = (uint8_t)(CRC_UPDATE); + ENETTxMessage[2] = CRC_Fail; + + bootMsgTx(Flash_RxBuf_1.Download_Mode, OTA_CANTxID, ENETTxMessage, 3); + + ssdk_printf(SSDK_CRIT, "CCCRCfail:0x%x,RxCRCfail:0x%x\r\n",crcData,Flash_RxBuf_2.Flash_RxBufCRC); + } + } + else//都没有接收完成 + { + CAN_BootExecutiveStt = 10; + } + break; + default:break; + } + break; + + case Write_VERSION: + if(BOOT0_index == (pRxMessage->RxData[2])) + { + WriteE2adr = BOOT0_VERSION_E2adr; + } + else if(BOOT1_index == (pRxMessage->RxData[2])) + { + WriteE2adr = BOOT1_VERSION_E2adr; + } + else if(APP_index == (pRxMessage->RxData[2])) + { + WriteE2adr = APP_VERSION_E2adr; + } + else{} + EnterRegion = (pRxMessage->RxData[2]);//下次跳转区域 + + wrbyte_24c02(WriteE2adr,pRxMessage->RxData[3]); + wrbyte_24c02(WriteE2adr+1,pRxMessage->RxData[4]); + wrbyte_24c02(WriteE2adr+2,pRxMessage->RxData[5]); + wrbyte_24c02(WriteE2adr+3,pRxMessage->RxData[6]); + wrbyte_24c02(WriteE2adr+4,pRxMessage->RxData[7]); + + ENETTxMessage[0] = (uint8_t)(Write_VERSION>>8); //读取E2看是否正常写入 + ENETTxMessage[1] = (uint8_t)(Write_VERSION); + ENETTxMessage[2] = (pRxMessage->RxData[2]); + ENETTxMessage[3] = rdbyte_24c02(WriteE2adr); + ENETTxMessage[4] = rdbyte_24c02(WriteE2adr+1); + ENETTxMessage[5] = rdbyte_24c02(WriteE2adr+2); + ENETTxMessage[6] = rdbyte_24c02(WriteE2adr+3); + ENETTxMessage[7] = rdbyte_24c02(WriteE2adr+4); + bootMsgTx(Flash_RxBuf_1.Download_Mode, OTA_CANTxID, ENETTxMessage, 8); + break; + case ENTER_APP: + if((BOOT0_index == EnterRegion) || (BOOT1_index == EnterRegion)) + { + flash.sw_rst = true; + sdrv_spi_nor_deinit(&flash); + /* soft reset xspi host */ + sdrv_spi_nor_drv_deinit(&flash); + for(;;) + { + ssdk_printf(SSDK_INFO, "Restart!\r\n"); + udelay(100000); + }//重启 + } + else if(APP_index == (pRxMessage->RxData[2])) + { + goToApp(); + } + else{} + break; + case EXCUTE_APP: + wrbyte_24c02(Update_Flg_E2adr,NORMAL_ON); + udelay(3000);//延时3ms + goToApp(); + break; + + case READ_PSN://读取PSN + if(BOOT0_index == (pRxMessage->RxData[2])) + { + IAP_EEPROM_READ( BOOT0_PSN_adr,psn_data,4); + } + else if(BOOT1_index == (pRxMessage->RxData[2])) + { + IAP_EEPROM_READ( BOOT1_PSN_adr,psn_data, 4); + } + else + { + } + + ENETTxMessage[0] = (uint8_t)(READ_PSN>>8); //读取E2看是否正常写入 + ENETTxMessage[1] = (uint8_t)(READ_PSN); + ENETTxMessage[2] = (pRxMessage->RxData[2]); + ENETTxMessage[3] = psn_data[3]; + ENETTxMessage[4] = psn_data[2]; + ENETTxMessage[5] = psn_data[1]; + ENETTxMessage[6] = psn_data[0]; + + bootMsgTx(Flash_RxBuf_1.Download_Mode, OTA_CANTxID, ENETTxMessage, 7); + break; + + case WRITE_IP://修改IP 重启后有效 + wrbyte_24c02(BOOT_DES_IP, (pRxMessage->RxData[2])); + wrbyte_24c02(BOOT_DES_IP+1,(pRxMessage->RxData[3])); + wrbyte_24c02(BOOT_DES_IP+2,(pRxMessage->RxData[4])); + wrbyte_24c02(BOOT_DES_IP+3,(pRxMessage->RxData[5])); + + ENETTxMessage[0] = (uint8_t)(WRITE_IP>>8); //读取E2看是否正常写入 + ENETTxMessage[1] = (uint8_t)(WRITE_IP); + ENETTxMessage[2] = rdbyte_24c02(BOOT_DES_IP ); + ENETTxMessage[3] = rdbyte_24c02(BOOT_DES_IP+1); + ENETTxMessage[4] = rdbyte_24c02(BOOT_DES_IP+2); + ENETTxMessage[5] = rdbyte_24c02(BOOT_DES_IP+3); + bootMsgTx(Flash_RxBuf_1.Download_Mode, OTA_CANTxID, ENETTxMessage, 6); + break; + + case LOST_FRAME://丢帧 + ENETTxMessage[0] = (uint8_t)(CRC_UPDATE>>8); + ENETTxMessage[1] = (uint8_t)(CRC_UPDATE); + ENETTxMessage[2] = CRC_Fail; + printf("Lost Frame"); + bootMsgTx(Flash_RxBuf_1.Download_Mode, OTA_CANTxID, ENETTxMessage, 3); + break; + + default:break; + } +} + +/** + * ReadUpgradeFlag + * +* @param[in] +* @return none + * + * @brief read upgrade flag from flash + */ +void ReadUpgradeFlag(void) +{ + static uint16_t lost_cnt = 0; + uint8_t flash_buf[8] = {0,0,0,0,0,0,0,0}; +//-------------------------------------------------------------------- + if ( (g_canRxMsgFlag) || (Eth_Rx_Flag != 0) ) + { + g_canRxMsgFlag = 0; + Eth_Rx_Flag --; + CAN_BootExecutiveCommand(&ENET_RxBuf_1); + } + + if(1 == flash_eth_time)//超过2s,标志未清楚认为是丢帧 + { + lost_cnt ++; + if(lost_cnt >= 2000)//2s 定时 + { + lost_cnt = 0; + flash_eth_time = 0; + ethCmdSTT = 0;//清空接收状态,重新开始接收 + + flash_buf[0] = (uint8_t)(CRC_UPDATE>>8); + flash_buf[1] = (uint8_t)(CRC_UPDATE); + flash_buf[2] = CRC_Fail; + printf("Lost Frame"); + bootMsgTx(Flash_RxBuf_1.Download_Mode, OTA_CANTxID, flash_buf, 3); + } + } + else + { + lost_cnt = 0; + } +} + + + + + + diff --git a/IAP_Task.h b/IAP_Task.h new file mode 100644 index 0000000..4f5dfd8 --- /dev/null +++ b/IAP_Task.h @@ -0,0 +1,288 @@ + +#ifndef __IAP_TASK_H__ +#define __IAP_TASK_H__ + +#include +#include +#include +#include +#include + + +#define u8 uint8_t +#define u16 uint16_t +#define u32 uint32_t + + + +#define EN_24C02 0 + +#define UDP_RECE_BUF_LEN 1472 + +#define TimeOutPeriod 10 /* Timer period, in Ms. */ +/*address assignment */ +#define BIM_IMAGE_START_ADD ((uint32_t) 0x08000000) +#define BIM_IMAGE_MAX_SIZE 0xA000 + +#define USER_IMAGE_START_ADD ((uint32_t) 0x0800A000) +#define USER_IMAGE_MAX_SIZE 0x1B000 + +#define BACKUP_IMAGE_START_ADD ((uint32_t) 0x08025000) +#define BACKUP_IMAGE_MAX_SIZE 0x1B000 + +#define UPDATA_FLAG_STORAGE_ADD ((uint32_t) 0x0803FF00) + +#define FLASH_BLOCK_SIZE 4096 + +#define READ_DATA_LEN 2048 + +#define FLASH_PAGE_SIZE 0x1000 + +#define FLASH_PAGE_Write 4//дȡ + +/*Flash operation information*/ +#define BIN_INF_LEN 512 + + +#define BOOT_DEBUG 1 + +#define CMD_FAILD 0x0 +#define ONLINE_CHECK 0x1 +#define ERASE_FLASH 0x3 +#define SET_BAUDRATE 0x4 +#define BLOCK_WRITE_INFO 0x5 +#define WRITE_BLOCK_FLASH 0x6 +#define BLOCK_READ_INFO 0x7 +#define READ_BLOCK_FLASH 0x8 + +#define CMD_SUCCESS 0xB +#define RESTART_Soft 0xD + + + +#define ENTER_UPDATE_MODE 0x1 +#define READ_VERSION 0x100 +#define CRC_UPDATE 0x101 +#define Write_VERSION 0x103 +#define ENTER_APP 0x102 +#define EXCUTE_APP 0x02 +#define WDT_Refresh 0x200 +#define READ_PSN 0x400 +#define WRITE_IP 0x501 + +#define DELAY_LOST_FRAME 0x304//ʱ֡ +#define LOST_FRAME 0x305//֡ + +#define CRC_Pass 0x1 //CRCУͨ +#define CRC_Fail 0x2 //CRCУ鲻ͨ + + + +#define DOWNLOAD_CAN 0x0 //ͨcanس +#define DOWNLOAD_ETH 0x1 //̫ͨس + + + +#define BOOT0_index 1 +#define BOOT1_index 2 +#define APP_index 3 + + +#define BPT_PSN_adr 0xFF0 //PSNBPTײĵַ +#define BPT_IPSN_adr 0xFF4 //IPSNBPTײĵַ ൱PSNȡ + +#define BOOT0_Flash_adr 0x7000 //עַҪ4K +#define BOOT0_PSN_adr BOOT0_Flash_adr + BPT_PSN_adr //boot0 PSN +#define BOOT0_IPSN_adr BOOT0_Flash_adr + BPT_IPSN_adr //boot0 IPSN + +#define BOOT1_Flash_adr 0x9C000 +#define BOOT1_PSN_adr BOOT1_Flash_adr + BPT_PSN_adr //boot1 PSN +#define BOOT1_IPSN_adr BOOT1_Flash_adr + BPT_IPSN_adr //boot1 IPSN + +#define APP_Flash_adr 0x140000 + + + + +#define Update_Flg_E2adr 0x0 //ռ1ֽ +#define BOOT0_VERSION_E2adr 0x1 //ռ5ֽ +ʱ+汾 20 24 08 08 01 +#define BOOT1_VERSION_E2adr 0x6 //ռ5ֽ +ʱ+汾 20 24 08 08 01 +#define APP_VERSION_E2adr 0xB //ռ5ֽ +ʱ+汾 20 24 08 08 01 +#define BOOT_DES_IP 0x10 //ռ4ֽ IP 192.168.17.3 + + + + + +#define CMD_WIDTH 4 +#define CMD_MASK 0xF +#define ADDR_MASK 0x1FFFFFF + + +#define DATA_SIZE (0x100) /* 256 bytes */ +#define DATA_START_ADDR ((uint32_t)0x0803FF00)//0x0803FF00 //256ڴ0x0803FF00- 0x0803FFFF 256K + + + +typedef enum{ + NORMAL_ON = 0, + CAN_BOOTLOADER_UPGRADE, +}UpgradeFlag; + + + +typedef struct _CBL_CMD_LIST{ + volatile uint8_t EraseFlash; //APP + volatile uint8_t WriteBlockFlash; //Զֽʽд + volatile uint8_t ReadBlockFlash; //Զֽʽ + volatile uint8_t BlockWriteInfo; //öֽдزдʼַ + volatile uint8_t BlockReadInfo; //öֽݶزʼַ + volatile uint8_t OnlineCheck; //ڵǷ + volatile uint8_t CmdSuccess; //ִгɹ + volatile uint8_t CmdFaild; //ִʧ + volatile uint8_t SetBaudRate; //ýڵ㲨 + volatile uint8_t ExcuteApp; //ִӦó + volatile uint8_t EnterUpdateMode; //ģʽ + volatile uint8_t EnterAPP; //APP + volatile uint8_t Restart; // + volatile uint8_t Undefine2; //δ + volatile uint8_t Undefine3; //δ +} CBL_CMD_LIST,*PCBL_CMD_LIST; + + +typedef struct _Flash_RxBuf +{ + uint8_t Flash_RxBufSta; // flash ״̬ 0 ûнɣ1ݽɣ2CRCУ鲻ͨ3CRCУͨ4д + uint16_t Flash_RxBufCRC; //CRC + uint32_t Flash_RxBufLen; // + uint32_t Flash_RxBufLenNow; //ǰ + uint8_t Download_Mode; //ģʽ 0 can 1̫ + uint8_t RxData[1024]__attribute__((__aligned__(4))); //ʵݽ ע4ֽڶ עҪ4ֽڶ롣 +}Flash_RxBuf,*UnFlash_RxBuf; + + + +typedef struct _Flash_info +{ + uint16_t length; // + uint8_t dataBuffer[1100]; //ƥcan +}Flash_info,*UnFlash_info; + + + + +#define FlashBufInitial 0x0//1kݳʼ״̬ +#define FlashBufInComplete 0x1//д +#define FlashBufComplete 0x2//1kݽ +#define FlashBufCRCFail 0x3//CRCУʧ +#define FlashBufCRCPass 0x4//CRCУճɹ +#define FlashBufWrite 0x5//д + + + + +//typedef struct +//{ +// u8 iapFileFlag[8]; //8-byte IAP flag, fixed as "WCHNET", the extra space is 0 +// u32 iapFileLen; //4 bytes IAP file length, which is bin file length + 512 bytes +// u32 iapFileCheckSum; //4-byte checksum +//}iapFileHeader; +// +//typedef struct{ +// u16 readIndex; +// u16 writeIndex; +// u16 buffUsedLen; +// u8 *dataBuff; +//}ethDataDeal; + + + + + + +typedef struct _ENET_RxBuf +{ + uint8_t readPos; ///< read position in buffer + uint8_t writePos; ///< write position in buffer + uint8_t recvCount; ///< receive message count in buffer + uint8_t RxData[8]; //ʵݽ +}ENET_RxBuf,*pENET_RxBuf; + + +typedef struct { + volatile uint8_t canBootloaderUpgrade; //CAN־λ + uint8_t test1; + uint8_t test2; + uint8_t test3; +} SystemDataRecord;//ṹAPPͬ + + + + + + +extern struct flash_info *flash_info; +extern struct spi_nor flash; + +extern flexcan_handle_t *handle; +extern void flexcan_transfer_callback(flexcan_handle_t *handle, + flexcan_status_e status, uint32_t result, + void *userData); + + + + +//ⲿݽṹ +extern u8 IPAddr[4];//IP address +extern u8 GWIPAddr[4];//Gateway IP address +extern u8 IPMask[4];//subnet mask +extern u8 DESIP[4];//destination IP address +extern u16 desport;//destination port +extern u16 srcport;//source port +extern SystemDataRecord g_systemDataRecord; +//extern ethDataDeal dataDeal; +//extern iapFileHeader iapPara; +extern u32 fileDataLen; +extern u32 fileCheckSum; +extern ENET_RxBuf ENET_RxBuf_1; +extern CBL_CMD_LIST g_cmdList; +extern volatile uint8_t g_canRxMsgFlag ;//յCANݺı־ +extern uint16_t g_canAddr; +extern uint8_t g_recvData[1028]; +extern uint32_t g_recvLen; +extern uint32_t OTA_CANTxID ;//ĬϷIDΪ0x02 +extern uint32_t OTA_CANRxID ;//ĬϽIDΪ0x01 +extern uint32_t WDT_CANRxID ;//ĬϽIDΪ0x03 +extern Flash_RxBuf Flash_RxBuf_1; +extern Flash_RxBuf Flash_RxBuf_2; + +extern bool WDTReFresh_flag;//busoff־ +extern volatile uint16_t Eth_Rx_Flag;//յCANݺı־ +extern uint8_t des_ipaddr[4];//IP +extern uint8_t flash_eth_time;// +extern uint8_t ethCmdSTT; + +//ⲿ + +void goToApp(void); +u8 IAPCopyFlashDeal(void); +void IAPParaInit(void); +void saveUpdatedFile(void); +void receUpdatedFile(u8 id); +void IAPFileParaCheck(u8 id); +uint16_t CAN_BootGetAddrData(void); +void ReadUpgradeFlag(void); +void IAP_EEPROM_ERASE_108k(u32 StartAddr); +void IAP_EEPROM_READ( u32 StartAddr, u8 *Buffer, u32 Length ); +void IAP_EEPROM_ERASE(uint32_t Page_Address, u32 Length); +void IAP_EEPROM_WRITE( u32 StartAddr, u8 *Buffer, u32 Length ); +int DataRecord_WriteUpgrade(uint8_t upgradeFlag); +void WCHNET_HandleGlobalInt(void); + +unsigned char rdbyte_24c02(unsigned int add); +void wrbyte_24c02(unsigned int add,unsigned char dat); +void initSpi(); + + + +#endif /* __IAP_TASK_H__ */ diff --git a/btm_init.c b/btm_init.c new file mode 100644 index 0000000..281dffe --- /dev/null +++ b/btm_init.c @@ -0,0 +1,104 @@ +#include "regs_base.h" +#include "irq_num.h" +#include "btm_init.h" + + +static sdrv_btm_t gstsdrv_btm_timer0; +sdrv_btm_t gstsdrv_btm_timer1; + +volatile uint8_t Btm10ms = 0; +volatile uint8_t Btm1ms = 0; + + +#define DEVICE_BASE(dev) _DEVICE_BASE(dev) +#define _DEVICE_BASE(dev) APB_##dev##_BASE + +#define DEVICE_INTR(dev) _DEVICE_INTR(dev) +#define _DEVICE_INTR(dev) dev##_INTR_NUM + + + +/*SDRV_BTM_G0时钟来源于APB clock, APB clock等于150MHz*/ +/*SDRV_BTM_G0分频之后,clock等于1M*/ +static sdrv_btm_cfg_t timer0_config = { + .base = DEVICE_BASE(BTM2), + .irq = DEVICE_INTR(BTM2_O_BTM), + .tmr_id = SDRV_BTM_G0, + .tmr_cfg = { + .si_val = 74, /*输入时钟每(si_val + 1)cycle, G0计数器增加inc_val个*/ + .inc_val = 1, + .frc_rld_rst_cnt_en = true, /*默认是true,表示初始化时是否对counter清零。*/ + .term_use_mode = SDRV_BTM_DIRECT, /*设置overflow值立即生效,而不是等到下一周期生效。*/ + .cmp_use_mode = SDRV_BTM_DIRECT, /*设置compare值立即生效,而不是等到下一周期生效。*/ + .cnt_dir = SDRV_BTM_CNT_UP, /*设置计数器的值是向上增长*/ + .cnt_mode = SDRV_BTM_CONTINOUS_MODE, /*设置计数器是连续模式*/ + } +}; + + +/*SDRV_BTM_G1时钟来源于外部晶振,等于24MHz*/ +/*SDRV_BTM_G1分频之后,clock等于1M*/ +static sdrv_btm_cfg_t timer1_config = { + .base = DEVICE_BASE(BTM2), + .irq = DEVICE_INTR(BTM2_O_BTM), + .tmr_id = SDRV_BTM_G1, + .tmr_cfg = { + .si_val = 23, + .inc_val = 1, + .frc_rld_rst_cnt_en = true, + .term_use_mode = SDRV_BTM_DIRECT, + .cmp_use_mode = SDRV_BTM_DIRECT, + .cnt_dir = SDRV_BTM_CNT_UP, + .cnt_mode = SDRV_BTM_CONTINOUS_MODE, + } +}; + +//回调处理,10ms定时标志 +static void timer1_handle(void *arg) +{ + static int timer1_count = 0; + timer1_count++; + + Btm1ms = 1; + + if(timer1_count >= 10) + { + timer1_count = 0; + Btm10ms = 1; + } +} + + +/*启用g1计数器*/ +int btm_init(void) +{ + sdrv_btm_init(&gstsdrv_btm_timer1, &timer0_config);//定时器1初始化 + sdrv_btm_set_callback(&gstsdrv_btm_timer1, timer1_handle, &gstsdrv_btm_timer1);//设定回调函数 + sdrv_btm_start(&gstsdrv_btm_timer1, BTM_TYPE_PERIOD, BTM_TIME_US, 1000);//设定1000us定时 + + sdrv_btm_init(&gstsdrv_btm_timer0, &timer1_config);//定时器0初始化 + sdrv_btm_start(&gstsdrv_btm_timer0, BTM_TYPE_PERIOD, BTM_TIME_MS, ~0);//设定1ms定时 + return 0; +} + +//获取当前计数器时间,lwip用 +uint32_t current_time(void) +{ + return sdrv_btm_get_current_time(&gstsdrv_btm_timer0) / 1000; +} + +//获取当前计数器时间us +uint32_t getCurrentTime(void) +{ + return sdrv_btm_get_current_time(&gstsdrv_btm_timer0); +} + + + + + + + + + + diff --git a/btm_init.h b/btm_init.h new file mode 100644 index 0000000..d1db201 --- /dev/null +++ b/btm_init.h @@ -0,0 +1,16 @@ +#ifndef __BTM_INIT_H__ +#define __BTM_INIT_H__ + +#include +#include +#include +#include "sdrv_btm.h" +// +extern volatile uint8_t Btm10ms; +extern volatile uint8_t Btm1ms; +extern sdrv_btm_t gstsdrv_btm_timer1; + +// +int btm_init(void); + +#endif /* __BTM_INIT_H__ */ \ No newline at end of file diff --git a/crc16.h b/crc16.h new file mode 100644 index 0000000..90533fb --- /dev/null +++ b/crc16.h @@ -0,0 +1,51 @@ +#ifndef _CRC16_H_ +#define _CRC16_H_ + +static const uint16_t crc16tab[256] = { + 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, + 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, + 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, + 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, + 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485, + 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d, + 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4, + 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, + 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823, + 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b, + 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, + 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, + 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, + 0xedae, 0xfd8f, 0xcdcc, 0xdded, 0xad2a, 0xbd0b, 0x8d68, 0x9d49, + 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70, + 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78, + 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f, + 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067, + 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, + 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256, + 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d, + 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, + 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c, + 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634, + 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab, + 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3, + 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a, + 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92, + 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, + 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, + 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, + 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0 +}; + +__inline unsigned short crc16_ccitt(const unsigned char *buf, unsigned int len) +{ + register unsigned int counter; + register unsigned short crc = 0; + for( counter = 0; counter < len; counter++) + crc = (crc<<8) ^ crc16tab[((crc>>8) ^ *(unsigned char *)buf++)&0x00FF]; + return crc; +} +extern __inline unsigned short crc16_ccitt(const unsigned char *buf, unsigned int len); + +#endif /* _CRC16_H_ */ + + diff --git a/flexcan_init.c b/flexcan_init.c new file mode 100644 index 0000000..253b904 --- /dev/null +++ b/flexcan_init.c @@ -0,0 +1,249 @@ + +#include "flexcan_init.h" +#include "IAP_Task.h" +#include +#include +#include + + +#define TX_PADDING_VAL (0xA5) + +static uint8_t g_rxFifoDataBuf[8]; +static flexcan_frame_t g_frameBuf; + +bool busoff_occur_flag = false;//busoff־ + + +void flexcan_config_rx_fifo(flexcan_handle_t *handle, + flexcan_rx_fifo_config_t *config) +{ + flexcan_frame_t *rx_fifo_frame = &g_frameBuf; + rx_fifo_frame->dataBuffer = &g_rxFifoDataBuf[0]; + + flexcan_set_rx_fifo_config(handle, config); + + for (uint8_t i = 0; i < USED_MB_FOR_FIFO; + i++) { + flexcan_set_rx_individual_mask(handle, i, config->filter_tab[i].filter_mask); + } + + /* rx by interrupt */ + flexcan_fifo_transfer_t Xfer = {rx_fifo_frame}; + flexcan_receive_fifo_nonblocking(handle, &Xfer); +} + + +/********************************************************************* + * @fn CAN_Send_Msg + * + * @brief CAN Transmit function. + * + * @param CANx- CAN1 or CAN2 + * ID - Message ID + * IDE - CAN_Id_Standard or CAN_Id_Extended + * RTR - CAN_RTR_Data or CAN_RTR_Remote + * msg - Transmit data buffer. + * len - Data length. + * + * @return 0 - Send successful. + * 1 - Send failed. + */ +uint8_t CAN_Send_Msg( flexcan_handle_t *handle, uint32_t ID, flexcan_frame_format_e ide, flexcan_frame_type_e rtr, uint8_t *msg, uint8_t len, uint8_t tx_index) +{ + uint16_t i = 0; +//------------------------------------------------------------------------------ + + flexcan_frame_t frame = {.id = ID, + .length = len, + .type = rtr, + .format = ide, + .dataBuffer = msg}; + flexcan_mb_transfer_t xfer = {&frame, tx_index}; + + while( ( flexcan_get_mb_state(handle, tx_index) != FLEXCAN_StateIdle ) && (i < 0xFFF) ) + { + i++; + } + + if( i == 0xFFF ) + { + return 1; + + } + else + { + flexcan_send_nonblocking(handle, &xfer, TX_PADDING_VAL); + return 0; + } +} + + +/********************************************************************* + * @fn flexcan_transfer_callback + * + * @brief erase Data-Flash block, minimal block is 256B + * + * @param Page_Address - the address of the page being erased. + * Length - Erased data length + * + * @return none + */ +uint32_t debugaa = 0; +void flexcan_transfer_callback(flexcan_handle_t *handle, + flexcan_status_e status, uint32_t result, + void *userData) +{ +// uint8_t ip_addr[4] = {0,0,0,0}; +// uint16_t i = 0; + uint16_t FrameHeader = 0; +// uint16_t canAddr = 0; + flexcan_frame_t *buf = (flexcan_frame_t *)userData; +// uint32_t Rgflexcan_transferCRC = 0; + static uint8_t canCmdSTT = 0; +// static uint32_t CANFlashNowLen1 = 0; +// static uint32_t CANFlashNowLen2 = 0; + +// uint32_t debugARR1[2] = {0,0}; +//-------------------------------------------------------------- +// ssdk_printf(SSDK_CRIT, "status:0x%x\r\n",status); + switch (status) + { + case FLEXCAN_RX_IDLE: + break; + + case FLEXCAN_RX_FIFO_IDLE: + + + if(OTA_CANRxID == (buf->id))//IDΪ1 + { + g_canRxMsgFlag = 1; + FrameHeader = ( (buf->dataBuffer[0] << 8) | (buf->dataBuffer[1]) ); + +// ssdk_printf(SSDK_CRIT, "FrameHeader:0x%x\r\n",FrameHeader); + + switch(canCmdSTT) + { + case 0: + if(FrameHeader == CRC_UPDATE )//CRCָ + { + memcpy(&ENET_RxBuf_1.RxData[0],buf->dataBuffer,buf->length);// + + Flash_RxBuf_1.Download_Mode = DOWNLOAD_CAN; + + if( (FlashBufInitial == (Flash_RxBuf_1.Flash_RxBufSta)) || (FlashBufCRCFail == (Flash_RxBuf_1.Flash_RxBufSta)) || (FlashBufWrite == (Flash_RxBuf_1.Flash_RxBufSta)) )//ʼ״̬дɣcrcط + { + Flash_RxBuf_1.Flash_RxBufCRC = ( (buf->dataBuffer[2] << 8) | (buf->dataBuffer[3]) );//CRC + Flash_RxBuf_1.Flash_RxBufLen = ( (buf->dataBuffer[5] << 16) | (buf->dataBuffer[6] << 8) | (buf->dataBuffer[7]) );//֡ + Flash_RxBuf_1.Flash_RxBufLenNow = 0; + Flash_RxBuf_1.Flash_RxBufSta = FlashBufInComplete;//л״̬ + canCmdSTT = 10; + } + else if( (FlashBufInitial == (Flash_RxBuf_2.Flash_RxBufSta)) || (FlashBufCRCFail == (Flash_RxBuf_2.Flash_RxBufSta)) || (FlashBufWrite == (Flash_RxBuf_2.Flash_RxBufSta)) )//ʼ״̬дɣcrcط + { + Flash_RxBuf_2.Flash_RxBufCRC = ( (buf->dataBuffer[2] << 8) | (buf->dataBuffer[3]) );//CRC + Flash_RxBuf_2.Flash_RxBufLen = ( (buf->dataBuffer[5] << 16) | (buf->dataBuffer[6] << 8) | (buf->dataBuffer[7]) );//֡ + Flash_RxBuf_2.Flash_RxBufLenNow = 0; + Flash_RxBuf_2.Flash_RxBufSta = FlashBufInComplete;//л״̬ + canCmdSTT = 20; + } + else{} + } + else//ָ + { + memcpy(&ENET_RxBuf_1.RxData[0],buf->dataBuffer,buf->length);// + canCmdSTT = 0; + } + break; + + case 10://ȡflash + ENET_RxBuf_1.RxData[0] = (uint8_t)(CRC_UPDATE >> 8);//λ ֶIDж + ENET_RxBuf_1.RxData[1] = (uint8_t)(CRC_UPDATE); + + memcpy(&Flash_RxBuf_1.RxData[Flash_RxBuf_1.Flash_RxBufLenNow],buf->dataBuffer,buf->length);// + Flash_RxBuf_1.Flash_RxBufLenNow = (Flash_RxBuf_1.Flash_RxBufLenNow) + (buf->length); + if( (Flash_RxBuf_1.Flash_RxBufLenNow) >= (Flash_RxBuf_1.Flash_RxBufLen) )//ճҪ + { + Flash_RxBuf_1.Flash_RxBufSta = FlashBufComplete;//л״̬ + canCmdSTT = 0; + } + else + { + + Flash_RxBuf_1.Flash_RxBufSta = FlashBufInComplete;//л״̬ + canCmdSTT = 10; + } + break; + + + case 20://2 + ENET_RxBuf_1.RxData[0] = (uint8_t)(CRC_UPDATE >> 8);//λ ֶIDж + ENET_RxBuf_1.RxData[1] = (uint8_t)(CRC_UPDATE); + memcpy(&Flash_RxBuf_2.RxData[Flash_RxBuf_2.Flash_RxBufLenNow],buf->dataBuffer,buf->length);// + Flash_RxBuf_2.Flash_RxBufLenNow = (Flash_RxBuf_2.Flash_RxBufLenNow) + (buf->length); + + if( (Flash_RxBuf_2.Flash_RxBufLenNow) >= (Flash_RxBuf_2.Flash_RxBufLen) )//ճҪ + { + Flash_RxBuf_2.Flash_RxBufSta = FlashBufComplete;//л״̬ + canCmdSTT = 0; + } + else + { + Flash_RxBuf_2.Flash_RxBufSta = FlashBufInComplete;//л״̬ + canCmdSTT = 20; + } + break; + } + } + else if(WDT_CANRxID == (buf->id))//WDT ID + { + FrameHeader = ( (buf->dataBuffer[0] << 8) | (buf->dataBuffer[1]) ); + + if(WDT_Refresh == FrameHeader)//ι + { + + WDTReFresh_flag = true;//յ֡͸ + ssdk_printf(SSDK_CRIT, "WDT_Refresh:0x%x\r\n", WDTReFresh_flag); + } + } + else{} + break; + + case FLEXCAN_TX_IDLE: + break; + + case FLEXCAN_WAKEUP_TIMEOUT: + break; + + case FLEXCAN_WAKEUP_MATCH: + break; + + case FLEXCAN_ERROR_STATUS: + busoff_occur_flag = true; + break; + + default: + break; + } +} + + + +/* reinitialize the controller. */ +void flexcan_busoff_recovery_demo(flexcan_handle_t *handle) +{ + flexcan_deinit(handle); + flexcan_init(handle, &g_flexcan_config); + + flexcan_enable_interrupts(handle, FLEXCAN_BusOffInterruptEnable); + + /* assign fifo only for rx. */ + flexcan_config_rx_fifo(handle, &flexcan_fifo_cfg); + + /* assign mailbox14-20 for tx. */ + for (uint8_t i = TX_MB_INDEX; i < (TX_MB_INDEX + TX_MAILBOX_NUM); + i++) { + + flexcan_set_tx_mb_config(handle, i, true); + } +} + diff --git a/flexcan_init.h b/flexcan_init.h new file mode 100644 index 0000000..fe7d9f7 --- /dev/null +++ b/flexcan_init.h @@ -0,0 +1,29 @@ + +#ifndef __flexcan_init_H__ +#define __flexcan_init_H__ + +#include "regs_base.h" +#include "irq_num.h" +#include + +#define TX_MB_INDEX (USED_MB_FOR_FIFO) + + + +//ⲿ +void flexcan_transfer_callback(flexcan_handle_t *handle,flexcan_status_e status, uint32_t result,void *userData); +void flexcan_config_rx_fifo(flexcan_handle_t *handle,flexcan_rx_fifo_config_t *config); +uint8_t CAN_Send_Msg( flexcan_handle_t *handle, uint32_t ID, flexcan_frame_format_e ide, flexcan_frame_type_e rtr, uint8_t *msg, uint8_t len, uint8_t tx_index); +void flexcan_busoff_recovery_demo(flexcan_handle_t *handle); + + + + +//ⲿ +extern flexcan_handle_t g_flexcan_handle; +extern bool busoff_occur_flag;//־ +extern bool WDTReFresh_flag;//±־ + + + +#endif /* __IAP_TASK_H__ */ \ No newline at end of file diff --git a/interface_ethernet.c b/interface_ethernet.c new file mode 100644 index 0000000..4466b98 --- /dev/null +++ b/interface_ethernet.c @@ -0,0 +1,293 @@ +#include +#include +#include "debug.h" +#include +#include +#include "interface_ethernet.h" +#include "eth_cfg.h" +#include "lwip/timeouts.h" +#include "sdrv_eth.h" +#include "IAP_Task.h" + +// +#define MAX_BUFFER_SIZE (sizeof(((RequestContext *)0)->param_request->arr)) +#define MAX_PACKET_SIZE 1024 // СΪ1K + + +struct udp_pcb *udpcb_1; +struct udp_pcb *udpcb_2; +struct udp_pcb *udpcb_3; + +bool eth_pool_rx = false; + + +UnEthernetFault ethernet_fault_Info = { + .bit_data.auto_count = 0, + .bit_data.manual_count = 0, + .bit_data.auto_state = 0, + .bit_data.manual_state = 0, +}; + + + +StrEthernetParameter ethernet_parameter = { + .local_ip = {192,168,17,20}, + .mask = {255,255,255,0}, + .computer_ip = {192,168,17,3}, + .local_communication_port = 8011, + .Local_upper_port = 8000, + .Local_download_port = 7811, + .upper_ip = {192,168,17,3}, + .download_ip = {192,168,17,183}, + .target_upper_port = 8000, + .target_download_port = 7811, + .target_communication_port = 8011, +}; + + + +static bool g_eth1_rx_pkt; + + + +static void eth_dma_rx_int_cb(struct net_driver_s *dev) +{ + if (dev == &g_eth1_dev) + g_eth1_rx_pkt = true; +} + + + + void lwip_Ethernet(void) +{ + // ETH֡ݸLWIPЭջ + // ʹܽжϣΪISRdisableжϣˣ + // жϽձ־(g_eth1_rx_pkt)Ĵв + // µĽжϱӦԣﲻԭ⡣ + if ((!eth_pool_rx && g_eth1_rx_pkt) || eth_pool_rx) + { + g_eth1_rx_pkt = false; + dwc_eth_rx(&g_eth1_dev, eth_pool_rx); + } + + // LWIPЭջӿڣLWIPʱ + sys_check_timeouts(); + + // printf("lwipInterface spend time:%d\n",getCurrentTime() - time_boot);//app˶೤ʱ +} + + +//err_t +//udp_bind(struct udp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port) + +void UdpSendToData(uint8_t udpcbID, uint8_t *buf, uint16_t len, uint8_t *sip, uint16_t port) +{ + struct pbuf *DesPuff = NULL; + ip4_addr_t Desaddr; +//---------------------------------------------------------------------------------------------------- + IP4_ADDR(&Desaddr,sip[0],sip[1],sip[2],sip[3]);//ֵַת + + DesPuff = pbuf_alloc(PBUF_TRANSPORT, len, PBUF_POOL); /* ڴ */ + + pbuf_take(DesPuff, buf, len); /* g_lwip_demo_sendbufеݴpbufṹ */ + + if(UDPCB_1 == udpcbID) + { + udp_sendto(udpcb_1, DesPuff, &Desaddr, port); + } + else if(UDPCB_2 == udpcbID) + { + udp_sendto(udpcb_2, DesPuff, &Desaddr, port); + } + else + { + } + pbuf_free(DesPuff); /* ͷڴ */ +} + +// udpcbID UDP +//recv ص +//port 󶨶˿ +void UDP_Echo_Init(uint8_t udpcbID, udp_recv_fn recv, uint16_t port) +{ +//------------------------------------------ + if(UDPCB_1 == udpcbID) + { + /* ½һƿ*/ + udpcb_1 = udp_new(); + ASSERT(udpcb_1); + /* 󶨶˿ں */ + udp_bind(udpcb_1, IP_ADDR_ANY, port); + /* עݻص */ + udp_recv(udpcb_1, recv, (void *)udpcbID); + } + else if(UDPCB_2 == udpcbID) + { + /* ½һƿ*/ + udpcb_2 = udp_new(); + ASSERT(udpcb_2); + /* 󶨶˿ں */ + udp_bind(udpcb_2, IP_ADDR_ANY, port); + /* עݻص */ + udp_recv(udpcb_2, recv, (void *)udpcbID); + } + else if(UDPCB_3 == udpcbID) + { + /* ½һƿ*/ + udpcb_3 = udp_new(); + ASSERT(udpcb_3); + /* 󶨶˿ں */ + udp_bind(udpcb_3, IP_ADDR_ANY, port); + /* עݻص */ + udp_recv(udpcb_3, recv, (void *)udpcbID); + } + else + { + } + +} + + +void udp_Callback_2(void *arg, struct udp_pcb *upcb, struct pbuf *p, const ip_addr_t *addr, u16_t port) +{ + uint16_t FrameHeader = 0; + + uint8_t *Abuf = (uint8_t *)(p->payload); + +// Eth_Rx_Flag = 1; + + FrameHeader = ( (Abuf[0] << 8) | (Abuf[1]) ); + + if(WDT_Refresh == FrameHeader)//ι + { + WDTReFresh_flag = true;//յ֡͸ + ssdk_printf(SSDK_CRIT, "WDT_Refresh:0x%x\r\n", WDTReFresh_flag); + } + + pbuf_free(p); +} + + +void udp_Callback_1(void *arg, struct udp_pcb *upcb, struct pbuf *p, const ip_addr_t *addr, u16_t port) +{ + uint8_t *Abuf = (uint8_t *)(p->payload); + + Flash_info Bbuf = {0}; + Flash_info *buf = &Bbuf; + uint16_t FrameHeader = 0; +//------------------------------------------------------------------------------ + des_ipaddr[0] = addr->addr & 0xff; /* IADDR4 */ + des_ipaddr[1] = (addr->addr >> 8) & 0xff; /* IADDR3 */ + des_ipaddr[2] = (addr->addr >> 16) & 0xff; /* IADDR2 */ + des_ipaddr[3] = (addr->addr >> 24) & 0xff; /* IADDR1 */ + + Eth_Rx_Flag ++; + Flash_RxBuf_1.Download_Mode = DOWNLOAD_ETH;//̫ģʽ + + + for(uint16_t i = 0;i < (p->len);i++)//ת + { + buf->dataBuffer[i] = Abuf[i]; + } + buf->length = p->len;// + + FrameHeader = ( (buf->dataBuffer[0] << 8) | (buf->dataBuffer[1]) ); + + switch(ethCmdSTT) + { + case 0: + if(FrameHeader == CRC_UPDATE )//CRCָ + { + memcpy(&ENET_RxBuf_1.RxData[0],buf->dataBuffer,buf->length);// + + flash_eth_time = 1; + + if( (FlashBufInitial == (Flash_RxBuf_1.Flash_RxBufSta)) || (FlashBufCRCFail == (Flash_RxBuf_1.Flash_RxBufSta)) || (FlashBufWrite == (Flash_RxBuf_1.Flash_RxBufSta)) )//ʼ״̬дɣcrcط + { + Flash_RxBuf_1.Flash_RxBufCRC = ( (buf->dataBuffer[2] << 8) | (buf->dataBuffer[3]) );//CRC + Flash_RxBuf_1.Flash_RxBufLen = ( (buf->dataBuffer[5] << 16) | (buf->dataBuffer[6] << 8) | (buf->dataBuffer[7]) );//֡ + Flash_RxBuf_1.Flash_RxBufLenNow = 0; + Flash_RxBuf_1.Flash_RxBufSta = FlashBufInComplete;//л״̬ + ethCmdSTT = 10; + } + else if( (FlashBufInitial == (Flash_RxBuf_2.Flash_RxBufSta)) || (FlashBufCRCFail == (Flash_RxBuf_2.Flash_RxBufSta)) || (FlashBufWrite == (Flash_RxBuf_2.Flash_RxBufSta)) )//ʼ״̬дɣcrcط + { + Flash_RxBuf_2.Flash_RxBufCRC = ( (buf->dataBuffer[2] << 8) | (buf->dataBuffer[3]) );//CRC + Flash_RxBuf_2.Flash_RxBufLen = ( (buf->dataBuffer[5] << 16) | (buf->dataBuffer[6] << 8) | (buf->dataBuffer[7]) );//֡ + Flash_RxBuf_2.Flash_RxBufLenNow = 0; + Flash_RxBuf_2.Flash_RxBufSta = FlashBufInComplete;//л״̬ + ethCmdSTT = 20; + } + else{} + } + else if(1024 == buf->length )//ֱӷ1KݣûյCRCֱӷݣΪ֡ + { + ENET_RxBuf_1.RxData[0] = (uint8_t)(LOST_FRAME >> 8);//λ ֶIDж + ENET_RxBuf_1.RxData[1] = (uint8_t)(LOST_FRAME); + ethCmdSTT = 0; + } + else//ָ + { + memcpy(&ENET_RxBuf_1.RxData[0],buf->dataBuffer,buf->length);// + ssdk_printf(SSDK_CRIT, "ENET_RxBuf[0] :0x%x, ENET_RxBuf[1]:0x%x\r\n", ENET_RxBuf_1.RxData[0],ENET_RxBuf_1.RxData[1]); + ethCmdSTT = 0; + } + break; + + case 10: + ENET_RxBuf_1.RxData[0] = (uint8_t)(CRC_UPDATE >> 8);//λ ֶIDж + ENET_RxBuf_1.RxData[1] = (uint8_t)(CRC_UPDATE); + + memcpy(&Flash_RxBuf_1.RxData[Flash_RxBuf_1.Flash_RxBufLenNow],buf->dataBuffer,buf->length);// + Flash_RxBuf_1.Flash_RxBufLenNow = (Flash_RxBuf_1.Flash_RxBufLenNow) + (buf->length); + if( (Flash_RxBuf_1.Flash_RxBufLenNow) >= (Flash_RxBuf_1.Flash_RxBufLen) )//ճҪ + { + Flash_RxBuf_1.Flash_RxBufSta = FlashBufComplete;//л״̬ + ethCmdSTT = 0; + flash_eth_time = 0; + } + else + { + flash_eth_time = 1; + Flash_RxBuf_1.Flash_RxBufSta = FlashBufInComplete;//л״̬ + ethCmdSTT = 10; + } + break; + + case 20://2 + ENET_RxBuf_1.RxData[0] = (uint8_t)(CRC_UPDATE >> 8);//λ ֶIDж + ENET_RxBuf_1.RxData[1] = (uint8_t)(CRC_UPDATE); + memcpy(&Flash_RxBuf_2.RxData[Flash_RxBuf_2.Flash_RxBufLenNow],buf->dataBuffer,buf->length);// + Flash_RxBuf_2.Flash_RxBufLenNow = (Flash_RxBuf_2.Flash_RxBufLenNow) + (buf->length); + + if( (Flash_RxBuf_2.Flash_RxBufLenNow) >= (Flash_RxBuf_2.Flash_RxBufLen) )//ճҪ + { + Flash_RxBuf_2.Flash_RxBufSta = FlashBufComplete;//л״̬ + ethCmdSTT = 0; + flash_eth_time = 0; + } + else + { + flash_eth_time = 1; + Flash_RxBuf_2.Flash_RxBufSta = FlashBufInComplete;//л״̬ + ethCmdSTT = 20; + } + break; + } + pbuf_free(p); +} + + +// APPģijʼ +void ethernetInterfaceInit(void) +{ +//----------------------------------- + if (!eth_pool_rx) { + // ʹDMA RxжϡTxδʹжϣΪETHʺܸߣ + // Txжϴʱٶȡ + dwc_eth_enable_dma_rx_int(&g_eth1_dev, eth_dma_rx_int_cb); + } + +} + + \ No newline at end of file diff --git a/interface_ethernet.h b/interface_ethernet.h new file mode 100644 index 0000000..82b5da1 --- /dev/null +++ b/interface_ethernet.h @@ -0,0 +1,108 @@ +#ifndef _INTERFACE_ETHERNET_H_ +#define _INTERFACE_ETHERNET_H_ + +#include "lwip/err.h" +#include "lwip/inet.h" +#include "lwip/tcp.h" +#include "lwip/udp.h" + +#include "lwip/netif.h" +#include "lwip/ip.h" +#include "lwip/init.h" +#include "netif/etharp.h" +#include "lwip/pbuf.h" + + + + + +//̫Ϣ +typedef struct _StrEthernetFault +{ + uint8_t auto_count; //Զݼ + uint8_t manual_count; //ֶݼ + uint8_t auto_state; // Զ״̬ | 0 1 + uint8_t manual_state; // ֶ״̬ | 0 1 +} StrEthernetFault; + +typedef union _UnEthernetFault +{ + StrEthernetFault bit_data; // ʹöĽṹ + uint8_t arr[sizeof(StrEthernetFault)]; // ͨṹȷС +} UnEthernetFault; + + +extern UnEthernetFault ethernet_fault_Info; + + + + + + + + + + + +typedef struct +{ + uint8_t local_ip[4]; + uint8_t mask[4]; + uint16_t Local_upper_port; + uint16_t Local_download_port; + uint16_t local_communication_port; + uint8_t computer_ip[4]; + uint8_t upper_ip[4]; + uint8_t download_ip[4]; + uint16_t target_upper_port; + uint16_t target_download_port; + uint16_t target_communication_port; + +} StrEthernetParameter; + + + + + + + + + + + + + + + + + + + + +#define UDPCB_1 1//ͨѶ˿ +#define UDPCB_2 2//λ˿ +#define UDPCB_3 3//λ˿ + + + +#define DOWNLOAR_PORT 7812 //ʼʱĶ˿ڣն˿ +#define BOOT_TX_PORT 7811 //ʱдĶ˿ڣĿ˿ڣ˭ +#define WDT_PORT 7813 //ʼʱĶ˿ڣն˿ + + + +//ⲿ +void UDP_Echo_Init(uint8_t udpcbID, udp_recv_fn recv, uint16_t port); +void UdpSendToData(uint8_t udpcbID, uint8_t *buf, uint16_t len, uint8_t *sip, uint16_t port); + +void udp_Callback_1(void *arg, struct udp_pcb *upcb, struct pbuf *p, const ip_addr_t *addr, u16_t port); +void udp_Callback_2(void *arg, struct udp_pcb *upcb, struct pbuf *p, const ip_addr_t *addr, u16_t port); +void udp_Callback_3(void *arg, struct udp_pcb *upcb, struct pbuf *p, const ip_addr_t *addr, u16_t port); +void ethernetTimerProcess(void); +void ethernetInterfaceInit(void); +void lwip_Ethernet(void); +//ⲿ +extern struct udp_pcb *udpcb_1; +extern StrEthernetParameter ethernet_parameter; + +#endif /*ETH_DEMO_H */ \ No newline at end of file diff --git a/main.c b/main.c new file mode 100644 index 0000000..3a82acf --- /dev/null +++ b/main.c @@ -0,0 +1,288 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "board.h" +#include "irq_num.h" +#include +#include "IAP_Task.h" +#include "btm_init.h" +#include "flexcan_init.h" +#include "irq.h" +#include +#include +#include "eth_cfg.h" +#include "sdrv_eth.h" +#include "interface_ethernet.h" + +extern sdrv_scr_t g_scr_ctrl; + +uint32_t udp_length = 0; + + +#define RFD_ENABLE 0 + +static struct spi_nor_host spi_nor_host = {0}; +static struct xspi_pdata xspi = {0}; +struct spi_nor flash = {0}; +struct flash_info *flash_info; +flexcan_handle_t g_flexcan_handle; + +static struct xspi_config host_config = { + .id = 0, + .apb_base = APB_XSPI1PORTA_BASE, + .direct_base = XSPI1_XSPI1PORTA_BASE, +}; + +static struct spi_nor_config config = { + .id = 0, + .cs = 0, + .baudrate = 20000000, + .xfer_mode = SPI_NOR_XFER_POLLING_MODE, + .dev_mode = SPI_NOR_DEV_SINGLE_MODE, + .sw_rst = false, /* config soft reset spi norflash */ + .async_mode = false, +#ifdef CONFIG_HYPERBUS_MODE + .hyperbus_mode = CONFIG_HYPERBUS_MODE, +#else + .hyperbus_mode = false, +#endif +}; + +void xspi_lockstep_enable(bool flag) +{ +#if ((CONFIG_E3210) || (CONFIG_E3110)) + scr_signal_t signal = SCR_SF_XSPI1_SRC_CFG_LOCKSTEP_MODE_N; +#else + scr_signal_t signal = SCR_SF_XSPI1_LOCKSTEP_DISABLE; +#endif + + sdrv_rstgen_assert(&rstsig_xspi1b); + sdrv_rstgen_assert(&rstsig_xspi1a); + + udelay(10u); + scr_set(&g_scr_ctrl, &signal, !flag); + udelay(10u); + + sdrv_rstgen_deassert(&rstsig_xspi1a); + sdrv_rstgen_deassert(&rstsig_xspi1b); +} + +void xspi_parallel_enable(bool flag) +{ + scr_signal_t signal = SCR_SF_XSPI1_SRC_CFG_PARALLEL_MODE; + + sdrv_rstgen_assert(&rstsig_xspi1b); + sdrv_rstgen_assert(&rstsig_xspi1a); + + udelay(10u); + scr_set(&g_scr_ctrl, &signal, flag); + udelay(10u); + + sdrv_rstgen_deassert(&rstsig_xspi1a); + sdrv_rstgen_deassert(&rstsig_xspi1b); +} + +void board_norflash_init(void) +{ + bool locksetp_mode = false; + bool parallel_mode = false; + /* get xspi1a clk node */ + sdrv_ckgen_node_t *clk = CLK_NODE(g_ckgen_ip_xspi1a); + + /* config dev spi nor dev single mode */ + switch (config.dev_mode) { + case SPI_NOR_DEV_LOCKSTEP_MODE: + locksetp_mode = true; + break; + + case SPI_NOR_DEV_PARALLEL_MODE: + parallel_mode = true; + break; + + default: + break; + } + + /* close locksetp/parallel mode */ + xspi_lockstep_enable(locksetp_mode); + xspi_parallel_enable(parallel_mode); + + /* initializes xspi host */ + host_config.ref_clk = sdrv_ckgen_get_rate(clk); + sdrv_xspi_host_init(&spi_nor_host, &xspi, &host_config); + spi_nor_host.clk = clk; + sdrv_ckgen_set_rate(clk, config.baudrate); + ssdk_printf(SSDK_CRIT, "xspi clock rate is %u!\r\n", + sdrv_ckgen_get_rate(clk)); + + /* initializes spi nor device */ + if (sdrv_spi_nor_init(&flash, &spi_nor_host, &config)) { + ssdk_printf(SSDK_CRIT, "spinor init failed!\r\n"); + return; + } + + /* get flash info data information */ + flash_info = sdrv_spi_nor_get_info(&flash); + ssdk_printf(SSDK_CRIT, + "spinor flash size = 0x%llx, sector_size = 0x%x \r\n", + flash_info->size, flash_info->sector_size); + +#if RFD_ENABLE + /* enable rfd */ + uint8_t rfd_mask = 0; + if(!check_rfd(host_config.direct_base, &rfd_mask) && rfd_mask) { + sdrv_spi_nor_enable_rfd(&flash, rfd_mask); + } +#endif + + return; +} + +uint8_t mainCnt = 0; +//uint8_t mainCntarr[8] = {0x56,0x88,0x98,0x79,0x23}; +//uint8_t mainCntarrRx[8] = {0,0,0,0,0}; +//uint32_t timeus = 0; + + +int main(void) +{ + uint8_t BOOT_Arr[2] = {0x00,0x01}; + static uint8_t RgWDT500msflg = 0; +//--------------------------------------------------------------- + /* reset module */ + board_reset_init(); + + /* initializes clock source */ + sdrv_ckgen_init(&g_clock_config); + + /*VICʼ*/ + irq_initialize(VIC1_BASE, IRQ_MAX_INTR_NUM); + + /* config spinor pinmux */ + sdrv_pinctrl_init(NUM_OF_CONFIGURED_PINS, g_pin_init_config); + + sdrv_gpio_set_pin_output_level(GPIO_B9, 1); //ʱ + + External_wdt_refresh(); + + // TimerʼṩLWIP sys_nowӿڻȡǰʱ + btm_init(); + + /* board debug console uart init */ + board_debug_console_init(); + + sdrv_gpio_set_pin_output_level(GPIO_H12, 0); //CANʹ + /* initialize the FlexCAN handle. */ + flexcan_handle_t *handle = &g_flexcan_handle; + + flexcan_create_handle(handle, FLEXCAN6, (void *)APB_CANFD6_BASE, + CANFD6_CANFD_INTR_NUM, flexcan_transfer_callback, + NULL); + + /* initialize flexCAN. */ + flexcan_init(handle, &g_flexcan_config); + + /* unfreeze the flexCAN by demo. */ + flexcan_freeze(handle, false); + + /* enable busoff interrupt. */ + flexcan_enable_interrupts(handle, FLEXCAN_BusOffInterruptEnable);// + + /* enable irq. */ + irq_attach(handle->irq_num, flexcan_irq_handler, handle); + irq_enable(handle->irq_num); + + /* assign fifo only for rx. */ + flexcan_config_rx_fifo(handle, &flexcan_fifo_cfg); + + /* assign mailbox14-20 for tx. */ + for (uint8_t i = TX_MB_INDEX; i < (TX_MB_INDEX + TX_MAILBOX_NUM); i++) + { + flexcan_set_tx_mb_config(handle, i, true); + } + sdrv_gpio_set_pin_output_level(GPIO_Y1, 0); //E2дʹ + + External_wdt_refresh(); + + board_norflash_init();//flash ʼ + + initSpi(); + // ETHʼ + board_eth_init(); +// wdt_init(WDT_OUTms); + +// wrbyte_24c02(0x00,1); + + UDP_Echo_Init(UDPCB_1, udp_Callback_1, DOWNLOAR_PORT); + + ethernetInterfaceInit(); + + g_systemDataRecord.canBootloaderUpgrade = rdbyte_24c02(0x00); + + des_ipaddr[0] = rdbyte_24c02(BOOT_DES_IP);//ȡصIP + des_ipaddr[1] = rdbyte_24c02(BOOT_DES_IP+1);//ȡصIP + des_ipaddr[2] = rdbyte_24c02(BOOT_DES_IP+2);//ȡصIP + des_ipaddr[3] = rdbyte_24c02(BOOT_DES_IP+3);//ȡصIP + + if(g_systemDataRecord.canBootloaderUpgrade == NORMAL_ON)//0ǽAPPֵ1BOOT + { + goToApp(); + } + else + { + CAN_Send_Msg(handle,OTA_CANTxID, FLEXCAN_STANDARD_FRAME, FLEXCAN_FrameTypeData, BOOT_Arr,2, TX_MB_INDEX);//boot ֡ + UdpSendToData(UDPCB_1, BOOT_Arr, 2, des_ipaddr, BOOT_TX_PORT); + } + + ssdk_printf(SSDK_INFO, "SSDK E3 boot! verison V1.22 \r\n"); + + for(;;) + { + lwip_Ethernet(); + + if(1 == Btm1ms) + { + ReadUpgradeFlag(); // + Btm1ms = 0; + } + + if(1 == Btm10ms)//10ms + { + Btm10ms = 0; +// if (busoff_occur_flag == true) //busoff +// { +// flexcan_busoff_recovery_demo(handle); +// busoff_occur_flag = false; +// } + + RgWDT500msflg ++ ; + if(RgWDT500msflg >= 5) + { + RgWDT500msflg = 0; + External_wdt_refresh(); + + printf("RUN11! \r\n"); + } + } + } +} diff --git a/readme.txt b/readme.txt new file mode 100644 index 0000000..0b8122b --- /dev/null +++ b/readme.txt @@ -0,0 +1,35 @@ + +## 简介 + +本demo介绍如何使用E3芯片GPIO的input、output和interrupt功能。 + +## 硬件连接 + +- e3_176_ref参考板 +- Jlink debugger +- 连接UART用于log输出 + +## 测试方法 + +使用以下工具编译本demo,并生成可执行文件: + +- SEGGER Embedded Studio (SES) +- IAR for ARM + +使用JLINK下载镜像到e3_176_ref开发板,并启动调试。 + +- 当出现SSDK E3 GPIO Demo Start!打印,代表GPIO初始化完成 +- 按下SW401(GPIO_A9),触发中断 +- 中断处理函数中读取GPIO_A9电平,并打印,同时翻转GPIO_Y8, GPIO_Y9电平 +- 打印SSDK E3 GPIO Demo Success! + +## Demo流程说明 + +- clock初始化; +- reset初始化; +- irq初始化; +- gpio初始化; +- Debug串口初始化; +- BUTTON gpio中断设置、注册回调函数、使能, +- 进入死循环, + 按下/松开BUTTON按键,gpio中断触发,在注册的回调函数中点亮/熄灭LED。 diff --git a/wdt_refresh.c b/wdt_refresh.c new file mode 100644 index 0000000..a8b73a9 --- /dev/null +++ b/wdt_refresh.c @@ -0,0 +1,115 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "IAP_Task.h" +#include + +void reboot_global(sdrv_rom_ctrl_boot_mode_e boot_mode) +{ + uint32_t glb_status = sdrv_rstgen_global_status(&rstctl_glb); + + ssdk_printf(SSDK_INFO,"global status: 0x%x \r\n", glb_status); +#if CONFIG_E3L + if (glb_status & (1 << 6u)) { +#else + if (glb_status & (1 << 11u | 1 << 31u)) { +#endif + ssdk_printf(SSDK_INFO, "SSDK E3 Global Reset Demo Success!\r\n"); + } + + /* clear global reset status */ + sdrv_rstgen_global_status_clear(&rstctl_glb); + + /* set boot pin mode */ + ssdk_printf(SSDK_INFO,"set boot pin mode: %d \r\n", boot_mode); + sdrv_rom_ctrl_set_boot_pin_flag(boot_mode); + + /* soft reset flash */ + flash.sw_rst = true; + sdrv_spi_nor_deinit(&flash); + /* soft reset xspi host */ + sdrv_spi_nor_drv_deinit(&flash); + + /* wait 3 seconds */ + udelay(100000); + + /* clear sf boot status */ + sdrv_rstgen_write_general(&reset_general_reg_sf_boot, 0); + + /* Only for norflash, update rom ctrl data */ +#ifndef CONFIG_HYPERBUS_MODE + /* Ҫ!!! ˴norflashûбʼ (sdrv_xspi_init) , + ʱsfsļжflashģʽ׼ȷ, sfsļflashģʽ + ֪ͨrom + гʼflash, sdrv_spi_nor_drv_deinit, + xspi host deinit֮global reset, ˴! */ + sdrv_rom_ctrl_data_update(); +#endif + + ssdk_printf(SSDK_INFO,"reset!: %d \r\n", boot_mode); + +// arch_invalidate_cache_range(0x01978000,0x8000);// dcache + + /* global reset */ + sdrv_rstgen_global_reset(&rstctl_glb); +} + + + + + + + +void External_wdt_refresh(void) +{ +// sdrv_wdt_refresh(wdt_type);//ι + + sdrv_gpio_toggle_pin_output_level(WDTGPIO); +} + + +sdrv_wdt_t *wdt_type = (sdrv_wdt_t *)APB_WDT1_BASE; + +static bool internal_reset_switch = true; +static bool external_reset_switch = false; +//Źʼ +void wdt_init(uint32_t timeoutms) +{ + static sdrv_wdt_config_t wdt_cfg; + int ret = 0; +//-------------------------------------------------- + sdrv_wdt_get_default_config(&wdt_cfg); + + if (internal_reset_switch) { + wdt_cfg.int_rst.reset_en = true; + sdrv_rstgen_wdt_reset_enable(RESET_WDT1, true); + } + + if (external_reset_switch) { + /* config GPIO_H12 as WDT1_RST_N function */ + wdt_cfg.ext_rst.reset_en = true; + wdt_cfg.ext_rst.reset_mode = 0; /* low level active */ + } + + ret = sdrv_wdt_init(wdt_type, &wdt_cfg); + ASSERT(ret == 0); + +// irq_attach(wdt_irq, wdt_irq_handler, NULL); +// irq_enable(wdt_irq); + + sdrv_wdt_set_timeout(wdt_type, timeoutms); + + ret = sdrv_wdt_enable(wdt_type); +} + + + + + diff --git a/wdt_refresh.h b/wdt_refresh.h new file mode 100644 index 0000000..5672fae --- /dev/null +++ b/wdt_refresh.h @@ -0,0 +1,65 @@ +#ifndef _WDT_RFFRESH_H_ +#define _WDT_RFFRESH_H_ + +#include +#include + +#define WDTGPIO GPIO_F5 +//#define WDTGPIO GPIO_H13 + +#define WDT_OUTms 1600 + + + + +//ⲿ +void wdt_init(uint32_t timeoutms); + + +void External_wdt_refresh(void); +void reboot_global(sdrv_rom_ctrl_boot_mode_e boot_mode); + +//ⲿ +extern sdrv_wdt_t *wdt_type; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +#endif /* _WDT_RFFRESH_H_*/ \ No newline at end of file