This commit is contained in:
sunbeam 2022-05-17 16:34:44 +08:00
parent 93ac81b835
commit 1328be60b7
9 changed files with 385 additions and 20 deletions

View File

@ -15,5 +15,9 @@
<file name="securety.aardio" path="user\securety.aardio" comment="user\securety.aardio"/>
<file name="Diag2Ecode.aardio" path="user\Diag2Ecode.aardio" comment="user\Diag2Ecode.aardio"/>
<file name="Diag31code.aardio" path="user\Diag31code.aardio" comment="user\Diag31code.aardio"/>
<file name="Diag34code.aardio" path="user\Diag34code.aardio" comment="user\Diag34code.aardio"/>
<file name="Diag36code.aardio" path="user\Diag36code.aardio" comment="user\Diag36code.aardio"/>
<file name="S19Decode.aardio" path="user\S19Decode.aardio" comment="user\S19Decode.aardio"/>
<file name="Diag37code.aardio" path="user\Diag37code.aardio" comment="user\Diag37code.aardio"/>
</folder>
</project>

View File

@ -3,16 +3,16 @@ import win.ui;
mainForm = win.form(text="CAN_Bootloader";right=599;bottom=399;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=152;top=180;right=272;bottom=205;z=10};
btnFlash={cls="button";text="开始刷写";left=152;top=180;right=272;bottom=205;z=9};
btnFresh={cls="button";text="刷新";left=204;top=28;right=288;bottom=54;z=2};
btnOpen={cls="button";text="打开文件";left=31;top=180;right=131;bottom=206;z=9};
btnReadF186={cls="button";text="读取当前会话";left=19;top=293;right=118;bottom=321;z=14};
btnReadHw={cls="button";text="读取硬件版本号";left=17;top=263;right=116;bottom=291;z=13};
btnReadSw={cls="button";text="读取软件版本号";left=17;top=233;right=116;bottom=261;z=11};
btnTest={cls="button";text="测试";left=173;top=355;right=272;bottom=383;z=12};
btnOpen={cls="button";text="打开文件";left=31;top=180;right=131;bottom=206;z=8};
btnReadF186={cls="button";text="读取当前会话";left=19;top=293;right=118;bottom=321;z=13};
btnReadHw={cls="button";text="读取硬件版本号";left=17;top=263;right=116;bottom=291;z=12};
btnReadSw={cls="button";text="读取软件版本号";left=17;top=233;right=116;bottom=261;z=10};
btnTest={cls="button";text="测试";left=173;top=355;right=272;bottom=383;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};
edFile={cls="edit";left=27;top=141;right=281;bottom=165;edge=1;readonly=1;z=8};
edFile={cls="richedit";left=8;top=114;right=288;bottom=170;border=1;disabled=1;edge=1;multiline=1;wrap=1;z=14};
edit={cls="edit";left=296;top=8;right=582;bottom=383;edge=1;multiline=1;z=5};
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}
@ -22,12 +22,10 @@ static2={cls="static";text="通道";left=1;top=66;right=61;bottom=90;align="cent
import win;
import usb2canfd;
Display = function(str){
mainForm.edit.print(tostring(time()) + " " + str);
}
mainForm.edFile.wrap = true;
CANHw = usb2canfd.USB2CANHW();
var ret = CANHw.LoadDll();
@ -77,7 +75,9 @@ var listener = thread.command();
listener.$Display = function(str){
Display(str);
}
listener.$ShowPath = function(str){
mainForm.edFile.text = str;
}
//线程函数
var CanThread = function(){
@ -123,6 +123,10 @@ mainForm.btnFlash.oncommand = function(id,event){
DiagBootReq();
}
mainForm.btnOpen.oncommand = function(id,event){
::PostThreadMessage(thrdId,104,0,0)//自定义消息-打开文件
}
thrdHandle,thrdId = thread.create( CanThread )

View File

@ -17,15 +17,22 @@ FuncLoopMsg = function(msg){
case 100 {//刷新硬件
FuncFreshHw();
}
case 101 {
case 101 {//连接硬件
FuncConnect(msg.wParam,msg.lParam);
}
case 102 {
case 102 {//开始boot
FuncStartBoot();
}
case 103 {
case 103 {//停止boot
FuncStopBoot();
}
case 104 {//打开s19文件
FuncDisplay("打开文件");
var ret = FuncOpenS19File();
if(ret != null){
thread.command.$ShowPath(ret);
}
}
case 110 {//readDID
FuncReadDID(msg.wParam);
}
@ -84,6 +91,7 @@ loadcodex("\user\Diag27code.aardio");
loadcodex("\user\Diag2Ecode.aardio");
loadcodex("\user\DiagBootcode.aardio");
loadcodex("\user\S19Decode.aardio");
RespState = 0;
FuncDiagPro = function(diagmsg){

View File

@ -1,14 +1,29 @@
FuncReq31EraseFlash = function(addr,len){
var data = {0xff,0x00,0x44,addr>>24,addr>>16,addr>>8,addr,len>>24,len>>16,len>>8,len};
FuncReq31(data);
}
//发送
FuncReq31 = function(data){
if(#data > 6){//多帧
if(#data > 5){//多帧
var txdata = {0x10,2+#data,0x31,0x01,data[1],data[2],data[3],data[4]};
CANHw.SendMsg(DiagReqID,txdata);
FuncPushPackage(DiagReqID,table.slice(data,5));
}
else {
var txdata = {2+#data,0x31,0x01,0, 0,0,0,0};
for(i=1;#data;1){
txdata[5+i] = data[i];
}
CANHw.SendMsg(DiagReqID,txdata);
}
}
//接收
FuncDiag28Pro = function(data){
FuncDiag31Pro = function(data){
//console.dumpJson(data);
select(data[1]) {
case 1 {

25
user/Diag34code.aardio Normal file
View File

@ -0,0 +1,25 @@
//发送
FuncReq34 = function(addr,len){
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));
}
//接收
FuncDiag34Pro = function(data){
//console.dumpJson(data);
select(data[1]) {
case 1 {
FuncDisplay("使能接收,禁能发送")
}
case 2 {
FuncDisplay("28 - TDB02")
}
case 3 {
FuncDisplay("28 - TDB03")
}
else {
}
}
}

64
user/Diag36code.aardio Normal file
View File

@ -0,0 +1,64 @@
//
var blocknum=1;
var flag_sendend = false;
var flag_sending = false;
var alldata = {};
FuncStartSendBlock = function(data){
blocknum = 0x01;
flag_sendend = false;
flag_sending = true;
alldata = data;
/*
if(alldata>0x400){
FuncReq36(blocknum,table.slice(alldata,1,0x400));
alldata = table.slice(alldata,0x401,)
}
else {
FuncReq36(blocknum,alldata);
alldata = {};
}
*/
}
FuncStopSendBlock = function(data){
blocknum = 0x01;
flag_sendend = false;
flag_sending = false;
}
FuncGetSendStatus = function(){
return flag_sendend;
}
FuncSendNextBlock = function(){
if(alldata>0x400){
FuncReq36(blocknum,table.slice(alldata,1,0x400));
alldata = table.slice(alldata,0x401,)
}
else {
FuncReq36(blocknum,alldata);
alldata = {};
flag_sendend = true;
}
blocknum += 1;
}
//发送
FuncReq36 = function(num,data){
len = #data+2;
var txdata = {0x10+(len>>8),len&0xff,0x36,num&0xff,data[1],data[2],data[3],data[4]};
CANHw.SendMsg(DiagReqID,txdata);
FuncPushPackage(DiagReqID,table.slice(data,5));
}
//接收
FuncDiag36Pro = function(data){
//console.dumpJson(data);
/*
if(data[1] == blocknum){
blocknum += 1;
if(flag_sending == true){
FuncSendNextBlock();
}
}
*/
}

9
user/Diag37code.aardio Normal file
View File

@ -0,0 +1,9 @@
//发送
FuncReq37 = function(){
var txdata = {0x1,0x37,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA};
CANHw.SendMsg(DiagReqID,txdata);
}
//接收
FuncDiag37Pro = function(data){
}

View File

@ -5,13 +5,13 @@ var bootcount = 0;
var sendstate = 0;
FuncWait = function(sid){
if(RespState == (sid + 0x40)){//正响应
//bootcount = 0;
return 0;
}
errsid,errnrc = FuncGetNrc();
FuncClrNrc();
if(errsid == sid){
if(errnrc == 0x78){//等待
bootcount = 0;
return 0xff;
}
@ -65,7 +65,88 @@ BCD_Conv = function(num){
return (num/10)*16 + (num%10);
}
var sendblockstate = 0;
var alldata = {};
var blocknum = 1;
FuncSendBlockInit = function(){
alldata = FuncGetAllData();
blocknum = 1;
if(alldata != null){
blocknum = 1;
FuncStartSendBlock(alldata[blocknum].["data"])
}
}
var FuncSendBlockApp_sendflag = 0
FuncSendBlockApp = function(){
select(sendblockstate) {
case 0{
if(FuncSendBlockApp_sendflag == 0){
FuncReq34(alldata[blocknum].["address"],#alldata[blocknum].["data"]);
FuncSendBlockApp_sendflag = 1;
RespState = 0;
bootcount = 0;
}
else {
if(FuncWait(0x34) == 0){
FuncSendBlockApp_sendflag = 0;
sendblockstate += 1;
}
}
}
case 1 {
FuncStartSendBlock(alldata[blocknum].["data"]);//初始化
FuncSendBlockApp_sendflag = 0;
sendblockstate += 1;
}
case 2 {
if(FuncSendBlockApp_sendflag == 0){
FuncSendNextBlock();
FuncSendBlockApp_sendflag = 1;
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 {
//所有数据发送完成
return 0;
}
}
}
return 1;
}
//boot总流程
FuncBootSeq = function(){
select(bootstate) {
case 0 {
@ -161,7 +242,7 @@ FuncBootSeq = function(){
}
case 9 {
if(sendstate == 0){
FuncDIDWriteStr(0xf198,"0123456789abcdef1234");
FuncDIDWriteStr(0xf198,"0123456789abcdef1234");//写入repair_shopcode
FuncClearState();
}
else {
@ -171,7 +252,7 @@ FuncBootSeq = function(){
}
case 10 {
if(sendstate == 0){
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);
@ -185,6 +266,39 @@ FuncBootSeq = function(){
nextstate(ret);
}
}
case 11 {
if(sendstate == 0){//擦除flash
FuncReq31EraseFlash(0x00FE0000,0x00019FE0);//
FuncClearState();
}
else {
var ret = FuncWait(0x31);
nextstate(ret);
}
}
case 12 {
if(sendstate == 0){//发送数据
FuncSendBlockInit();
FuncClearState();
}
else {
var ret = FuncSendBlockApp();
nextstate(ret);
}
}
case 13 {
if(sendstate == 0){//发送数据
FuncSendBlockInit();
FuncClearState();
}
else {
var ret = FuncSendBlockApp();
nextstate(ret);
}
}
else {
FuncDisplay("刷写完成")

122
user/S19Decode.aardio Normal file
View File

@ -0,0 +1,122 @@
var fileinfo = "";
var FlashData = {};
FuncGetAllData = function(){
return FlashData;
}
FuncGetFileInfo = function(){
return fileinfo;
}
FuncOpenS19File = function(path){
import fsys.dlg;
if(path == null){
path = fsys.dlg.open('S19文件|*.sx;*.s19;*.srec|所有文件|*.*||',,,winform);
}
if(io.exist( path )){
//winform.editPath.text = path;
var readbuf = string.load(path);
readbuf = string.split(readbuf,'\r\n');
//console.dumpJson(readbuf);
var block = null;
FlashData = {};
for(i=1;#readbuf;1){
if(#readbuf[i] == 0){
continue;
}
var str = readbuf[i];
var data = "";
var addr = 0;
var len = 0;
select(string.slice(str,1,2)) {
case "S0"{
//S0为文件信息
var fileinfobuf = string.slice(str,9,-3);//取出文件信息
fileinfo = "file info:"+string.unhex(fileinfobuf,"")//解码
fileinfo = string.replace(fileinfo,"\z"," ");//替换空字符
FuncDisplay(fileinfo)//显示
continue;
}
case "S1"{
len = tonumber(string.slice(str,3,4),16)
addr = tonumber(string.slice(str,5,8),16)
data = string.slice(str,9,-3)
}
case "S2"{
len = tonumber(string.slice(str,3,4),16)
addr = tonumber(string.slice(str,5,10),16)
data = string.slice(str,11,-3)
}
case "S3"{
len = tonumber(string.slice(str,3,4),16)
addr = tonumber(string.slice(str,5,12),16)
data = string.slice(str,13,-3)
}
else {
continue;
}
}
if(block == null){
//空表,第一次进入
block = {};
block["address"] = addr;
block["data"] = {};
}
else {
//非空表
if(addr == (block["address"]+#block["data"])){
//连续,无动作
}
else {
//不同块,新建块
FlashData[#FlashData+1]={"address" = block["address"];"data" = block["data"];}
block["address"] = addr;
block["data"] = {};
//不连续,判断是否填充
/*不填充,所以注释了
if((addr & 0xfff800) == ((block["address"]+#block["data"])&0xfff800)){
//同一个块,填充FF
for(i=1;addr - (block["address"]+#block["data"]);1){
table.push(block["data"],0xff);
}
}
else {
FlashData[#FlashData+1]={"address" = block["address"];"data" = block["data"];}
block["address"] = addr;
block["data"] = {};
}
*/
}
}
data = string.unhex(data,"")
for(i=1;#data;1){
var bytedata = string.unpack(data,i)
table.push(block["data"],bytedata)
}
}
if(block != null){
table.push(FlashData,block)
//console.dumpTable(block["data"]);
}
}
//blocknum = 1;
return path;
}