1 /* Includes ------------------------------------------------------------------*/
2 #include "main.h"
3 #include "declare.h"
4 #include "user_flash.h"
5 #include "uart.h"
6
7 u16 g_MsCnt;
8 u32 g_Ms;
9 u32 tick_us = 64; // 1 us tick count,根据SysTick时钟源设定
10 u8 databuf[FMC_PAGE_SIZE]={0};
11
12
13 /*SysTick 是24位递减定时器,当递减至0时产生中断,同时加载Reload值重新递减*/
14 void Sys_HardDelayUs(u32 us)//us< 1000
15 {
16 u32 old_tick;
17 u32 delta_tick;
18 if(us>900)return;
19 old_tick = SysTick->VAL;
20 while(1)
21 {
22 if(SysTick->VAL <= old_tick)
23 {
24 delta_tick = old_tick - SysTick->VAL;
25 }
26 else
27 {
28 delta_tick = SysTick->LOAD - (SysTick->VAL-old_tick);
29 }
30
31 if(delta_tick >=(tick_us*us))break;
32 }
33 }
34
35
36 /* USER CODE END PFP */
37
38 /* Private user code ---------------------------------------------------------*/
39 /* USER CODE BEGIN 0 */
40
41 u8 crc_caculate(u8 *pdata,u16 len)
42 {
43 u8 crc = 0;
44 while(len)
45 {
46 crc += (*pdata);
47 pdata++;
48 len--;
49 }
50 return crc;
51 }
52
53 void print_hex(const char*p,u8 *pdata,u16 len)
54 {
55 #if 1
56
57 SYSTEM_DEBUG("%s len=%d:",p,len);
58 while(len)
59 {
60 printf("%02x ",*pdata);
61 pdata++;
62 len--;
63 }
64 printf("\r\n");
65
66 #endif
67 }
68
69 CONFIG_t system_config;
70
71 void App_Config_Save(void)
72 {
73 system_config.crc = crc_caculate((u8*)&system_config,sizeof(system_config)-1);
74 User_Flash_Write(USER_FLASH_CONFIG_ADDR,(u8*)&system_config,sizeof(system_config));
75 //print_hex(__FUNCTION__,(u8*)&system_config,sizeof(system_config));
76 }
77
78 void App_Config_Read(void)
79 {
80 u8 crc=0;
81 User_Flash_Read(USER_FLASH_CONFIG_ADDR,(u8*)&system_config,sizeof(system_config));
82 crc = crc_caculate((u8*)&system_config,sizeof(system_config)-1);
83 if(crc != system_config.crc)
84 {
85 SYSTEM_DEBUG("Error! system_config.crc=%x , crc=%x %d\r\n",system_config.crc,crc,sizeof(system_config));
86 system_config.crc = crc_caculate((u8*)&system_config,sizeof(system_config)-1);
87 User_Flash_Write(USER_FLASH_CONFIG_ADDR,(u8*)&system_config,sizeof(system_config));
88 }
89 //print_hex(__FUNCTION__,(u8*)&system_config,sizeof(system_config));
90 }
91 typedef void (*pFunction)(void);
92 u32 JumpAddress;
93 pFunction JumpToApplication;
94
95 void JumpToApp(u32 address)
96 {
97 u32 result=0;
98 u32 address_value=0;
99 address_value = (*(__IO u32*)(address));
100 result = (((*(__IO u32*)address) & 0x2FFE0000 ));
101 //SYSTEM_DEBUG("*address = %#X,result = %#X\n",address_value,result);
102 //return;
103 if(result==0x20000000)
104 {
105 SYSTEM_DEBUG("start jump to app(0x%0x)....\r\n",address);
106 /* Jump to user application */
107 //debug("jump to application\r\n");
108 JumpAddress = *(__IO u32*) (address + 4);
109
110 /* Initialize user application's Stack Pointer */
111 __set_MSP(*(__IO u32*) address);
112 JumpToApplication = (pFunction) JumpAddress;
113 JumpToApplication();
114 }
115 }
116
117 #define CONFIG_CRC32_POLY 0x04C11DB7
118 #define CONFIG_CRC32_INIT_VALUE 0xFFFFFFFF
119 #define CONFIG_CRC32_OUT_XOR 0x00000000
120 #define CONFIG_CRC32_REFLECTION_IN 0
121 #define CONFIG_CRC32_REFLECTION_OUT 0
122
123 u32 crc32_customized(u32 crc_poly,u32 crc_init_value,u32 out_xor_value,u8 *source,u32 length)
124 {
125 u32 crc_value = crc_init_value;
126
127 for (int i =0; i < length; i++)
128 {
129 for (int j = 0; j < 8; j++)
130 {
131 u8 get_bit_value = ((source[i] >> (7 - j) & 1) == 1);
132 u8 get_value = ((crc_value >> 31 & 1) == 1);
133
134 crc_value <<= 1;
135
136 if (get_value ^ get_bit_value)
137 {
138 crc_value ^= crc_poly;
139 }
140 }
141 }
142
143 crc_value &= 0xFFFFFFFF;
144
145 return (crc_value ^= out_xor_value);
146 }
147
148 u32 soft_crc32(u8* buf,u32 len)
149 {
150 return crc32_customized(CONFIG_CRC32_POLY,CONFIG_CRC32_INIT_VALUE,CONFIG_CRC32_OUT_XOR,buf,len);
151 }
152 void copyflash(void)
153 {
154 u32 crc32=0;
155 u32 len=0;
156 u8 page_num=0;
157 u8 j=0;
158 App_Config_Read();
159 if(system_config.ota.have_new!=1)
160 {
161 SYSTEM_DEBUG("no new firmware!\r\n ");
162 if(system_config.ota.crc_result != CRC_NoNeed)
163 {
164 system_config.ota.crc_result = CRC_NoNeed;
165 App_Config_Save();
166 }
167 return;
168 }
169
170 crc32 = soft_crc32((u8*)APP_BACK_ADDR_START,system_config.ota.newFirmware_size);
171
172 SYSTEM_DEBUG("crc failed newFirmware_crc=%#X ,crc32=%#X ,size=%d\r\n ",system_config.ota.newFirmware_crc,crc32,system_config.ota.newFirmware_size);
173 system_config.ota.have_new = 0;
174 if(system_config.ota.newFirmware_crc == crc32)
175 {
176 len = system_config.ota.newFirmware_size;
177 while(len>0)
178 {
179 if(len>=FMC_PAGE_SIZE)
180 {
181 User_Flash_Read(APP_BACK_ADDR_START + FMC_PAGE_SIZE*page_num , databuf , FMC_PAGE_SIZE);
182 User_Flash_Write(APP_ENTRY_ADDRESS + FMC_PAGE_SIZE*page_num , databuf , FMC_PAGE_SIZE);
183 page_num++;
184 len -= FMC_PAGE_SIZE;
185 }
186 else
187 {
188 User_Flash_Read(APP_BACK_ADDR_START + FMC_PAGE_SIZE*page_num , databuf , len);
189 j=len%8;
190 if(j==0)j=8;
191 memset(databuf+len,0xFF,8-j);
192 User_Flash_Write(APP_ENTRY_ADDRESS + FMC_PAGE_SIZE*page_num , databuf , len+8-j);
193 len= 0;
194 }
195 }
196 SYSTEM_DEBUG("update new firmware scucess \r\n ");
197 system_config.ota.crc_result = CRC_SCUCESS;
198 }
199 else
200 {
201 SYSTEM_DEBUG("crc failed newFirmware_crc=%#X ,crc32=%#X ,size=%d\r\n ",system_config.ota.newFirmware_crc,crc32,system_config.ota.newFirmware_size);
202 system_config.ota.crc_result = CRC_FAIL;
203 }
204 App_Config_Save();
205 return ;
206
207 }
208
209 int main(void)
210 {
211 u8 i=0;
212 u32 WRPR_Value;
213 #ifdef SYSTEM_DEBUG_EN
214 USART1_Init();
215 #endif
216 //RCC_EnableAHBPeriphClk(RCC_AHB_PERIPH_CRC, ENABLE);
217 //WRPR_Value = FLASH_GetWriteProtectionOB();
218 SYSTEM_DEBUG("$$ bootloader for <GD32 Chip> Sxx $$\r\n");
219 //SYSTEM_DEBUG("FLASH->WRP=%08X Read_L1=%d,Read_L2=%d,OBT->USER_RDP=%#x\n",WRPR_Value,FLASH_GetReadOutProtectionSTS(),FLASH_GetReadOutProtectionL2STS(),OBT->USER_RDP);
220 //User_Write_Protect(0);
221 copyflash();
222 JumpToApp(APP_ENTRY_ADDRESS);
223
224 /**************if run to here,it is abnormal!!****************/
225 //SYSTEM_DEBUG("Bootloader jump failure! \r\n");
226
227 while(1)
228 {
229 }
230
231 }
232
233
234
235 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/