can_bootloader/user/DiagBootcode.aardio

628 lines
12 KiB
Plaintext
Raw Normal View History

2022-05-14 17:00:49 +08:00
var bootstate = 0;
var bootcount = 0;
var sendstate = 0;
2024-08-31 14:18:38 +08:00
var senddataid = 0;
var repeat_times = 0;
2022-05-14 17:00:49 +08:00
FuncWait = function(sid){
if(RespState == (sid + 0x40)){//正响应
2022-05-17 16:34:44 +08:00
//bootcount = 0;
2022-05-14 17:00:49 +08:00
return 0;
}
errsid,errnrc = FuncGetNrc();
FuncClrNrc();
if(errsid == sid){
if(errnrc == 0x78){//等待
bootcount = 0;
return 0xff;
}
else {
2022-07-06 16:55:12 +08:00
FuncDisplay("刷写错误 步骤" + bootstate);
2024-10-09 16:27:03 +08:00
FuncDisplay("Flashing error steps" + bootstate++"
2024-10-09 09:09:01 +08:00
");
2022-05-14 17:00:49 +08:00
boottimer.disable();
2022-05-18 10:43:03 +08:00
thread.command.$SendEnd(false);
2022-05-14 17:00:49 +08:00
return 1; //负响应
}
}
if(stopflag == 1){
FuncDisplay("停止");
2024-10-09 09:09:01 +08:00
FuncDisplay("Stop
");
2022-05-14 17:00:49 +08:00
boottimer.disable();
2022-05-18 10:43:03 +08:00
thread.command.$SendEnd(false);
2022-05-14 17:00:49 +08:00
return 2;//停止命令
}
bootcount += 1;
if(bootcount >= 400){
2022-05-18 14:06:44 +08:00
FuncDisplay("步骤" + bootstate + "超时 " + tostring(sid,16));
2024-10-09 16:27:03 +08:00
FuncDisplay("Step" + bootstate + " Timeout " + tostring(sid,16)++'\n');
2022-05-18 10:43:03 +08:00
thread.command.$SendEnd(false);
2022-05-14 17:00:49 +08:00
boottimer.disable();
return 3;//超时
}
if(sid==0x2e && repeat_times < 5 && bootcount > 100){
repeat_times++;
bootcount = 0;
repeat_times++;
sendstate = 0;
}
2024-08-31 14:18:38 +08:00
return 0xff;
2022-05-14 17:00:49 +08:00
}
FuncStopBoot = function(){
stopflag = 1;
}
FuncClearState = function(){
RespState = 0;
bootcount = 0;
sendstate = 1;
}
2024-08-31 14:18:38 +08:00
FuncInitBootState = function(id){
2022-05-14 17:00:49 +08:00
bootstate = 0;
RespState = 0;
bootcount = 0;
sendstate = 0;
2024-08-31 14:18:38 +08:00
senddataid = id;
repeat_times = 0;
2022-05-14 17:00:49 +08:00
}
2022-05-18 10:43:03 +08:00
2022-05-14 17:00:49 +08:00
2022-05-17 14:11:10 +08:00
BCD_Conv = function(num){
if(num > 99){
return 0;
}
2022-05-18 10:43:03 +08:00
var ret = 0;
ret += math.floor(num/10) * 16;
ret += num%10;
return ret;
2022-05-17 14:11:10 +08:00
}
2022-05-17 16:34:44 +08:00
var sendblockstate = 0;
var alldata = {};
var blocknum = 1;
2022-05-18 10:43:03 +08:00
var alldata_blocknum = 0;
var block_sended = 0;
2022-07-06 17:06:25 +08:00
var sendFlashDriverState = 0;
2024-08-31 14:18:38 +08:00
var FuncSendBlockApp_sendflag = 0;
2022-10-04 16:01:27 +08:00
FuncSendBlockInit = function(id){
2022-05-18 10:43:03 +08:00
var len = 0;
2022-10-04 16:01:27 +08:00
alldata = FuncGetAllData(id);
2022-05-17 16:34:44 +08:00
blocknum = 1;
2022-10-04 16:01:27 +08:00
if(alldata == null){
FuncDisplay("错误:空数据");
2024-10-09 09:09:01 +08:00
FuncDisplay("Error: Empty data
");
2022-10-04 16:01:27 +08:00
alldata_blocknum = 0;
sendblockstate = 0xff;
return 1;
}
2022-05-18 10:43:03 +08:00
for(i=1;#alldata;1){
2023-03-20 19:42:48 +08:00
len += math.ceil(#alldata[i]["data"] / 0x400)
2022-05-18 10:43:03 +08:00
}
2022-10-05 09:17:27 +08:00
alldata_blocknum = len;
2022-05-18 10:43:03 +08:00
block_sended = 0;
sendblockstate = 0;
2024-08-31 14:18:38 +08:00
FuncSendBlockApp_sendflag = 0;
2022-10-04 16:01:27 +08:00
return 0;
2022-05-18 10:43:03 +08:00
}
nextstate = function(val){
if(val == 0){
bootstate += 1;
sendstate = 0;
block_sended += 1;
2022-05-17 16:34:44 +08:00
}
}
2024-08-31 14:18:38 +08:00
2022-05-17 16:34:44 +08:00
FuncSendBlockApp = function(){
select(sendblockstate) {
case 0{
if(FuncSendBlockApp_sendflag == 0){
2023-03-20 19:42:48 +08:00
FuncDisplay("请求下载");
2024-10-09 09:09:01 +08:00
FuncDisplay("Request to download
");
2022-05-18 08:55:11 +08:00
FuncReq34(alldata[blocknum]["address"],#alldata[blocknum]["data"]);
2022-05-17 16:34:44 +08:00
FuncSendBlockApp_sendflag = 1;
RespState = 0;
bootcount = 0;
}
else {
if(FuncWait(0x34) == 0){
FuncSendBlockApp_sendflag = 0;
sendblockstate += 1;
2023-03-20 19:42:48 +08:00
2022-05-17 16:34:44 +08:00
}
}
}
case 1 {
2022-05-18 08:55:11 +08:00
FuncStartSendBlock(alldata[blocknum]["data"]);//初始化
2022-05-17 16:34:44 +08:00
FuncSendBlockApp_sendflag = 0;
sendblockstate += 1;
2023-03-20 19:42:48 +08:00
FuncDisplay("发送App数据中...");
2024-10-09 09:09:01 +08:00
FuncDisplay("Sending App Data...
");
2022-05-17 16:34:44 +08:00
}
case 2 {
if(FuncSendBlockApp_sendflag == 0){
2023-03-20 19:42:48 +08:00
sleep(20);
2022-05-17 16:34:44 +08:00
FuncSendNextBlock();
FuncSendBlockApp_sendflag = 1;
2022-05-18 10:43:03 +08:00
block_sended += 1;
2022-05-17 16:34:44 +08:00
RespState = 0;
bootcount = 0;
}
else {
if(FuncWait(0x36) == 0){
FuncSendBlockApp_sendflag = 0;
if(FuncGetSendStatus() == true){//所有块发送完成
sendblockstate += 1;
}
}
}
}
case 3 {
if(FuncSendBlockApp_sendflag == 0){
FuncReq37();
FuncSendBlockApp_sendflag = 1;
RespState = 0;
bootcount = 0;
}
else {
if(FuncWait(0x37) == 0){
FuncSendBlockApp_sendflag = 0;
sendblockstate += 1;
}
}
}
else {
if(blocknum < #alldata){
blocknum += 1;
sendblockstate = 0;
}
else {
2023-03-20 19:42:48 +08:00
FuncDisplay("所有App数据发送完成");
2024-10-09 09:09:01 +08:00
FuncDisplay("All app data has been sent
");
2022-05-17 16:34:44 +08:00
return 0;
}
}
}
return 1;
}
2022-07-06 17:06:25 +08:00
FuncSendBlockFlashDriver = function(){
select(sendFlashDriverState) {
case 0 {
}
case 1 {
}
case 2 {
}
case 3 {
}
else {
}
}
}
2024-10-29 17:16:03 +08:00
var err_version = 0;
2022-05-18 10:43:03 +08:00
var delaycount = 0;
2022-05-17 16:34:44 +08:00
//boot总流程
2022-05-18 10:43:03 +08:00
var boottime = 0;
2022-05-14 17:00:49 +08:00
FuncBootSeq = function(){
2022-05-18 10:43:03 +08:00
boottime++;
2022-05-14 17:00:49 +08:00
select(bootstate) {
case 0 {
2022-05-18 10:43:03 +08:00
boottime = 1;
2024-10-29 17:16:03 +08:00
err_version = 0;
2023-03-20 19:42:48 +08:00
nextstate(0);
2023-04-15 10:42:37 +08:00
delaycount = 0;
2024-10-09 16:27:03 +08:00
if(DiagReqID == 0x720){
FuncDisplay("LeftVibrationFault = " ++ LeftVibrationFault);
FuncDisplay("LeftTouchFault = " ++ LeftTouchFault);
FuncDisplay("LeftPressSensorFault = " ++ LeftPressSensorFault);
FuncDisplay("LeftCommonFault = " ++ LeftCommonFault);
}
else {
FuncDisplay("RightVibrationFault = " ++ RightVibrationFault);
FuncDisplay("RightTouchFault = " ++ RightTouchFault);
FuncDisplay("RightPressSensorFault = " ++ RightPressSensorFault);
FuncDisplay("RightCommonFault = " ++ RightCommonFault);
}
FuncDisplay('\n');
2023-03-20 19:42:48 +08:00
/*
2022-05-14 17:00:49 +08:00
if(sendstate == 0){
2022-10-04 16:01:27 +08:00
//FuncSendBlockInit(0);
2022-05-14 17:00:49 +08:00
FuncReadDID(0xF186);
FuncClearState();
}
else {
var ret = FuncWait(0x22);
nextstate(ret);
}
2023-03-20 19:42:48 +08:00
*/
2022-05-14 17:00:49 +08:00
}
case 1 {
2023-03-20 19:42:48 +08:00
//nextstate(0);
2022-05-14 17:00:49 +08:00
if(sendstate == 0){
2023-03-20 19:42:48 +08:00
FuncDisplay("读取版本");
2024-10-09 09:09:01 +08:00
FuncDisplay("Read version
");
2022-05-14 17:00:49 +08:00
FuncReadDID(0xF195);//读取软件版本
FuncClearState();
}
else {
2023-04-15 10:42:37 +08:00
//var ret = FuncWait(0x22);
//nextstate(0);
delaycount++;
if(delaycount > 5){
nextstate(0);
delaycount = 0;
}
2022-05-14 17:00:49 +08:00
}
}
case 2 {
if(sendstate == 0){
2022-07-06 16:55:12 +08:00
FuncReadDID(0xF193);//读取硬件版本
2022-05-14 17:00:49 +08:00
FuncClearState();
}
else {
2023-04-15 10:42:37 +08:00
//var ret = FuncWait(0x22);
//nextstate(0);
delaycount++;
if(delaycount > 5){
nextstate(0);
delaycount = 0;
}
2022-05-14 17:00:49 +08:00
}
}
case 3 {
2024-10-29 17:16:03 +08:00
//FuncDisplay('step3:');
//FuncDisplay(thrdTable.DIDdata);
if(thrdTable.DIDdata != null){
if(string.cmp(thrdTable.DIDdata,"SW0302",6) == 0){
err_version = 0;
}
else {
err_version = 1;
}
}
else {
err_version = 1;
}
if(err_version == 1){
FuncDisplay("版本号错误");
FuncDisplay('wrong version \n');
boottimer.disable();
thread.command.$SendEnd(false);
}
2023-04-15 10:42:37 +08:00
nextstate(0);
/*
2022-05-14 17:00:49 +08:00
if(sendstate == 0){
2023-03-20 19:42:48 +08:00
FuncDisplay("进入扩展会话");
FuncReq10(false,0x03);//进入扩展会话
2022-05-14 17:00:49 +08:00
FuncClearState();
}
else {
var ret = FuncWait(0x10);
2023-03-20 19:42:48 +08:00
nextstate(0);
2022-05-14 17:00:49 +08:00
}
2023-04-15 10:42:37 +08:00
*/
2022-05-14 17:00:49 +08:00
}
case 4 {
2023-03-20 19:42:48 +08:00
nextstate(0);
/*
2022-05-14 17:00:49 +08:00
if(sendstate == 0){
2022-05-17 14:11:10 +08:00
FuncReq85(0x02);//关闭DTC
2022-05-14 17:00:49 +08:00
FuncClearState();
}
else {
var ret = FuncWait(0x85);
2023-03-20 19:42:48 +08:00
nextstate(0);//跳过
2022-05-14 17:00:49 +08:00
}
2023-03-20 19:42:48 +08:00
*/
2022-05-14 17:00:49 +08:00
}
case 5 {
2023-03-20 19:42:48 +08:00
delaycount++;
if(delaycount > 10){
nextstate(0);
delaycount = 0;
}
/*
2022-05-14 17:00:49 +08:00
if(sendstate == 0){
2022-05-17 14:11:10 +08:00
FuncReq28(0x01,0x01);//禁止发送
2022-05-14 17:00:49 +08:00
FuncClearState();
}
else {
var ret = FuncWait(0x28);
2023-03-20 19:42:48 +08:00
nextstate(0);//跳过
2022-05-14 17:00:49 +08:00
}
2023-03-20 19:42:48 +08:00
*/
2022-05-14 17:00:49 +08:00
}
2022-05-17 14:11:10 +08:00
case 6 {
if(sendstate == 0){
2023-03-20 19:42:48 +08:00
FuncDisplay("进入编程会话");
2024-10-09 09:09:01 +08:00
FuncDisplay("Enter programming session
");
2022-05-17 14:11:10 +08:00
FuncReq10(false,0x02);//进入编程会话
FuncClearState();
}
else {
2023-03-20 19:42:48 +08:00
delaycount++;
if(delaycount > 10){
//nextstate(0);
//delaycount = 0;
var ret = FuncWait(0x10);
nextstate(ret);
}
2022-05-17 14:11:10 +08:00
}
}
case 7 {
if(sendstate == 0){
2023-03-20 19:42:48 +08:00
FuncDisplay("等待解锁");
2024-10-09 09:09:01 +08:00
FuncDisplay("Waiting to unlock
");
2023-03-20 19:42:48 +08:00
FuncReq27(0x03);//解密
2022-05-17 14:11:10 +08:00
FuncClearState();
}
else {
var ret = FuncWait(0x27);
nextstate(ret);
}
}
case 8 {
if(sendstate == 0){
//FuncReq27(02);//发送key
FuncClearState();
2023-03-20 19:42:48 +08:00
2022-05-17 14:11:10 +08:00
}
else {
2022-07-06 16:55:12 +08:00
//var ret = FuncWait(0x27);
var ret = FuncDiag27GetState();
2023-03-20 19:42:48 +08:00
nextstate(ret);//
2022-05-17 14:11:10 +08:00
}
}
case 9 {
2023-03-20 19:42:48 +08:00
nextstate(0);
/*
2022-05-17 14:11:10 +08:00
if(sendstate == 0){
FuncClearState();
2022-07-06 16:55:12 +08:00
FuncDIDWriteStr(0xf198,"Daming ");//写入repair_shopcode
2022-05-17 14:11:10 +08:00
}
else {
2023-03-20 19:42:48 +08:00
//var ret = FuncWait(0x2E);
nextstate(0);//
2022-05-17 14:11:10 +08:00
}
2023-03-20 19:42:48 +08:00
*/
2022-05-17 14:11:10 +08:00
}
case 10 {
2023-03-20 19:42:48 +08:00
nextstate(0);
/*
2022-05-17 16:34:44 +08:00
if(sendstate == 0){//写入installation_date
2022-05-17 14:11:10 +08:00
var year1 = BCD_Conv(time.now().year/100);
var year2 = BCD_Conv(time.now().year%100);
var month = BCD_Conv(time.now().month);
var day = BCD_Conv(time.now().day);
FuncReq2E(0XF199,{year1,year2,month,day})
FuncClearState();
2022-05-18 10:43:03 +08:00
//console.log("写入installation_date")
2022-05-17 14:11:10 +08:00
}
else {
2023-03-20 19:42:48 +08:00
//var ret = FuncWait(0x2E);
nextstate(0);
2022-05-17 14:11:10 +08:00
}
2023-03-20 19:42:48 +08:00
*/
2022-05-17 14:11:10 +08:00
}
2022-07-06 16:55:12 +08:00
case 11 {
2022-10-04 16:01:27 +08:00
if(sendstate == 0){//CheckLogicBlock
2023-03-20 19:42:48 +08:00
FuncDisplay("擦除APP");
2024-10-09 09:09:01 +08:00
FuncDisplay("Erase APP
");
2023-03-20 19:42:48 +08:00
FuncReq31EraseFlash(0x18000,0x20000);
2022-10-04 16:01:27 +08:00
FuncClearState();
}
else {
var ret = FuncWait(0x31);
2024-08-31 14:18:38 +08:00
//console.log("ret = " , ret);
2022-10-04 16:01:27 +08:00
nextstate(ret);
delaycount = 0;
2022-10-04 16:01:27 +08:00
}
}
case 12 {
delaycount++;
if(delaycount > 10){
nextstate(0);//延时100mS
delaycount = 0;
}
}
case 13 {
nextstate(0);
2022-10-04 16:01:27 +08:00
}
case 14 {
2022-05-17 16:34:44 +08:00
if(sendstate == 0){//发送数据
2024-08-31 14:18:38 +08:00
//console.log("开始发送App数据 ");
FuncSendBlockInit(senddataid);
2023-03-20 19:42:48 +08:00
//FuncDisplay("开始发送App数据");
2022-05-17 16:34:44 +08:00
FuncClearState();
}
else {
2024-08-31 14:18:38 +08:00
2022-05-17 16:34:44 +08:00
var ret = FuncSendBlockApp();
nextstate(ret);
}
}
2022-10-04 16:01:27 +08:00
case 15 {
2022-05-18 08:55:11 +08:00
if(sendstate == 0){//CheckLogicBlock
2023-03-20 19:42:48 +08:00
FuncDisplay("CRC校验");
2024-10-09 09:09:01 +08:00
FuncDisplay("CRC check
");
2024-08-31 14:18:38 +08:00
var crc = FuncGetFlashCRC(senddataid);
2022-10-04 16:01:27 +08:00
FuncReq31CheckLogicBlock(crc);
2022-05-17 16:34:44 +08:00
FuncClearState();
}
else {
2022-05-18 08:55:11 +08:00
var ret = FuncWait(0x31);
nextstate(ret);
}
}
2022-10-04 16:01:27 +08:00
case 16 {
2022-05-18 08:55:11 +08:00
if(sendstate == 0){////Programming Dependencies
2023-03-20 19:42:48 +08:00
FuncDisplay("检查标志");
2024-10-09 09:09:01 +08:00
FuncDisplay("Check Mark
");
2022-05-18 08:55:11 +08:00
FuncReq31CheckPD();
FuncClearState();
}
else {
var ret = FuncWait(0x31);
nextstate(ret);
}
}
2022-10-04 16:01:27 +08:00
case 17 {
2022-05-18 08:55:11 +08:00
if(sendstate == 0){//复位
2023-03-20 19:42:48 +08:00
FuncDisplay("复位");
2024-10-09 09:09:01 +08:00
FuncDisplay("Reset
");
2022-05-18 10:43:03 +08:00
FuncClearState();
2023-03-20 19:42:48 +08:00
FuncReq11(0x01);
2022-05-18 08:55:11 +08:00
}
else {
var ret = FuncWait(0x11);
2022-05-17 16:34:44 +08:00
nextstate(ret);
}
}
2022-05-17 14:11:10 +08:00
2022-10-04 16:01:27 +08:00
case 18 {
2022-05-18 10:43:03 +08:00
if(sendstate == 0){//等待复位完成
delaycount = 0;
FuncClearState();
}
else {
delaycount += 1;
if(delaycount > 100){
nextstate(0);//延时1S
}
}
}
2022-10-04 16:01:27 +08:00
case 19 {
2023-03-20 19:42:48 +08:00
//nextstate(0);
2022-05-18 08:55:11 +08:00
if(sendstate == 0){
2023-03-20 19:42:48 +08:00
FuncReq10(false,0x03);//进入扩展会话
2022-05-18 08:55:11 +08:00
FuncClearState();
}
else {
var ret = FuncWait(0x10);
nextstate(ret);
}
2023-03-20 19:42:48 +08:00
2022-05-18 08:55:11 +08:00
}
2022-10-04 16:01:27 +08:00
case 20 {
2023-03-20 19:42:48 +08:00
if(sendstate == 0){
FuncDisplay("写入刷写信息");
2024-10-09 09:09:01 +08:00
FuncDisplay("Write flashing information
");
2023-03-20 19:42:48 +08:00
FuncClearState();
2024-08-31 14:18:38 +08:00
FuncDIDWriteStr(0xf198,"DM_Reworker ");//写入repair_shopcode LEN=16
2023-03-20 19:42:48 +08:00
}
else {
var ret = FuncWait(0x2E);
nextstate(ret);//
}
2024-08-31 14:18:38 +08:00
2022-05-18 08:55:11 +08:00
}
2022-10-04 16:01:27 +08:00
case 21 {
2023-03-20 19:42:48 +08:00
if(sendstate == 0){//写入installation_date
var year1 = BCD_Conv(time.now().year/100);
var year2 = BCD_Conv(time.now().year%100);
var month = BCD_Conv(time.now().month);
var day = BCD_Conv(time.now().day);
FuncReq2E(0XF199,{year1,year2,month,day})
FuncClearState();
//console.log("写入installation_date")
}
else {
var ret = FuncWait(0x2E);
nextstate(ret);
}
//nextstate(0);
/*
2022-05-18 08:55:11 +08:00
if(sendstate == 0){
FuncReq85(0x01);//开启DTC
FuncClearState();
}
else {
var ret = FuncWait(0x85);
nextstate(ret);
}
2023-03-20 19:42:48 +08:00
*/
2022-05-18 08:55:11 +08:00
}
2022-10-04 16:01:27 +08:00
case 22 {
2023-03-20 19:42:48 +08:00
//nextstate(0);
2022-05-18 08:55:11 +08:00
if(sendstate == 0){
FuncReq10(false,0x01);//进入默认会话
2022-05-18 08:55:11 +08:00
FuncClearState();
}
else {
var ret = FuncWait(0x10);
2023-03-20 19:42:48 +08:00
nextstate(0);
2022-05-18 08:55:11 +08:00
}
2023-03-20 19:42:48 +08:00
2022-05-18 08:55:11 +08:00
}
case 23 {
if(sendstate == 0){
FuncDisplay("读取版本");
2024-10-09 16:27:03 +08:00
FuncDisplay('Read version\n');
FuncReadDID(0xF195);//读取软件版本
delaycount = 0;
2024-10-09 09:09:01 +08:00
FuncClearState();
}
else {
delaycount++;
if(delaycount > 5){
nextstate(0);
delaycount = 0;
}
}
}
case 24 {
if(sendstate == 0){
FuncDisplay("读取软件日期");
2024-10-09 16:27:03 +08:00
FuncDisplay('Read software date \n');
FuncReadDID(0xF18A);//读取软件版本
FuncClearState();
}
else {
delaycount++;
if(delaycount > 5){
nextstate(0);
delaycount = 0;
}
}
}
2022-05-14 17:00:49 +08:00
else {
2022-05-18 10:43:03 +08:00
thread.command.$SendEnd(true);
//FuncDisplay("刷写完成,用时 " + boottime/100 + " S")
2022-05-14 17:00:49 +08:00
boottimer.disable();
}
}
2022-10-04 16:01:27 +08:00
if(alldata_blocknum != 0){
thread.command.$SetProgress(block_sended/alldata_blocknum * 100);
}
2022-05-18 10:43:03 +08:00
2022-05-14 17:00:49 +08:00
}