From f62d27f6f5a8c0295d9be2835faf5be26dc26215 Mon Sep 17 00:00:00 2001 From: sunbeam Date: Tue, 11 Mar 2025 17:03:39 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0boot=E4=B8=8A=E4=BD=8D?= =?UTF-8?q?=E6=9C=BA=EF=BC=8C=E5=88=A0=E9=99=A4flashdrv?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CAN_Bootloader/default.aproj | 2 +- CAN_Bootloader/main.aardio | 57 ++++++++++++--------- CAN_Bootloader/user/CanThread.aardio | 66 ++++++++++++++++++------- CAN_Bootloader/user/Diag34code.aardio | 3 +- CAN_Bootloader/user/Diag36code.aardio | 1 + CAN_Bootloader/user/DiagBootcode.aardio | 51 ++++++++++++++----- CAN_Bootloader/user/S19Decode.aardio | 28 +++++++++++ 7 files changed, 153 insertions(+), 55 deletions(-) diff --git a/CAN_Bootloader/default.aproj b/CAN_Bootloader/default.aproj index f0795db..dbd76a0 100644 --- a/CAN_Bootloader/default.aproj +++ b/CAN_Bootloader/default.aproj @@ -1,5 +1,5 @@  - + diff --git a/CAN_Bootloader/main.aardio b/CAN_Bootloader/main.aardio index 86b28a9..00a683a 100644 --- a/CAN_Bootloader/main.aardio +++ b/CAN_Bootloader/main.aardio @@ -3,30 +3,31 @@ import win.ui; mainForm = win.form(text="CAN_Bootloader";right=599;bottom=465;border="dialog frame";max=false) mainForm.add( btnConnect={cls="button";text="连接";left=204;top=64;right=289;bottom=90;z=4}; -btnFlash={cls="button";text="开始刷写";left=37;top=315;right=136;bottom=343;z=9}; +btnExport={cls="button";text="转换烧录文件";left=35;top=294;right=134;bottom=323;z=26}; +btnFlash={cls="button";text="开始刷写";left=36;top=329;right=135;bottom=357;z=9}; btnFresh={cls="button";text="刷新";left=204;top=28;right=288;bottom=54;z=2}; -btnOpen={cls="button";text="打开文件";left=37;top=282;right=136;bottom=310;z=8}; -btnOpenFlashdrv={cls="button";text="打开FlashDriver";left=149;top=282;right=248;bottom=310;z=24}; -btnReadF180={cls="button";text="读取boot版本";left=37;top=415;right=136;bottom=443;z=19}; -btnReadF186={cls="button";text="读取当前会话";left=37;top=349;right=136;bottom=377;z=13}; -btnReadF187={cls="button";text="读取型号";left=149;top=415;right=248;bottom=443;z=20}; -btnReadF191={cls="button";text="读取编译日期";left=149;top=348;right=248;bottom=376;z=25}; -btnReadHw={cls="button";text="读取硬件版本号";left=149;top=381;right=248;bottom=409;z=12}; -btnReadSw={cls="button";text="读取软件版本号";left=37;top=382;right=136;bottom=410;z=10}; -btnTest={cls="button";text="停止";left=149;top=316;right=248;bottom=344;z=11}; +btnOpen={cls="button";text="打开文件";left=184;top=209;right=283;bottom=237;z=8}; +btnOpenFlashdrv={cls="button";text="进入BOOT";left=148;top=296;right=247;bottom=324;z=22}; +btnReadF180={cls="button";text="读取boot版本";left=36;top=429;right=135;bottom=457;z=19}; +btnReadF186={cls="button";text="读取当前会话";left=36;top=363;right=135;bottom=391;z=13}; +btnReadF187={cls="button";text="读取型号";left=148;top=429;right=247;bottom=457;z=20}; +btnReadF191={cls="button";text="读取编译日期";left=148;top=362;right=247;bottom=390;z=23}; +btnReadHw={cls="button";text="读取硬件版本号";left=148;top=395;right=247;bottom=423;z=12}; +btnReadSw={cls="button";text="读取软件版本号";left=36;top=396;right=135;bottom=424;z=10}; +btnTest={cls="button";text="停止";left=148;top=330;right=247;bottom=358;z=11}; cbbChannel={cls="combobox";left=58;top=64;right=191;bottom=90;edge=1;items={};mode="dropdown";z=3}; cbbDev={cls="combobox";left=58;top=27;right=191;bottom=53;edge=1;items={};mode="dropdown";z=1}; checkbox={cls="checkbox";text="CANFD设备";left=151;top=101;right=248;bottom=120;checked=1;z=21}; -edFile={cls="richedit";left=8;top=131;right=288;bottom=187;border=1;disabled=1;edge=1;multiline=1;wrap=1;z=14}; -edFile2={cls="richedit";left=8;top=213;right=288;bottom=269;border=1;disabled=1;edge=1;multiline=1;wrap=1;z=22}; -edit={cls="edit";left=294;top=19;right=596;bottom=401;autovscroll=false;edge=1;multiline=1;vscroll=1;z=5}; +edFile={cls="richedit";left=8;top=131;right=288;bottom=205;border=1;disabled=1;edge=1;multiline=1;wrap=1;z=14}; +edit={cls="edit";left=294;top=19;right=596;bottom=401;autohscroll=false;autovscroll=false;edge=1;multiline=1;vscroll=1;z=5}; progress={cls="progress";left=296;top=436;right=596;bottom=464;edge=1;max=100;min=0;z=15}; +radiobutton={cls="radiobutton";text="左侧";left=45;top=268;right=121;bottom=288;checked=1;group=1;hide=1;z=24}; +radiobutton2={cls="radiobutton";text="右侧";left=163;top=268;right=242;bottom=287;hide=1;z=25}; static={cls="static";text="设备";left=1;top=28;right=61;bottom=52;align="center";center=1;transparent=1;z=6}; static2={cls="static";text="通道";left=1;top=66;right=61;bottom=90;align="center";center=1;transparent=1;z=7}; static3={cls="static";text="刷写进度";left=296;top=409;right=349;bottom=429;transparent=1;z=16}; static4={cls="static";text="烧录APP";left=13;top=108;right=85;bottom=132;center=1;transparent=1;z=17}; -static5={cls="static";text="V0.1_20220518";left=451;top=1;right=595;bottom=17;align="right";center=1;transparent=1;z=18}; -static6={cls="static";text="FlashDriver";left=13;top=195;right=101;bottom=218;transparent=1;z=23} +static5={cls="static";text="V0.2_20250307";left=451;top=1;right=595;bottom=17;align="right";center=1;transparent=1;z=18} ) /*}}*/ @@ -154,8 +155,8 @@ var CanThread = function(){ DiagReadDID = function(did){ ::PostThreadMessage(thrdId,110,did,0)//自定义消息 } -var Diag10Req = function(num){ - ::PostThreadMessage(thrdId,111,num,0)//自定义消息 +var Diag10Req = function(phyaddr,num){ + ::PostThreadMessage(thrdId,111,phyaddr,num)//自定义消息 } var DiagBootReq = function(){ ::PostThreadMessage(thrdId,102,0,0)//自定义消息 @@ -186,10 +187,7 @@ mainForm.btnFlash.oncommand = function(id,event){ Display("请打开烧写文件"); return; } - if(io.exist(mainForm.edFile2.text) == null){ - Display("请打开flashdriver文件"); - return; - } + if(flag_connected == 0){ Display("请连接设备"); return; @@ -234,7 +232,8 @@ mainForm.btnReadF187.oncommand = function(id,event){ } mainForm.btnOpenFlashdrv.oncommand = function(id,event){ - ::PostThreadMessage(thrdId,104,1,0)//自定义消息-打开flashdriver + //::PostThreadMessage(thrdId,104,1,0)//自定义消息-打开flashdriver + Diag10Req(1,0x02);//进入扩展会话 } @@ -251,5 +250,19 @@ mainForm.btnReadF191.oncommand = function(id,event){ DiagReadDID(0xF191); } +mainForm.radiobutton.oncommand = function(id,event){ + ::PostThreadMessage(thrdId,121,0x731,0x7b1)//自定义消息-修改ID +} + +mainForm.radiobutton2.oncommand = function(id,event){ + ::PostThreadMessage(thrdId,121,0x732,0x7b2)//自定义消息-修改ID +} + +mainForm.btnExport.oncommand = function(id,event){ + ::PostThreadMessage(thrdId,106,0,0)//自定义消息-修改ID +} + mainForm.show(); +//::PostThreadMessage(thrdId,121,0x731,0x7b1)//自定义消息-修改ID +//Display("121111111111112131232111111111111131111111145451112323232323232323"); return win.loopMessage(); \ No newline at end of file diff --git a/CAN_Bootloader/user/CanThread.aardio b/CAN_Bootloader/user/CanThread.aardio index dabf5fd..aa96288 100644 --- a/CAN_Bootloader/user/CanThread.aardio +++ b/CAN_Bootloader/user/CanThread.aardio @@ -41,23 +41,13 @@ FuncLoopMsg = function(msg){ FuncStopBoot(); } case 104 {//打开s19文件 - if(msg.wParam == 1){ - FuncDisplay("打开FlashDriver"); - var ret = FuncOpenS19File(msg.wParam); - if(ret != null){ - thread.command.$ShowFlashDrvPath(ret); - var crc32 = FuncGetFlashCRC(1); - FuncDisplay("CRC = " ++ string.format("%X",crc32)); - } - } - else { - FuncDisplay("打开烧写文件"); - var ret = FuncOpenS19File(msg.wParam); - if(ret != null){ - thread.command.$ShowPath(ret); - var crc32 = FuncGetFlashCRC(2); - FuncDisplay("CRC = " ++ string.format("%X",crc32)); - } + + FuncDisplay("打开烧写文件"); + var ret = FuncOpenS19File(1); + if(ret != null){ + thread.command.$ShowPath(ret); + var crc32 = FuncGetFlashCRC(1); + FuncDisplay("CRC = " ++ string.format("%X",crc32)); } @@ -65,6 +55,9 @@ FuncLoopMsg = function(msg){ case 105 {//停止boot thread.stop(0); } + case 106 {//导出 + exportbootflag(); + } case 110 {//readDID FuncReadDID(msg.wParam); } @@ -86,12 +79,23 @@ FuncLoopMsg = function(msg){ case 120 { win.quitMessage() } + case 121 { + SetDiagID(msg.wParam,msg.lParam); + } else { } } } +SetDiagID = function(reqid,respid){ + DiagReqID = reqid;//0x18dadff1; + DiagRespID = respid;//0x18daf1df; + var idstr = string.format("req=0x%x,resp=0x%x",DiagReqID,DiagRespID); + FuncDisplay(idstr); +} + + var delay_const = 100000; DelayTest = function(){ @@ -161,6 +165,9 @@ FuncDiagPro = function(diagmsg){ case 0x50 { FuncDiag10Pro(table.slice(diagmsg.data,1,diagmsg.len)) } + case 0x51 { + FuncDiag11Pro(table.slice(diagmsg.data,1,diagmsg.len)) + } case 0x62 { FuncDiag22Pro(table.slice(diagmsg.data,1,diagmsg.len)) } @@ -223,7 +230,7 @@ var FuncSendPackage = function(){ while(#Packdata > 0) { //sleep(1); - delay(0.5); + delay(1); var data = {PackNext,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC}; var max = #Packdata > 7 ? 7 : #Packdata; for(i=1;max;1){ @@ -256,6 +263,17 @@ boottimer.onTimer = function(){ FuncBootSeq(); } +var tab2str = function(data){ + if(type(data) != type.table){ + return ""; + } + var str = ""; + for(i=1;#data;1){ + str = str ++ string.format(" %02X", data[i]); + } + return string.upper(str); +} + timer1 = win.timer(,1); diagresp = {} @@ -301,7 +319,17 @@ timer1.onTimer = function(){ } } else { - //console.varDump(ret[i].id); + if(ret[i].id & 0x7FFFFFFF == 0x234) + { + FuncDisplay("boot复位信息"); + FuncDisplay(tab2str(ret[i].data)); + } + elseif(ret[i].id & 0x7FFFFFFF == 0x222){ + FuncDisplay(tab2str(ret[i].data)); + } + + //console.varDump(ret[i]); + //console.dumpJson(ret[i]); //显示报文 } diff --git a/CAN_Bootloader/user/Diag34code.aardio b/CAN_Bootloader/user/Diag34code.aardio index 34e36b3..306e4f8 100644 --- a/CAN_Bootloader/user/Diag34code.aardio +++ b/CAN_Bootloader/user/Diag34code.aardio @@ -2,13 +2,14 @@ //发送 FuncReq34 = function(addr,len){ + FuncDisplay("请求下载"++ tostring(addr,16) ++ "," ++ tostring(len,16)) var data = {0x44,addr>>24,addr>>16,addr>>8,addr,len>>24,len>>16,len>>8,len}; var txdata = {0x10,2+#data,0x34,0x00,data[1],data[2],data[3],data[4]}; CANHw.SendMsg(DiagReqID,txdata); FuncPushPackage(DiagReqID,table.slice(data,5)); } -var maxlen = 0; +var maxlen = 2050; //接收 FuncDiag34Pro = function(data){ //console.dumpJson(data); diff --git a/CAN_Bootloader/user/Diag36code.aardio b/CAN_Bootloader/user/Diag36code.aardio index 1fed64d..76acf43 100644 --- a/CAN_Bootloader/user/Diag36code.aardio +++ b/CAN_Bootloader/user/Diag36code.aardio @@ -20,6 +20,7 @@ FuncGetSendStatus = function(){ } FuncSendNextBlock = function(){ var len = FuncGetSengLen(); + //sleep(500); if(#alldata>len){ FuncReq36(blocknum,table.slice(alldata,1,len)); alldata = table.slice(alldata,len+1,) diff --git a/CAN_Bootloader/user/DiagBootcode.aardio b/CAN_Bootloader/user/DiagBootcode.aardio index a945e6b..4207f49 100644 --- a/CAN_Bootloader/user/DiagBootcode.aardio +++ b/CAN_Bootloader/user/DiagBootcode.aardio @@ -94,6 +94,7 @@ FuncSendBlockInit = function(id){ len += math.ceil(#alldata[i]["data"] / FuncGetSengLen()) } alldata_blocknum = len; + FuncDisplay("alldata_blocknum = " ++ alldata_blocknum); block_sended = 0; sendblockstate = 0; FuncSendBlockApp_sendflag = 0; @@ -120,6 +121,7 @@ FuncSendBlockApp = function(){ } else { if(FuncWait(0x34) == 0){ + sleep(200); FuncSendBlockApp_sendflag = 0; sendblockstate += 1; } @@ -334,6 +336,7 @@ FuncBootSeq = function(){ } } case 10 { + /* if(sendstate == 0){ FuncReq31EraseFlash(0x1FFFF000,0x1000); FuncClearState(); @@ -343,9 +346,12 @@ FuncBootSeq = function(){ var ret = FuncWait(0x31); nextstate(ret); } + */ + nextstate(0); } case 11 { + /* if(sendstate == 0){//写入installation_date FuncReq3103(0xFD01); FuncClearState(); @@ -354,8 +360,11 @@ FuncBootSeq = function(){ var ret = FuncWait(0x31); nextstate(ret); } + */ + nextstate(0); } case 12 { + /* if(sendstate == 0){//发送数据 FuncSendBlockInit(1); FuncDisplay("开始发送FlashDrv数据"); @@ -365,8 +374,11 @@ FuncBootSeq = function(){ var ret = FuncSendBlockApp(); nextstate(ret); } + */ + nextstate(0); } case 13 { + /* if(sendstate == 0){//CheckLogicBlock //var crc = FuncGetFlashCRC(0); //FuncReq31CheckLogicBlock(crc); @@ -377,18 +389,11 @@ FuncBootSeq = function(){ var ret = FuncWait(0x31); nextstate(ret); } + */ + nextstate(0); } + case 14 { - if(sendstate == 0){// - FuncReq3103(0xFD02); - FuncClearState(); - } - else { - var ret = FuncWait(0x31); - nextstate(ret); - } - } - case 15 { if(sendstate == 0){//CheckLogicBlock FuncReq31EraseFlash(0x00010000,0x70000); FuncClearState(); @@ -398,10 +403,32 @@ FuncBootSeq = function(){ nextstate(ret); } } - + case 15 { + /* + if(sendstate == 0){// + FuncReq3103(0xFD02); + FuncClearState(); + } + else { + var ret = FuncWait(0x31); + nextstate(ret); + } + */ + if(sendstate == 0){//等待复位完成 + delaycount = 0; + FuncClearState(); + } + else { + delaycount += 1; + if(delaycount > 20){ + nextstate(0);//延时0.1S + } + + } + } case 16 { if(sendstate == 0){//发送数据 - FuncSendBlockInit(2); + FuncSendBlockInit(1); FuncDisplay("开始发送App数据"); FuncClearState(); } diff --git a/CAN_Bootloader/user/S19Decode.aardio b/CAN_Bootloader/user/S19Decode.aardio index 2b74ddb..4bd7641 100644 --- a/CAN_Bootloader/user/S19Decode.aardio +++ b/CAN_Bootloader/user/S19Decode.aardio @@ -36,6 +36,8 @@ var Crc32Tble = var fileinfo = ""; var FlashData = {}; var AllData = {} +var BootData = {}; +var S19path = null; FuncGetAllData = function(id){ if(id > #AllData){ return null; @@ -76,6 +78,7 @@ FuncOpenS19File = function(id,path){ if(io.exist( path )){ //winform.editPath.text = path; + S19path = path; var readbuf = string.load(path); readbuf = string.split(readbuf,'\r\n'); @@ -180,6 +183,11 @@ FuncOpenS19File = function(id,path){ s19crc.data[0x7FF] = crc32temp>>16; s19crc.data[0x7FE] = crc32temp>>8; s19crc.data[0x7FD] = crc32temp&0XFF; + + for(i=1;8;1){ + BootData[i] = s19crc.data[0x7F8 + i]; + } + } if(block != null){ table.push(FlashData,block) @@ -196,6 +204,26 @@ FuncOpenS19File = function(id,path){ return path; } +exportbootflag = function(){ + if(io.exist( S19path )){ + var newpath = S19path++".fix"; + fsys.copy(S19path,newpath,,,); + var str = "S20C07FFF8" + var checksum=0x0C+0x07+0xff+0xf8; + for(i=1;8;1){ + var num = BootData[i] & 0xff + var tempstr = string.format("%02X",num); + //console.log(tempstr); + str = str++tempstr; + checksum+=BootData[i]; + } + checksum = 0xff - (checksum&0xff); + str = str++string.format("%02X",checksum);; + FuncDisplay(str); + string.save(newpath,str,true); + FuncDisplay("转换完成:"++newpath); + } +}