diff --git a/checher_slave.uvoptx b/checher_slave.uvoptx index a38ef89..d1f11e4 100644 --- a/checher_slave.uvoptx +++ b/checher_slave.uvoptx @@ -103,7 +103,7 @@ 1 0 0 - 0 + 4 @@ -114,7 +114,7 @@ - BIN\UL2CM3.DLL + Segger\JL2CM3.dll @@ -125,12 +125,12 @@ 0 JL2CM3 - -U69655983 -O78 -S5 -ZTIFSpeedSel1000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(1BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_512.FLM -FS08000000 -FL080000 -FP0($$Device:STM32F103RC$Flash\STM32F10x_512.FLM) + -U69655983 -O78 -S5 -ZTIFSpeedSel1000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_512.FLM -FS08000000 -FL080000 -FP0($$Device:STM32F103RC$Flash\STM32F10x_512.FLM) 0 DLGUARM - d + ? 0 @@ -230,12 +230,6 @@ - - - System Viewer\USART1 - 35905 - - 1 1 @@ -345,12 +339,12 @@ 0 UL2CM3 - UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32F10x_512 -FL080000 -FS08000000 -FP0($$Device:STM32F103RC$Flash\STM32F10x_512.FLM) + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0GD32F30x_HD -FL040000 -FS08000000 -FP0($$Device:GD32F303RC$Flash\GD32F30x_HD.FLM) 0 JL2CM3 - -U69655983 -O78 -S5 -ZTIFSpeedSel1000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(1BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO31 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_512.FLM -FS08000000 -FL080000 -FP0($$Device:STM32F103RC$Flash\STM32F10x_512.FLM) + -U69655983 -O78 -S5 -ZTIFSpeedSel1000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_512.FLM -FS08000000 -FL080000 -FP0($$Device:STM32F103RC$Flash\STM32F10x_512.FLM) 0 @@ -1154,11 +1148,35 @@ 0 0 0 + .\source\elec_det\interface\EWChecker.c + EWChecker.c + 0 + 0 + + + 6 + 54 + 1 + 0 + 0 + 0 .\source\elec_det\elec_det.c elec_det.c 0 0 + + 6 + 55 + 1 + 0 + 0 + 0 + .\source\elec_det\elec_cmd.c + elec_cmd.c + 0 + 0 + @@ -1169,7 +1187,7 @@ 0 7 - 54 + 56 1 0 0 @@ -1181,7 +1199,7 @@ 7 - 55 + 57 1 0 0 @@ -1201,7 +1219,7 @@ 0 8 - 56 + 58 1 0 0 @@ -1213,7 +1231,7 @@ 8 - 57 + 59 1 0 0 @@ -1225,7 +1243,7 @@ 8 - 58 + 60 1 0 0 @@ -1237,7 +1255,7 @@ 8 - 59 + 61 1 0 0 @@ -1249,7 +1267,7 @@ 8 - 60 + 62 1 0 0 @@ -1261,7 +1279,7 @@ 8 - 61 + 63 1 0 0 @@ -1273,7 +1291,7 @@ 8 - 62 + 64 1 0 0 @@ -1285,7 +1303,7 @@ 8 - 63 + 65 1 0 0 @@ -1297,7 +1315,7 @@ 8 - 64 + 66 1 0 0 @@ -1309,7 +1327,7 @@ 8 - 65 + 67 1 0 0 @@ -1321,7 +1339,7 @@ 8 - 66 + 68 1 0 0 @@ -1333,7 +1351,7 @@ 8 - 67 + 69 1 0 0 @@ -1345,7 +1363,7 @@ 8 - 68 + 70 1 0 0 @@ -1357,7 +1375,7 @@ 8 - 69 + 71 1 0 0 @@ -1369,7 +1387,7 @@ 8 - 70 + 72 1 0 0 @@ -1381,7 +1399,7 @@ 8 - 71 + 73 1 0 0 @@ -1393,7 +1411,7 @@ 8 - 72 + 74 1 0 0 @@ -1405,7 +1423,7 @@ 8 - 73 + 75 1 0 0 @@ -1417,7 +1435,7 @@ 8 - 74 + 76 2 0 0 @@ -1431,13 +1449,13 @@ soft - 0 + 1 0 0 0 9 - 75 + 77 1 0 0 @@ -1449,7 +1467,7 @@ 9 - 76 + 78 1 0 0 @@ -1461,7 +1479,7 @@ 9 - 77 + 79 1 0 0 @@ -1473,7 +1491,7 @@ 9 - 78 + 80 1 0 0 @@ -1485,7 +1503,7 @@ 9 - 79 + 81 1 0 0 @@ -1497,7 +1515,7 @@ 9 - 80 + 82 1 0 0 @@ -1509,7 +1527,7 @@ 9 - 81 + 83 1 0 0 @@ -1521,7 +1539,7 @@ 9 - 82 + 84 1 0 0 @@ -1533,7 +1551,7 @@ 9 - 83 + 85 1 0 0 @@ -1545,7 +1563,7 @@ 9 - 84 + 86 1 0 0 @@ -1557,7 +1575,7 @@ 9 - 85 + 87 1 0 0 @@ -1577,7 +1595,7 @@ 0 10 - 86 + 88 1 0 0 @@ -1589,7 +1607,7 @@ 10 - 87 + 89 1 0 0 @@ -1601,7 +1619,7 @@ 10 - 88 + 90 1 0 0 @@ -1613,7 +1631,7 @@ 10 - 89 + 91 1 0 0 @@ -1625,7 +1643,7 @@ 10 - 90 + 92 1 0 0 @@ -1637,7 +1655,7 @@ 10 - 91 + 93 1 0 0 @@ -1657,7 +1675,7 @@ 0 11 - 92 + 94 1 0 0 @@ -1677,7 +1695,7 @@ 0 12 - 93 + 95 1 0 0 @@ -1689,7 +1707,7 @@ 12 - 94 + 96 1 0 0 @@ -1701,7 +1719,7 @@ 12 - 95 + 97 1 0 0 @@ -1713,7 +1731,7 @@ 12 - 96 + 98 1 0 0 @@ -1725,7 +1743,7 @@ 12 - 97 + 99 1 0 0 @@ -1737,7 +1755,7 @@ 12 - 98 + 100 1 0 0 @@ -1757,7 +1775,7 @@ 0 13 - 99 + 101 5 0 0 @@ -1777,7 +1795,7 @@ 0 14 - 100 + 102 5 0 0 @@ -1789,7 +1807,7 @@ 14 - 101 + 103 5 0 0 diff --git a/checher_slave.uvprojx b/checher_slave.uvprojx index e8a35b5..1253d31 100644 --- a/checher_slave.uvprojx +++ b/checher_slave.uvprojx @@ -10,7 +10,7 @@ app 0x4 ARM-ADS - 5060960::V5.06 update 7 (build 960)::.\ARMCC + 5060750::V5.06 update 6 (build 750)::ARMCC 0 @@ -138,7 +138,7 @@ 1 BIN\UL2CM3.DLL - + "" () @@ -185,7 +185,6 @@ 0 0 0 - 0 0 0 8 @@ -352,7 +351,7 @@ 0 0 0 - 4 + 0 @@ -719,11 +718,21 @@ 1 .\source\elec_det\interface\XTChecker.c + + EWChecker.c + 1 + .\source\elec_det\interface\EWChecker.c + elec_det.c 1 .\source\elec_det\elec_det.c + + elec_cmd.c + 1 + .\source\elec_det\elec_cmd.c + @@ -1238,7 +1247,6 @@ 0 0 0 - 0 0 0 8 @@ -1405,7 +1413,7 @@ 0 0 0 - 4 + 0 @@ -1852,7 +1860,7 @@ 2 2 2 - 0 + 2 @@ -1943,11 +1951,21 @@ 1 .\source\elec_det\interface\XTChecker.c + + EWChecker.c + 1 + .\source\elec_det\interface\EWChecker.c + elec_det.c 1 .\source\elec_det\elec_det.c + + elec_cmd.c + 1 + .\source\elec_det\elec_cmd.c + @@ -2906,7 +2924,7 @@ 2 2 2 - 0 + 2 @@ -3448,7 +3466,7 @@ 2 2 2 - 0 + 2 @@ -3552,7 +3570,7 @@ 2 2 2 - 0 + 2 @@ -3631,7 +3649,7 @@ 2 2 2 - 0 + 2 @@ -3709,13 +3727,4 @@ - - - - checher_slave - 1 - - - - diff --git a/doc/mhzz3_Main_v0_00.pdf b/doc/mhzz3_Main_v0_00.pdf deleted file mode 100644 index e042cc1..0000000 Binary files a/doc/mhzz3_Main_v0_00.pdf and /dev/null differ diff --git a/source/ReadMe.txt b/source/ReadMe.txt index ce794f3..6e27929 100644 --- a/source/ReadMe.txt +++ b/source/ReadMe.txt @@ -179,5 +179,6 @@ str_is_print_str 函数中,len为0时返回0 2023.10.6 移植与雷管通信相关代码,编译通过 - +2023.10.7 + 实现大部分小板命令 \ No newline at end of file diff --git a/source/dev/dev_flash.c b/source/dev/dev_flash.c index e060b43..ddfdd17 100644 --- a/source/dev/dev_flash.c +++ b/source/dev/dev_flash.c @@ -41,6 +41,8 @@ scheme 109~110 #define FLASH_PARAM_SECTOR_NUM (1) #define FLASH_SCHEME_SECTOR (109) #define FLASH_SCHEME_SECTOR_NUM (3) +#define FLASH_JWTCODE_SECTOR (112) +#define FLASH_JWTCODE_SECTOR_NUM (9) @@ -78,7 +80,7 @@ typedef struct{ // 擦除指定扇区,返回0成功,-1失败 -static int flash_erase(uint32_t FLASH_Sector) +static int flash_erase(uint32_t sector) { self_def *s=&g_self; FLASH_Status ret; @@ -89,7 +91,7 @@ static int flash_erase(uint32_t FLASH_Sector) FLASH_Unlock(); FLASH_CLEAR_FLAG(); // 对于f103 2048byte为一个扇区,这里把扇区地址转化为flash地址 - ret=FLASH_ErasePage(FLASH_Sector*2048); + ret=FLASH_ErasePage(sector*2048); rt_mutex_release(s->mutex); if(ret!=FLASH_COMPLETE) { @@ -102,6 +104,24 @@ static int flash_erase(uint32_t FLASH_Sector) } + +// 操作开始 +int flash_operate_start(void) +{ + FLASH_Status state; + int ret=0; + self_def *s=&g_self; + #ifdef RT_THREAD + param_check(s->mutex); + #endif + rt_mutex_take(s->mutex,RT_WAITING_FOREVER); + FLASH_Unlock(); + FLASH_CLEAR_FLAG(); + rt_mutex_release(s->mutex); + return 0; +} + + // 操作结束 int flash_operate_end(void) { @@ -159,7 +179,7 @@ int flash_erase_slave(void) } return 0; } -//方案区 4K +//方案区 6K int flash_erase_scheme(void) { int ret; @@ -176,6 +196,17 @@ int flash_erase_lua(void) return -1; } +// 模块程序区 16K +int flash_erase_jwtcode(void) +{ + int ret; + for(int i=0;i ad_line) { @@ -427,7 +428,7 @@ static uint8_t SMod_FireBusReadPlus(uint16_t* plus_h, uint16_t* plus_t,uint16_t ul_l_count++; } } - if(uc_step == 0 && ul_h_count > 5)//启动周期计数 + if(uc_step == 0 && ul_h_count >(DMOD_READ_AD_FILTER_COUNT-1))//启动周期计数 { (*plus_h)++; (*plus_t)++; @@ -437,18 +438,18 @@ static uint8_t SMod_FireBusReadPlus(uint16_t* plus_h, uint16_t* plus_t,uint16_t } if(uc_step == 1) { - if(ul_h_count > 5) + if(ul_h_count > (DMOD_READ_AD_FILTER_COUNT-1)) { PBout(I2IC_SCL_Pin_Nu) = 1 ; (*plus_h)++; uc_step = 1; - }else if(ul_l_count > 5) //由高变低 + }else if(ul_l_count > (DMOD_READ_AD_FILTER_COUNT-1)) //由高变低 { PBout(I2IC_SCL_Pin_Nu) = 0; uc_step = 2; } } - else if(uc_step == 2 && ul_h_count > 5)//由低变高 + else if(uc_step == 2 && ul_h_count > (DMOD_READ_AD_FILTER_COUNT-1))//由低变高 { PBout(I2IC_SCL_Pin_Nu) = 1 ; break; @@ -483,7 +484,7 @@ uint8_t DMod_FireBusReadDatasV2(uint8_t* buf, uint8_t len, uint32_t time_out) uint16_t ad_max = 0,ad_max_temp = 0; CurrentSample_Range_eu range = buscurrent_range;//档位保存 Power_SetSampleCurrentRange(R10_2mA_30mA_MC); - ADC_CurChnnelSet(AN_MAL_CH,ADC_SPEED_HIGH); + ADC_CurChnnelSet(AN_MAL_CH,ADC_SPEED_HFAST); delay_us(2000); //总线跳转到中电平 EW_DIFF_MOD_M; @@ -816,7 +817,14 @@ static void EW_TrimPlusCallback(uint8_t flag) } EW_Trim_Flag = flag; } -static void EW_SendTrimSquare(uint16_t cycle,uint16_t duty, uint32_t count) +/* +@brief 发送校准脉冲 +@param cycle 周期 +@param duty 总线高电平时间 +@param count 脉冲个数 + +*/ +void EW_SendTrimSquare(uint16_t cycle,uint16_t duty, uint32_t count) { FireBus_ClkAmend(cycle,duty,count,EW_TrimPlusCallback); EW_Trim_Flag = 0; @@ -907,7 +915,7 @@ uint8_t EW_WriteMTP(uint16_t addr,uint8_t mtpaddr,uint8_t* buf,uint8_t len) len = 10; } EW_CommBuf[3] = len; - memcpy((void*)(EW_CommBuf+4),buf,len); + memcpy((void*)EW_CommBuf+4,buf,len); DMod_SendBytes((uint8_t*)EW_CommBuf,len+4,EW_DMOD_Peroid,uc_readflag); if(uc_readflag == 0) { @@ -947,7 +955,7 @@ uint8_t EW_ReadMTP(uint16_t addr,uint8_t mtpaddr,uint8_t* buf,uint8_t len) len = 10; } EW_CommBuf[3] = len; - memcpy((void*)(EW_CommBuf+4),buf,len); + memcpy((void*)EW_CommBuf+4,buf,len); DMod_SendBytes((uint8_t*)EW_CommBuf,len+4,EW_DMOD_Peroid,uc_readflag); if(uc_readflag == 0) { @@ -978,7 +986,7 @@ uint8_t EW_RunBootLoader(uint16_t addr,uint8_t reboot) { ul_bootflag = 0x9966AA55; } - memcpy((void*)(EW_CommBuf+2),&ul_bootflag,4); + memcpy((void*)EW_CommBuf+2,&ul_bootflag,4); DMod_SendBytes((uint8_t*)EW_CommBuf,6,EW_DMOD_Peroid,0); return 0; } @@ -1000,7 +1008,7 @@ uint8_t EW_WriteRunCfg(uint16_t addr,RunCfg_un* runcfg) addr = (addr & 0xFFC0) | 20; EW_CommBuf[0] = addr&0xFF; EW_CommBuf[1] = (addr >> 8)&0xFF; - memcpy((void*)(EW_CommBuf+2),&runcfg,3); + memcpy((void*)EW_CommBuf+2,&runcfg,3); DMod_SendBytes((uint8_t*)EW_CommBuf,6,EW_DMOD_Peroid,uc_readflag); if(uc_readflag == 0) { @@ -1036,7 +1044,7 @@ uint8_t EW_SetAddrByUID(uint16_t addr,uint8_t* uid,uint8_t uid_len,uint8_t* ack_ addr = (addr & 0xFFC0) | 21; EW_CommBuf[0] = addr&0xFF; EW_CommBuf[1] = (addr >> 8)&0xFF; - memcpy((void*)(EW_CommBuf+2),uid,uid_len); + memcpy((void*)EW_CommBuf+2,uid,uid_len); DMod_SendBytes((uint8_t*)EW_CommBuf,uid_len+2,EW_DMOD_Peroid,uc_readflag); if(uc_readflag == 0) { @@ -1075,7 +1083,7 @@ uint8_t EW_FastSetByUID(uint16_t addr,uint16_t delay, uint8_t pwd_flag,uint8_t* EW_CommBuf[0] = addr&0xFF; EW_CommBuf[1] = (addr >> 8)&0xFF; EW_CommBuf[2] = pwd_flag; - memcpy(((void*)(EW_CommBuf+3)),&delay,2); + memcpy(((void*)(EW_CommBuf)+3),&delay,2); memcpy((void*)(EW_CommBuf+5),uid,uid_len); uid_len +=5; DMod_SendBytes(((uint8_t*)(EW_CommBuf)),uid_len,EW_DMOD_Peroid,uc_readflag); @@ -1106,7 +1114,7 @@ uint8_t EW_SetDelay(uint16_t addr,uint16_t delay) addr = (addr & 0xFFC0) | 23; EW_CommBuf[0] = addr&0xFF; EW_CommBuf[1] = (addr >> 8)&0xFF; - memcpy((void*)(EW_CommBuf+2),&delay,2); + memcpy((void*)EW_CommBuf+2,&delay,2); DMod_SendBytes((uint8_t*)EW_CommBuf,4,EW_DMOD_Peroid,0); uc_ack = DMod_FireBusReadDatasV2((uint8_t*)EW_CommBuf+2,2,EW_DMOD_READ_Timeout); if(EW_CommBuf[0] != EW_CommBuf[2] || EW_CommBuf[1] != EW_CommBuf[3]) @@ -1130,7 +1138,7 @@ uint8_t EW_VerfyPWD(uint16_t addr,uint8_t* pwd,uint8_t pwd_len) addr = (addr & 0xFFC0) | 24; EW_CommBuf[0] = addr&0xFF; EW_CommBuf[1] = (addr >> 8)&0xFF; - memcpy((void*)(EW_CommBuf+2),pwd,pwd_len); + memcpy((void*)EW_CommBuf+2,pwd,pwd_len); pwd_len += 2; DMod_SendBytes((uint8_t*)EW_CommBuf,pwd_len,EW_DMOD_Peroid,0); return 0; @@ -1282,7 +1290,7 @@ uint8_t EW_CheckRunCfg(uint16_t addr,uint32_t cfg_mask ,uint16_t cfg_state,uint8 EW_CommBuf[0] = addr&0xFF; EW_CommBuf[1] = (addr >> 8)&0xFF; memcpy((uint8_t*)&EW_CommBuf[2],&cfg_mask,3); - memcpy((uint8_t*)&EW_CommBuf[5],&cfg_state,2); + memcpy((uint8_t*)&EW_CommBuf[5],&cfg_state,3); EW_CommBuf[8] = *rtv; DMod_SendBytes((uint8_t*)EW_CommBuf,9,EW_DMOD_Peroid,1); delay_ms(5); @@ -1388,7 +1396,6 @@ uint8_t EW_SetReportCfg(uint8_t speed,uint8_t cur) EW_CommBuf[2] = speed; EW_CommBuf[3] = cur; DMod_SendBytes((uint8_t*)EW_CommBuf,4,EW_DMOD_Peroid,0); - return 0; } /* @@ -1408,7 +1415,7 @@ uint8_t EW_UpdateCommAddr(uint8_t addr,uint16_t new_addr) addr = (addr & 0xFFC0) | 36; EW_CommBuf[0] = addr&0xFF; EW_CommBuf[1] = (addr >> 8)&0xFF; - memcpy((void*)(EW_CommBuf+2),&new_addr,2); + memcpy((void*)EW_CommBuf+2,&new_addr,2); DMod_SendBytes((uint8_t*)EW_CommBuf,4,EW_DMOD_Peroid,uc_readflag); if(uc_readflag == 0) { @@ -1525,6 +1532,4 @@ uint8_t EW_ReadUID(uint16_t addr,uint8_t* uid,uint8_t uid_len) uc_ack = 1; } return uc_ack; -} - - +} \ No newline at end of file diff --git a/source/elec_det/driver/EWDriver.h b/source/elec_det/driver/EWDriver.h index 0049cb6..1cb42cc 100644 --- a/source/elec_det/driver/EWDriver.h +++ b/source/elec_det/driver/EWDriver.h @@ -122,7 +122,14 @@ volatile struct #define EW_BOOTLOADER_RUN 61 //运行bootloader #define EW_RA_REGISTER 62 //读MTP #define EW_WA_REGISTER 63 //写MTP +/* +@brief 发送校准脉冲 +@param cycle 周期 +@param duty 总线高电平时间 +@param count 脉冲个数 +*/ +void EW_SendTrimSquare(uint16_t cycle,uint16_t duty, uint32_t count); /* @brief 单端第二版,差分接收数据 @param *buf 数据缓存指针 diff --git a/source/elec_det/elec_cmd.c b/source/elec_det/elec_cmd.c new file mode 100644 index 0000000..d8d863f --- /dev/null +++ b/source/elec_det/elec_cmd.c @@ -0,0 +1,30 @@ +#include "elec_det.h" +#include "commend.h" +#include "mystring.h" + + + + +// 电子模块相关调试命令 + + + +static int cmd_check(list_def *argv) +{ + array_def *data=arr_creat(); + cmd_print("start check."); + elec_check_with_scheme(data); + arr_delete(data); + return 0; +} +commend_export(check,cmd_check,"start check") + + + + + + + + + + diff --git a/source/elec_det/elec_det.c b/source/elec_det/elec_det.c index c65add8..ce08c16 100644 --- a/source/elec_det/elec_det.c +++ b/source/elec_det/elec_det.c @@ -1,6 +1,7 @@ #include "board.h" #include "bytearray.h" #include "mystdlib.h" +#include "debug.h" #include "elec_det.h" #include "base/delay.h" @@ -23,15 +24,42 @@ typedef struct{ - CheckerTask_Info_st* task_info_array[PLAN_MAX_TASK];//ṹָ - + CheckerTask_Info_st* task_info_array[PLAN_MAX_TASK];//方案参数结构体指针 + int scheme_inited; }self_def; static self_def g_self; -// ȡַ + + +// 初始化 +int elec_init(void) +{ + self_def *s=&g_self; + void Ye_BoardInit(void); + void Ye_BoardCheck(void); + int elec_check_scheme(void); + void elec_load_scheme(void); + Ye_BoardInit(); + Ye_BoardCheck(); + if(elec_check_scheme()!=0){ + // 方案校验失败 + DBG_WARN("scheme check failed."); + s->scheme_inited=0; + return 1; + } + s->scheme_inited=1; + elec_load_scheme(); + return 0; +} + + + + + +// 获取本机地址 uint8_t elec_local_addr(void) { static uint8_t addr=0; @@ -41,13 +69,13 @@ uint8_t elec_local_addr(void) } -// led1״̬ +// 设置led1状态 void elec_led1_power(int power) { LED1_Out=power?1:0; } -// led2״̬ +// 设置led2状态 void elec_led2_power(int power) { LED2_Out=power?1:0; @@ -55,40 +83,44 @@ void elec_led2_power(int power) -// ȡ +// 获取检测结果 array_def *elec_check_result(void) { array_def *r=arr_creat(); - + arr_append(r,3); return arr_temp(r); } -// дӲ汾 -int elec_write_hardversion(int version) +// 写硬件版本号 +array_def *elec_write_hardversion(int version) { + array_def *r=arr_creat(); board_st.hard_v=version; - return 0; + arr_append(r,0); + return arr_temp(r); } -// дУ׼ֵ -int elec_write_resistor_cbv(int cbv) +// 写电阻校准值 +array_def *elec_write_resistor_cbv(int cbv) { + array_def *r=arr_creat(); board_st.resistor_diff=cbv; + arr_append(r,0); return 0; } -// ˿ֵ +// 测量桥丝阻值 array_def *elec_check_resistor(void) { /* - 1 ͨ1-4ͨ˿ - 2 ͨ2-3ͨ˿ - 3 ͨ1-3ͨ迹 - 4 ͨ2-4ͨ迹 + 1 通道1-4通,过桥丝 + 2 通道2-3通,过桥丝 + 3 通道1-3通,测阻抗 + 4 通道2-4通,测阻抗 */ uint16_t aus_sample[5]; uint16_t us_resistor; @@ -98,7 +130,7 @@ array_def *elec_check_resistor(void) { aus_sample[uc_index] -= board_st.resistor_diff; } - // ȡвģʽ + // 读取方案中测量电阻的模式 switch(0) { case 0: us_resistor = aus_sample[0];break; @@ -117,7 +149,7 @@ array_def *elec_check_resistor(void) -// У鷽,0ɹ +// 校验方案,返0成功 static int elec_check_scheme(void) { uint32_t ul_crc32; @@ -135,7 +167,7 @@ static int elec_check_scheme(void) -// ط +// 加载方案 static void elec_load_scheme(void) { self_def *s=&g_self; @@ -159,7 +191,7 @@ static void elec_load_scheme(void) } -// м +// 进行检测 array_def *elec_check_with_scheme(array_def *uid_psw) { self_def *s=&g_self; @@ -172,10 +204,14 @@ array_def *elec_check_with_scheme(array_def *uid_psw) uint8_t res=0; array_def *r=arr_creat(); chip_type=(board_st.plan_id >> 12 ) & 0x0F; - if(chip_type>=LENGTH(tasks_fun_table)){ + if(s->scheme_inited==0){ arr_append(r,1); return arr_temp(r); } + if(chip_type>=LENGTH(tasks_fun_table)){ + arr_append(r,2); + return arr_temp(r); + } memset(&checker_runcfg,0,sizeof(Checker_RunCfg_st)); int task_index=0; int err_flag=0; @@ -184,8 +220,8 @@ array_def *elec_check_with_scheme(array_def *uid_psw) memset(&checker_runcfg.task_info,0,sizeof(CheckerTask_Info_st)); taskid=ptaskindex[task_index]; memset(checker_runcfg.params,0,20); - checker_runcfg.param_count = 0;// - checker_runcfg.rtv_count = 0;//ֵ + checker_runcfg.param_count = 0;//参数个数 + checker_runcfg.rtv_count = 0;//返回值个数 checker_runcfg.excue_rtv = 0; checker_runcfg.task_info.retry_time = 0; if(taskid>=CHECKER_MAXID_COUNT){ @@ -200,13 +236,13 @@ array_def *elec_check_with_scheme(array_def *uid_psw) break; } - // װز + // 装载参数 rt_memcpy(&checker_runcfg.task_info,task_par,sizeof(CheckerTask_Info_st)); checker_runcfg.param_count = checker_runcfg.task_info.param_rtv_count & 0x0F; checker_runcfg.rtv_count = (checker_runcfg.task_info.param_rtv_count >> 4) & 0x0F; rt_memcpy(checker_runcfg.params,checker_runcfg.task_info.params,checker_runcfg.param_count*2); - // ִ + // 执行任务 for(int i=0;i<1+task_par->retry_time;i++) { checker_runcfg.excue_rtv=1; @@ -216,23 +252,23 @@ array_def *elec_check_with_scheme(array_def *uid_psw) break; } - // Ѱһ + // 找寻下一个任务 if((checker_runcfg.excue_rtv != 0) && (checker_runcfg.task_info.error_jumpto != 0) && (checker_runcfg.task_info.error_jumpto != 0xFF) ) { - uint8_t uc_index = task_index+1;//ʱһֱ˳ִ + uint8_t uc_index = task_index+1;//如果时跳至下一个,直接顺序执行 task_index = checker_runcfg.task_info.error_jumpto; while(uc_index < task_index) { - Checker_MaskResult(1,uc_index);//IJδִ - //ֵ±꣬IJķֵ洢ռ䱣 + Checker_MaskResult(1,uc_index);//将跳过的步骤标记未执行 + //调整参数返回值下标,将跳过的步骤里面的返回值存储空间保留 checker_runcfg.rtv_index += (s->task_info_array[uc_index]->param_rtv_count >> 4) & 0x0F; uc_index++; } }else{ - task_index++;//ֱ˳ִ + task_index++;//正常情况直接顺序执行 } } @@ -246,3 +282,5 @@ array_def *elec_check_with_scheme(array_def *uid_psw) + + diff --git a/source/elec_det/elec_det.h b/source/elec_det/elec_det.h index 1d3b448..d415c36 100644 --- a/source/elec_det/elec_det.h +++ b/source/elec_det/elec_det.h @@ -3,10 +3,10 @@ #include "stdint.h" +#include "bytearray.h" - - +int elec_init(void); uint8_t elec_local_addr(void); @@ -14,10 +14,15 @@ void elec_led1_power(int power); void elec_led2_power(int power); +array_def *elec_check_result(void); +array_def *elec_write_hardversion(int version); +array_def *elec_write_resistor_cbv(int cbv); +array_def *elec_check_resistor(void); +array_def *elec_check_with_scheme(array_def *uid_psw); diff --git a/source/elec_det/hardware/gpio_cfg.h b/source/elec_det/hardware/gpio_cfg.h index 1d69c26..e760ac5 100644 --- a/source/elec_det/hardware/gpio_cfg.h +++ b/source/elec_det/hardware/gpio_cfg.h @@ -273,7 +273,8 @@ #define EW_SINGLE_MOD_M {PCout(OUTBH_Pin_Nu)=0;PBout(OUTAL_Pin_Nu)=0;PBout(OUTAH_Pin_Nu)=0; delay_nop(50); PBout(OUTBL_Pin_Nu)=1;PAout(LAVC_M_Pin_Nu)=1;} #define EW_SINGLE_MOD_H HMOS_SWITCH_W_1 -#define EW_DIFF_MOD_M {PCout(OUTBH_Pin_Nu)=0;PBout(OUTAL_Pin_Nu)=0;PBout(OUTAH_Pin_Nu)=0; delay_nop(50); PBout(OUTBL_Pin_Nu)=1;PAout(LAVC_M_Pin_Nu)=1;} +#define EW_DIFF_MOD_M {PCout(OUTBH_Pin_Nu)=0;PBout(OUTAL_Pin_Nu)=0; delay_nop(50); PBout(OUTBL_Pin_Nu)=1;PBout(OUTAH_Pin_Nu)=1;PAout(LAVC_M_Pin_Nu)=1;} + #define EW_DIFF_MOD_H HMOS_SWITCH_W_1 #define EW_DIFF_MOD_L HMOS_SWITCH_W_0 #define EW_BUS_OFF HMOS_SWITCH_OFF diff --git a/source/elec_det/hardware/jw3425iic.c b/source/elec_det/hardware/jw3425iic.c index 509a449..8404066 100644 --- a/source/elec_det/hardware/jw3425iic.c +++ b/source/elec_det/hardware/jw3425iic.c @@ -625,9 +625,14 @@ void MC_IICUpdateMTP(void) if(checker_runcfg.params[0] == 0x1000) { auc_setMTPOperReg_cmd[2] = 0x04; + auc_earse_cmd[0]= 0x27; + auc_earse_cmd[1]= 0xD8; + }else{ auc_setMTPOperReg_cmd[2] = 0x00; } + auc_setAddr_cmd[2] = (checker_runcfg.params[0]>>8) & 0xFF; + auc_setAddr_cmd[3] = checker_runcfg.params[0] & 0xFF; uc_ack = 0; uc_ack += I2C_master_write(SLAVE_IIC_ADDR_,auc_enMTP_cmd,sizeof(auc_enMTP_cmd),&ul_sendlen,0); delay_ms(5); @@ -645,8 +650,7 @@ void MC_IICUpdateMTP(void) return; } - auc_setAddr_cmd[2] = (checker_runcfg.params[0]>>8) & 0xFF; - auc_setAddr_cmd[3] = checker_runcfg.params[0] & 0xFF; + uc_ack = I2C_master_write(SLAVE_IIC_ADDR_,auc_setMTPOperReg_cmd,sizeof(auc_setMTPOperReg_cmd),&ul_sendlen,0); //设置MTP操作范围 if(uc_ack != 0) diff --git a/source/elec_det/interface/EWChecker.c b/source/elec_det/interface/EWChecker.c new file mode 100644 index 0000000..e6d846d --- /dev/null +++ b/source/elec_det/interface/EWChecker.c @@ -0,0 +1,259 @@ + +#include "EWChecker.h" +#include "driver/EWDriver.h" +#include "base/delay.h" +#include "hardware/adc_cfg.h" +#include "base/utility.h" +#include "hardware/power.h" +#include "hardware/timer_cfg.h" + + +#define UPDATA_PACK_LEN 58 +#define UPDATA_BASE_ADDR 0x1000 +#define UPDATA_DATA_LEN (12*1024) +#define UPDATA_FLAG_ADDR (0x3c7c) +//#define UPDATA_FLAG ((uint8_t []){0x99,0x66,0xaa,0x55}) +#define UPDATA_FLAG ((uint8_t []){0xaa,0xbb,0xcc,0xdd}) + +// 擦除 +static uint8_t EW_Erease(void) +{ + uint8_t data[3]={0xfe,0x00,0x00}; + uint8_t read[4]={0}; + uint8_t ret=0; + DMod_SendBytesXor(data,2,1); + ret=DMod_ReadBytesXor(read,4,100); + delay_ms(50); + return ret; +} + + +// 跳转 +static uint8_t EW_Jump(void) +{ + uint8_t data[3]={0xf9,0x00,0x00}; + uint8_t read[4]={0}; + uint8_t ret=0; + DMod_SendBytesXor(data,2,1); + ret=DMod_ReadBytesXor(read,4,100); + delay_ms(50); + return ret; +} + + +// 充电 +static uint8_t EW_Charg(void) +{ + uint8_t data[4]={0xf8,0x01,0x04,0x00}; + uint8_t read[4]={0}; + uint8_t ret=0; + delay_ms(2000); + DMod_SendBytesXor(data,3,1); + ret=DMod_ReadBytesXor(read,4,100); + delay_ms(5000); + return ret; +} + +// 发送数据 +// len 最长为58字节 +static uint8_t EW_Write(uint16_t addr,uint8_t *d,uint16_t len) +{ + uint8_t ret=0; + uint8_t read[4]={0}; + uint8_t *buf=rt_malloc(len+2+2+1); + if(buf==RT_NULL) return 1; + buf[0]=0xfc; + buf[1]=2+len; + buf[2]=addr&0xff; + buf[3]=addr>>8; + rt_memcpy(&buf[4],d,len); + DMod_SendBytesXor(buf,len+2+2,1); + ret=DMod_ReadBytesXor(read,4,100); + rt_free(buf); + delay_ms(50); + return ret; +} + + + +// 校验 +static uint8_t EW_CheckCrc(uint16_t adr_start,uint16_t adr_end,uint32_t *crc) +{ + uint8_t ret=0; + uint8_t cmd[7]={0xfb,0x04,adr_start&0xff,adr_start>>8,adr_end&0xff,adr_end>>8}; + uint8_t read[4+4]={0}; + DMod_SendBytesXor(cmd,6,1); + ret=DMod_ReadBytesXor(read,8,100); + if(ret==0){ + if(crc){ + *crc=(read[3])|(read[4]<<8)|(read[5]<<16)|(read[6]<<24); + } + } + delay_ms(50); + return ret; +} + + + +// 读取 +static uint8_t EW_Read(uint16_t adr,uint8_t *buf,uint16_t len) +{ + uint8_t ret=0; + uint8_t cmd[7]={0xfa,0x03,adr&0xff,adr>>8,len}; + uint16_t read_len=2+len+1+1; + uint8_t *read=rt_malloc(read_len); + if(read==RT_NULL) return 1; + DMod_SendBytesXor(cmd,6,1); + ret=DMod_ReadBytesXor(read,read_len,100); + rt_memset(buf,0,len); + if(ret==0) + { + rt_memcpy(buf,&read[3],len); + } + delay_ms(50); + rt_free(read); + return ret; +} + + +// 升级 +void EW_Updata(void) +{ + Checker_RunCfg_st *cfg=&checker_runcfg; + uint8_t ret=0; + uint8_t *data=(uint8_t *)MC_CODE_ADDR; + uint16_t len=UPDATA_DATA_LEN; + uint16_t addr=UPDATA_BASE_ADDR; + uint8_t pack_len=UPDATA_PACK_LEN; + uint32_t crc=0; + uint32_t crc_module=0; + ret=EW_Charg(); + if(ret) {ret=1;goto err;} + ret=EW_Erease(); + if(ret) {ret=2;goto err;} + while(len>0){ + pack_len=len>UPDATA_PACK_LEN?UPDATA_PACK_LEN:len; + ret=EW_Write(addr,data,pack_len); + addr+=pack_len; + data+=pack_len; + len-=pack_len; + if(ret) {ret=3;goto err;} + } + crc=Crc32Calu((uint32_t *)MC_CODE_ADDR,UPDATA_DATA_LEN/4); + ret=EW_CheckCrc(UPDATA_BASE_ADDR,UPDATA_BASE_ADDR+UPDATA_DATA_LEN,&crc_module); + if(ret) {ret=4;goto err;} + if(crc!=crc_module) + {ret=5;goto err;} + ret=EW_Jump(); + if(ret) {ret=6;goto err;} + delay_ms(100); + ret=EW_EnWriteMTP(0,1); + if(ret) {ret=7;goto err;} + delay_ms(100); + // 数据溢出 +// ret=EW_WriteMTP(0,(uint8_t)(UPDATA_FLAG_ADDR/4),UPDATA_FLAG,4); + if(ret) {ret=8;goto err;} + delay_ms(100); + + err: + Checker_MaskResult(ret,checker_runcfg.task_info.runindex); +} + + + +void EW_Test_PowerOFF(void) +{ + uint8_t uc_rtv = 0; + delay_os_ms(100); + XTBUS_OFF; + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); +} + + + + +void EW_Empty(void) +{ + Checker_RunCfg_st *cfg=&checker_runcfg; + int count=cfg->rtv_count; + while(count > 0) + { + cfg->Test_Rtv[cfg->rtv_index++] = 0; + count--; + } + Checker_MaskResult(0,cfg->task_info.runindex); +} + + + +void EW_Test_SetBusV(void) +{ + Checker_RunCfg_st *cfg=&checker_runcfg; + uint8_t uc_rtv = 0; + uint16_t us_h_v,us_m_v; + //us_h_v = cfg->params[0]; + us_h_v = 240; + if(us_h_v < 55) + { + uc_rtv = 1; + + }else{ + us_m_v = 50; + uc_rtv |= PowerCalibration_set(us_h_v,us_m_v); + XTBUS_ON + + us_m_v = ((us_h_v/80)+2)*60; + delay_ms(us_m_v); + us_h_v = Power_GetBousV(); + Checker_SetRtv(&us_h_v,cfg->rtv_count); + } + Checker_MaskResult(uc_rtv,cfg->task_info.runindex); + +} + + + +CheckerTask ewtaskArray[CHECKER_MAXID_COUNT] ={ +Checker_PowerPrapare, //0 电源准备 +EW_Empty, //1 上电充能 +EW_Test_SetBusV, //2 设置总线电压 +EW_Empty, //3 获取总线电流 +EW_Empty, //4 扫描UID +EW_Empty, //5 写配置参数 +EW_Empty, //6 验证配置 +EW_Empty, //7 模拟注码 +EW_Empty, //8 充能统计 +EW_Empty, //9 写现场值 网络id 延时 +EW_Empty, //10比对现场值 +EW_Empty, //11 桥丝通断检测 +EW_Empty, //12 电容容量统计 +EW_Empty, //13 延时等待 +EW_Empty, //14 写管壳号/工厂信息 +EW_Empty, //15 写UID +EW_Empty, //16 写密码 +EW_Empty, //17 写入/检测备份区标志 +EW_Empty, //18 读取备份区数据 +EW_Empty, //19 校准 +EW_Empty, //20 使能通讯末电流采集 +EW_Empty, //21 获取通讯末电流 +EW_Empty, //22 放电 +EW_Empty, //23 在线检测 +EW_Empty, //24 状态检测 +EW_Empty, //25 起爆 +EW_Empty, //26 复位 +EW_Test_PowerOFF, //27 关总线 +EW_Empty, //28 芯片锁存 +EW_Empty, //29 使能赋码设备 +EW_Empty, //30 在线检测 +EW_Empty, //31 密码验证 +EW_Empty, //32 加载芯片配置 +EW_Empty, //33 电容压差测试 +Checker_ResistorSample,//34 桥丝电阻测试 +EW_Empty, //35 检测过程中注码 +EW_Empty, //36 验证注码 +EW_Empty, //37 模块在线检测 +EW_Updata, //38 升级 +(void*)0 //数组结束 +}; + + diff --git a/source/elec_det/interface/EWChecker.h b/source/elec_det/interface/EWChecker.h new file mode 100644 index 0000000..47b80c3 --- /dev/null +++ b/source/elec_det/interface/EWChecker.h @@ -0,0 +1,22 @@ +#ifndef EWChecker_h__ +#define EWChecker_h__ +#include "base/define.h" +#include "basechecker.h" +#include "stdint.h" + + + + + +extern CheckerTask ewtaskArray[CHECKER_MAXID_COUNT] ; + + + + + + + + + +#endif + diff --git a/source/main/compiler_info.h b/source/main/compiler_info.h index 254cf00..aef8df8 100644 --- a/source/main/compiler_info.h +++ b/source/main/compiler_info.h @@ -6,7 +6,7 @@ -#define BUILD_DATE "2023-10-06 18:40:44" +#define BUILD_DATE "2023-10-07 18:12:30" #define SOFT_VERSION "0.03" diff --git a/source/main/main.c b/source/main/main.c index 72d8d64..4681c0a 100644 --- a/source/main/main.c +++ b/source/main/main.c @@ -19,7 +19,7 @@ #include "mymisc.h" #include "dev_backup.h" #include "compiler_info.h" - +#include "elec_det.h" @@ -31,6 +31,7 @@ int main() { const sys_param_def *par=sys_param(); debug_init(); + elec_init(); app_init(); protu_def *protu=app_variable("protu",0,0); @@ -52,7 +53,10 @@ int main() while(1) { - rt_thread_mdelay(5000); + elec_led2_power(1); + rt_thread_mdelay(300); + elec_led2_power(0); + rt_thread_mdelay(300); } } diff --git a/source/soft/debug.c b/source/soft/debug.c index 984c950..f39c7ea 100644 --- a/source/soft/debug.c +++ b/source/soft/debug.c @@ -1,5 +1,5 @@ - +#include "board.h" #include "if_rtt.h" #include "stdio.h" #include "stdarg.h" @@ -8,19 +8,44 @@ #ifdef RT_THREAD #include "rtthread.h" #endif -#define DBG_DEV rtt() +#if 0 + + +#define DBG_DEV_INIT() rtt()->init() +#define DBG_DEV_WRITE(d,len) rtt()->write(d,len) + +#else + +#define DBG_DEV_INIT()\ + {\ + g_data.uart=dev_get("uart1");\ + if(g_data.uart){\ + g_data.uart->init(g_data.uart,0);\ + }\ + } +#define DBG_DEV_WRITE(d,len)\ + {\ + if(g_data.uart){\ + g_data.uart->write(g_data.uart,d,len);\ + }\ + } + +#endif + #define CONSOLEBUF_SIZE 1024 + typedef struct{ int inited; #ifdef RT_THREAD struct rt_mutex mutex; #endif + uart_def *uart; }self_def; static self_def g_data; @@ -32,8 +57,8 @@ int debug_init(void) #ifdef RT_THREAD rt_mutex_init(&g_data.mutex,"debug_mutex",RT_IPC_FLAG_FIFO); #endif - DBG_DEV->init(); - DBG_DEV->write((const uint8_t *)"\r\n",2); + DBG_DEV_INIT(); + DBG_DEV_WRITE((const uint8_t *)"\r\n",2); g_data.inited=1; DBG_LOG("debug inited.\r\n"); } @@ -64,7 +89,7 @@ void debug_log(const char *file,const char *fun,int line,int level,const char *f va_end(args); memcpy(&log_buf[length],"\r\n",2); length+=2; - DBG_DEV->write((const uint8_t *)log_buf,length); + DBG_DEV_WRITE((const uint8_t *)log_buf,length); #ifdef RT_THREAD rt_mutex_release(&g_data.mutex); #endif diff --git a/source/task/prot_uc.c b/source/task/prot_uc.c index f5b6369..a2e6f27 100644 --- a/source/task/prot_uc.c +++ b/source/task/prot_uc.c @@ -199,7 +199,7 @@ static void protu_set_endecode_fun(protu_def *u) static int protu_init(void) { const sys_param_def *par=sys_param(); - const char *name="uart1"; + const char *name="host"; protu_def *protu=protu_creat(dev_get(name)); app_variable("protu",protu,0); diff --git a/source/task/tran_for_slave.c b/source/task/tran_for_slave.c index 86c5f9f..23c7055 100644 --- a/source/task/tran_for_slave.c +++ b/source/task/tran_for_slave.c @@ -11,14 +11,356 @@ #include "coder_judge.h" #include "JQ_UIDGenerate.h" #include "transmit.h" - - - - - - - - +#include "elec_det.h" +#include "crc.h" +#include "dev_backup.h" + + +typedef struct{ + ucport_def u; + rt_timer_t timer; +}slave_def; + + + + +static void slave_del(ucport_def *u) +{ + slave_def *s=(slave_def *)u; + CHECK_DO(s->timer,rt_timer_delete); + free(u); +} + + + +// 获取检测结果 +static int check_result_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_str) +{ + emit tran_reply_signal(u->p,arr_temp(elec_check_result())); + return 0; +} +static ucport_def *check_result(tran_def *t, uint8_t cmd,array_def *data) +{ + int ret=0; + slave_def *u=calloc(1,sizeof(slave_def)); + u->u.p=t; + u->u.del=slave_del; + u->u.dolater=check_result_dolater; + u->u.dolater(&u->u,cmd,data,"ok"); + return (ucport_def *)u; +} +transmit_export(ym_slave,0x02,check_result) + + + +// 设置硬件版本号 +static int write_hw_version_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_str) +{ + int value=arr_get(data,0)|(arr_get(data,1)<<8); + emit tran_reply_signal(u->p,arr_temp(elec_write_hardversion(value))); + return 0; +} +static ucport_def *write_hw_version(tran_def *t, uint8_t cmd,array_def *data) +{ + int ret=0; + slave_def *u=calloc(1,sizeof(slave_def)); + u->u.p=t; + u->u.del=slave_del; + u->u.dolater=write_hw_version_dolater; + u->u.dolater(&u->u,cmd,data,"ok"); + return (ucport_def *)u; +} +transmit_export(ym_slave,0x03,write_hw_version) + + + + + +// 设置电阻校准值 +static int write_resistor_cbv_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_str) +{ + int value=arr_get(data,0)|(arr_get(data,1)<<8); + emit tran_reply_signal(u->p,arr_temp(elec_write_resistor_cbv(value))); + return 0; +} +static ucport_def *write_resistor_cbv(tran_def *t, uint8_t cmd,array_def *data) +{ + int ret=0; + int value=arr_get(data,0)|(arr_get(data,1)<<8); + slave_def *u=calloc(1,sizeof(slave_def)); + u->u.p=t; + u->u.del=slave_del; + u->u.dolater=write_resistor_cbv_dolater; + u->u.dolater(&u->u,cmd,data,"ok"); + return (ucport_def *)u; +} +transmit_export(ym_slave,0x04,write_resistor_cbv) + + + + +// 测量桥丝阻值 +static int check_resistor_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_str) +{ + emit tran_reply_signal(u->p,arr_temp(elec_check_resistor())); + return 0; +} +static ucport_def *check_resistor(tran_def *t, uint8_t cmd,array_def *data) +{ + int ret=0; + slave_def *u=calloc(1,sizeof(slave_def)); + u->u.p=t; + u->u.del=slave_del; + u->u.dolater=check_resistor_dolater; + u->u.dolater(&u->u,cmd,data,"ok"); + return (ucport_def *)u; +} +transmit_export(ym_slave,0x05,check_resistor) + + + + + + +// 根据方案检测 +static int check_with_scheme_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_str) +{ + emit tran_reply_signal(u->p,arr_temp(elec_check_with_scheme(data))); + return 0; +} +static ucport_def *check_with_scheme(tran_def *t, uint8_t cmd,array_def *data) +{ + int ret=0; + slave_def *u=calloc(1,sizeof(slave_def)); + u->u.p=t; + u->u.del=slave_del; + u->u.dolater=check_with_scheme_dolater; + u->u.dolater(&u->u,cmd,data,"ok"); + return (ucport_def *)u; +} +transmit_export(ym_slave,0x0b,check_with_scheme) +transmit_export(ym_slave,0x0c,check_with_scheme) + + + + + +// 停止上报 +static int stop_submit_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_str) +{ + array_def *r=arr_creat(); + arr_append(r,0); + emit tran_reply_signal(u->p,arr_temp(r)); + return 0; +} +static ucport_def *stop_submit(tran_def *t, uint8_t cmd,array_def *data) +{ + int ret=0; + slave_def *u=calloc(1,sizeof(slave_def)); + u->u.p=t; + u->u.del=slave_del; + u->u.dolater=stop_submit_dolater; + u->u.dolater(&u->u,cmd,data,"ok"); + return (ucport_def *)u; +} +transmit_export(ym_slave,0x14,stop_submit) + + + + + + + +// 定义地址宏 +// 本程序中程序下载地址不是这个地址,在此用来计算偏移量 +#define MCU_APP_ADDR_BASE 0x8004000 +#define MCU_TASKID_ADDR_BASE 0x803f000 + +// 定义升级结构体 +typedef struct{ + uint8_t device_state; + uint32_t flash_addr; +}updata_def; +static updata_def g_updata; + + +// 查询设备状态,第一次返回在app,如果设置了跳转指令则返回在bootloader +// 1:app;2:bootleader +static int device_state_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_str) +{ + array_def *r=arr_creat(); + arr_append(r,g_updata.device_state+1); + emit tran_reply_signal(u->p,arr_temp(r)); + return 0; +} +static ucport_def *device_state(tran_def *t, uint8_t cmd,array_def *data) +{ + int ret=0; + slave_def *u=calloc(1,sizeof(slave_def)); + u->u.p=t; + u->u.del=slave_del; + u->u.dolater=device_state_dolater; + u->u.dolater(&u->u,cmd,data,"ok"); + return (ucport_def *)u; +} +transmit_export(ym_slave,0xf9,device_state) + +// 跳转至bootloader,这里只是改变标志,实际还是在app中 +static int turn_to_bootloader_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_str) +{ + g_updata.device_state=1; + array_def *r=arr_creat(); + arr_append(r,0); + emit tran_reply_signal(u->p,arr_temp(r)); + return 0; +} +static ucport_def *turn_to_bootloader(tran_def *t, uint8_t cmd,array_def *data) +{ + int ret=0; + slave_def *u=calloc(1,sizeof(slave_def)); + u->u.p=t; + u->u.del=slave_del; + u->u.dolater=turn_to_bootloader_dolater; + u->u.dolater(&u->u,cmd,data,"ok"); + return (ucport_def *)u; +} +transmit_export(ym_slave,0xf8,turn_to_bootloader) + + + + +// 生成文件头 +static uint32_t creat_file_head(uint32_t addr,const char *name) +{ + uint8_t *td=calloc(FLASH_FILE_HEAD_SIZE,sizeof(uint8_t)); + // 文件大小和文件名 + memcpy(td,name,strlen(name)); + // used字段 + ((flash_file *)td)->used=0xffffffff; + flash_write((uint8_t *)addr,td,FLASH_FILE_HEAD_SIZE); + free(td); + return addr+FLASH_FILE_HEAD_SIZE; +} + + +// 擦除app空间 +static int erase_app_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_str) +{ + flash_erase_app2(); + g_updata.flash_addr=creat_file_head((uint32_t)flash_get_app2(),"slave_app.pkt"); + array_def *r=arr_creat(); + arr_append(r,0); + emit tran_reply_signal(u->p,arr_temp(r)); + return 0; +} +static ucport_def *erase_app(tran_def *t, uint8_t cmd,array_def *data) +{ + int ret=0; + slave_def *u=calloc(1,sizeof(slave_def)); + u->u.p=t; + u->u.del=slave_del; + u->u.dolater=erase_app_dolater; + u->u.dolater(&u->u,cmd,data,"ok"); + return (ucport_def *)u; +} +transmit_export(ym_slave,0xfe,erase_app) + + + + +// 写入数据 +// 因为添加了文件头,实际写入地址应该偏移一个文件头的长度 +static int write_data_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_str) +{ + uint32_t addr=(arr_get(data,0))|(arr_get(data,1)<<8)|(arr_get(data,2)<<16)|(arr_get(data,3)<<24); + int len=arr_length(data)-4; + int ret=0; + uint32_t offset=addr-MCU_APP_ADDR_BASE; + addr=g_updata.flash_addr+offset; + ret=flash_write((uint8_t *)addr,&arr_data(data)[4],len); + array_def *r=arr_creat(); + arr_append(r,(ret!=0)); + emit tran_reply_signal(u->p,arr_temp(r)); + return 0; +} +static ucport_def *write_data(tran_def *t, uint8_t cmd,array_def *data) +{ + int ret=0; + slave_def *u=calloc(1,sizeof(slave_def)); + u->u.p=t; + u->u.del=slave_del; + u->u.dolater=write_data_dolater; + u->u.dolater(&u->u,cmd,data,"ok"); + return (ucport_def *)u; +} +transmit_export(ym_slave,0xfc,write_data) + + + + +// 校验并跳转 +static int ceck_crc_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_str) +{ + uint32_t addr_start=(arr_get(data,0))|(arr_get(data,1)<<8)|(arr_get(data,2)<<16)|(arr_get(data,3)<<24); + uint32_t addr_end=(arr_get(data,4))|(arr_get(data,5)<<8)|(arr_get(data,6)<<16)|(arr_get(data,7)<<24); + uint32_t crc32=(arr_get(data,8))|(arr_get(data,9)<<8)|(arr_get(data,10)<<16)|(arr_get(data,11)<<24); + int len=addr_end-addr_start; + addr_start+=FLASH_FILE_HEAD_SIZE; + int ret=(crc32!=crc_crc32((uint8_t *)addr_start,len)); + array_def *r=arr_creat(); + arr_append(r,ret); + emit tran_reply_signal(u->p,arr_temp(r)); + if(ret==0){ + later_execute((void (*)(void *))bk_reboot_app,0,100); + } + return 0; +} +static ucport_def *ceck_crc(tran_def *t, uint8_t cmd,array_def *data) +{ + int ret=0; + slave_def *u=calloc(1,sizeof(slave_def)); + u->u.p=t; + u->u.del=slave_del; + u->u.dolater=ceck_crc_dolater; + u->u.dolater(&u->u,cmd,data,"ok"); + return (ucport_def *)u; +} +transmit_export(ym_slave,0xfb,ceck_crc) + + + + + +// 写入数据,这个命令会自动擦除 +// 因为添加了文件头,实际写入地址应该偏移一个文件头的长度 +static int write_data2_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_str) +{ + uint32_t addr=(arr_get(data,0))|(arr_get(data,1)<<8)|(arr_get(data,2)<<16)|(arr_get(data,3)<<24); + int len=arr_length(data)-4; + int ret=0; + if((addr)==MCU_TASKID_ADDR_BASE){ + flash_erase_scheme(); + g_updata.flash_addr=creat_file_head((uint32_t)flash_get_scheme(),"scheme.bin"); + } + uint32_t offset=addr-MCU_TASKID_ADDR_BASE; + addr=g_updata.flash_addr+offset; + ret=flash_write((uint8_t *)addr,&arr_data(data)[4],len); + array_def *r=arr_creat(); + arr_append(r,(ret!=0)); + emit tran_reply_signal(u->p,arr_temp(r)); + return 0; +} +static ucport_def *write_data2(tran_def *t, uint8_t cmd,array_def *data) +{ + int ret=0; + slave_def *u=calloc(1,sizeof(slave_def)); + u->u.p=t; + u->u.del=slave_del; + u->u.dolater=write_data2_dolater; + u->u.dolater(&u->u,cmd,data,"ok"); + return (ucport_def *)u; +} +transmit_export(ym_slave,0x11,write_data2)