RP-01/CAN_Bootloader/user/DiagBootcode.aardio

521 lines
9.0 KiB
Plaintext
Raw Normal View History

2024-03-30 15:05:00 +08:00
var bootstate = 0;
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;
}
else {
FuncDisplay("刷写错误 步骤" + bootstate);
boottimer.disable();
thread.command.$SendEnd(false);
return 1; //负响应
}
}
if(stopflag == 1){
FuncDisplay("停止");
boottimer.disable();
thread.command.$SendEnd(false);
return 2;//停止命令
}
bootcount += 1;
2024-05-06 10:22:27 +08:00
/*
if(bootcount > 20 && sid == 0x36){
bootcount = 0;
return 0;
}
*/
2024-03-30 15:05:00 +08:00
if(bootcount >= 400){
FuncDisplay("步骤" + bootstate + "超时 " + tostring(sid,16));
thread.command.$SendEnd(false);
boottimer.disable();
return 3;//超时
}
}
FuncStopBoot = function(){
stopflag = 1;
}
FuncClearState = function(){
RespState = 0;
bootcount = 0;
sendstate = 1;
}
FuncInitBootState = function(){
bootstate = 0;
RespState = 0;
bootcount = 0;
sendstate = 0;
}
BCD_Conv = function(num){
if(num > 99){
return 0;
}
var ret = 0;
ret += math.floor(num/10) * 16;
ret += num%10;
return ret;
}
var sendblockstate = 0;
var alldata = {};
var blocknum = 1;
var alldata_blocknum = 0;
var block_sended = 0;
var sendFlashDriverState = 0;
2024-05-06 10:22:27 +08:00
var FuncSendBlockApp_sendflag = 0;
2024-05-09 11:11:34 +08:00
var nowid=0;
2024-03-30 15:05:00 +08:00
FuncSendBlockInit = function(id){
var len = 0;
alldata = FuncGetAllData(id);
blocknum = 1;
if(alldata == null){
FuncDisplay("错误:空数据");
alldata_blocknum = 0;
sendblockstate = 0xff;
return 1;
}
for(i=1;#alldata;1){
2024-05-09 11:11:34 +08:00
len += math.ceil(#alldata[i]["data"] / FuncGetSengLen())
2024-03-30 15:05:00 +08:00
}
alldata_blocknum = len;
block_sended = 0;
sendblockstate = 0;
2024-05-06 10:22:27 +08:00
FuncSendBlockApp_sendflag = 0;
2024-05-09 11:11:34 +08:00
nowid = id;
2024-05-06 10:22:27 +08:00
//console.log("发送数据初始化")
2024-03-30 15:05:00 +08:00
return 0;
}
nextstate = function(val){
if(val == 0){
bootstate += 1;
sendstate = 0;
block_sended += 1;
}
}
2024-05-06 10:22:27 +08:00
2024-03-30 15:05:00 +08:00
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;
block_sended += 1;
RespState = 0;
bootcount = 0;
}
else {
if(FuncWait(0x36) == 0){
FuncSendBlockApp_sendflag = 0;
if(FuncGetSendStatus() == true){//所有块发送完成
sendblockstate += 1;
2024-05-09 11:11:34 +08:00
if(nowid == 1){
sendblockstate += 1;
}
2024-03-30 15:05:00 +08:00
}
}
}
}
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;
}
FuncSendBlockFlashDriver = function(){
select(sendFlashDriverState) {
case 0 {
}
case 1 {
}
case 2 {
}
case 3 {
}
else {
}
}
}
var delaycount = 0;
//boot总流程
var boottime = 0;
FuncBootSeq = function(){
boottime++;
select(bootstate) {
case 0 {
boottime = 1;
if(sendstate == 0){
//FuncSendBlockInit(0);
2024-12-11 14:18:42 +08:00
g22data = {};
FuncReadDID(0xF187);
2024-03-30 15:05:00 +08:00
FuncClearState();
}
else {
var ret = FuncWait(0x22);
2024-12-11 14:18:42 +08:00
if(g22data["F187"]!= null){
if(g22data["F187"] == "RP-01"){
nextstate(0);
}
else {
FuncDisplay("型号错误");
FuncStopBoot();
thread.command.$SendEnd(false);
boottimer.disable();
}
}
2024-03-30 15:05:00 +08:00
}
}
case 1 {
if(sendstate == 0){
FuncReadDID(0xF195);//读取软件版本
FuncClearState();
}
else {
2024-05-13 08:14:17 +08:00
//var ret = FuncWait(0x22);
2024-03-30 15:05:00 +08:00
nextstate(0);
}
}
case 2 {
if(sendstate == 0){
FuncReadDID(0xF193);//读取硬件版本
FuncClearState();
}
else {
2024-12-11 14:18:42 +08:00
var ret = FuncWait(0x22);
if(g22data["F193"]!= null){
if(g22data["F193"] == "HW01"){
nextstate(0);
}
else {
FuncDisplay("硬件错误");
FuncStopBoot();
thread.command.$SendEnd(false);
boottimer.disable();
}
}
2024-03-30 15:05:00 +08:00
}
}
case 3 {
if(sendstate == 0){
FuncReq10(true,0x03);//进入扩展会话
FuncClearState();
}
else {
var ret = FuncWait(0x10);
nextstate(ret);
}
}
case 4 {
if(sendstate == 0){
FuncReq85(0x02);//关闭DTC
FuncClearState();
}
else {
var ret = FuncWait(0x85);
nextstate(ret);
}
}
case 5 {
if(sendstate == 0){
FuncReq28(0x01,0x01);//禁止发送
FuncClearState();
}
else {
var ret = FuncWait(0x28);
nextstate(0);
}
}
case 6 {
if(sendstate == 0){
FuncReq10(false,0x02);//进入编程会话
FuncClearState();
}
else {
var ret = FuncWait(0x10);
nextstate(ret);
}
}
case 7 {
2024-05-13 08:14:17 +08:00
if(sendstate == 0){//等待复位完成
delaycount = 0;
FuncClearState();
}
else {
delaycount += 1;
if(delaycount > 20){
nextstate(0);//延时1S
}
}
}
case 8 {
2024-03-30 15:05:00 +08:00
if(sendstate == 0){
2024-05-06 10:22:27 +08:00
FuncReq27(0x09);//解密
2024-03-30 15:05:00 +08:00
FuncClearState();
}
else {
var ret = FuncWait(0x27);
nextstate(ret);
}
}
2024-05-13 08:14:17 +08:00
case 9 {
2024-03-30 15:05:00 +08:00
if(sendstate == 0){
//FuncReq27(02);//发送key
FuncClearState();
FuncDisplay("等待解锁");
}
else {
//var ret = FuncWait(0x27);
var ret = FuncDiag27GetState();
nextstate(ret);
}
}
2024-05-13 08:14:17 +08:00
case 10 {
2024-03-30 15:05:00 +08:00
if(sendstate == 0){
2024-05-09 11:11:34 +08:00
FuncReq31EraseFlash(0x1FFFF000,0x1000);
2024-03-30 15:05:00 +08:00
FuncClearState();
}
else {
2024-05-09 11:11:34 +08:00
var ret = FuncWait(0x31);
nextstate(ret);
2024-03-30 15:05:00 +08:00
}
}
2024-05-13 08:14:17 +08:00
case 11 {
2024-03-30 15:05:00 +08:00
if(sendstate == 0){//写入installation_date
2024-05-09 11:11:34 +08:00
FuncReq3103(0xFD01);
2024-03-30 15:05:00 +08:00
FuncClearState();
}
else {
2024-05-09 11:11:34 +08:00
var ret = FuncWait(0x31);
nextstate(ret);
2024-03-30 15:05:00 +08:00
}
}
2024-05-13 08:14:17 +08:00
case 12 {
2024-03-30 15:05:00 +08:00
if(sendstate == 0){//发送数据
2024-05-06 10:22:27 +08:00
FuncSendBlockInit(1);
2024-03-30 15:05:00 +08:00
FuncDisplay("开始发送FlashDrv数据");
FuncClearState();
}
else {
var ret = FuncSendBlockApp();
nextstate(ret);
}
}
2024-05-13 08:14:17 +08:00
case 13 {
2024-03-30 15:05:00 +08:00
if(sendstate == 0){//CheckLogicBlock
2024-05-09 11:11:34 +08:00
//var crc = FuncGetFlashCRC(0);
//FuncReq31CheckLogicBlock(crc);
FuncReq3101FD02();
2024-03-30 15:05:00 +08:00
FuncClearState();
}
else {
var ret = FuncWait(0x31);
nextstate(ret);
}
}
2024-05-13 08:14:17 +08:00
case 14 {
if(sendstate == 0){//
2024-05-09 11:11:34 +08:00
FuncReq3103(0xFD02);
FuncClearState();
}
else {
var ret = FuncWait(0x31);
nextstate(ret);
}
}
2024-05-13 08:14:17 +08:00
case 15 {
2024-03-30 15:05:00 +08:00
if(sendstate == 0){//CheckLogicBlock
2024-05-09 11:11:34 +08:00
FuncReq31EraseFlash(0x00010000,0x70000);
2024-03-30 15:05:00 +08:00
FuncClearState();
}
else {
var ret = FuncWait(0x31);
nextstate(ret);
}
}
2024-05-13 08:14:17 +08:00
case 16 {
2024-03-30 15:05:00 +08:00
if(sendstate == 0){//发送数据
2024-05-06 10:22:27 +08:00
FuncSendBlockInit(2);
2024-03-30 15:05:00 +08:00
FuncDisplay("开始发送App数据");
FuncClearState();
}
else {
var ret = FuncSendBlockApp();
nextstate(ret);
}
}
2024-05-13 08:14:17 +08:00
case 17 {
2024-03-30 15:05:00 +08:00
if(sendstate == 0){//CheckLogicBlock
2024-05-09 11:11:34 +08:00
FuncReq3101FD03();
2024-03-30 15:05:00 +08:00
FuncClearState();
}
else {
var ret = FuncWait(0x31);
nextstate(ret);
}
}
2024-05-13 08:14:17 +08:00
case 18 {
2024-03-30 15:05:00 +08:00
if(sendstate == 0){////Programming Dependencies
2024-05-09 11:11:34 +08:00
FuncReq3103(0xFD03);
FuncClearState();
2024-03-30 15:05:00 +08:00
}
else {
var ret = FuncWait(0x31);
nextstate(ret);
}
}
2024-05-13 08:14:17 +08:00
case 19 {
2024-05-14 16:05:43 +08:00
if(sendstate == 0){//等待复位完成
delaycount = 0;
FuncClearState();
}
else {
delaycount += 1;
2024-12-11 14:18:42 +08:00
if(delaycount > 10){
nextstate(0);//延时0.1S
2024-05-14 16:05:43 +08:00
}
}
}
case 20 {
2024-03-30 15:05:00 +08:00
if(sendstate == 0){//复位
FuncClearState();
2024-12-11 14:18:42 +08:00
FuncReq11(0x01);
2024-03-30 15:05:00 +08:00
}
else {
var ret = FuncWait(0x11);
nextstate(ret);
}
}
2024-05-14 16:05:43 +08:00
case 21 {
2024-03-30 15:05:00 +08:00
if(sendstate == 0){//等待复位完成
delaycount = 0;
FuncClearState();
}
else {
delaycount += 1;
2024-12-11 14:18:42 +08:00
if(delaycount > 20){
2024-03-30 15:05:00 +08:00
nextstate(0);//延时1S
}
}
}
2024-05-14 16:05:43 +08:00
case 22 {
2024-03-30 15:05:00 +08:00
if(sendstate == 0){
FuncReq10(true,0x03);//进入扩展会话
FuncClearState();
}
else {
var ret = FuncWait(0x10);
nextstate(ret);
}
}
2024-05-14 16:05:43 +08:00
case 23 {
2024-03-30 15:05:00 +08:00
if(sendstate == 0){
FuncReq28(0x00,0x01);//开启发送
FuncClearState();
}
else {
var ret = FuncWait(0x28);
nextstate(ret);
}
}
2024-05-14 16:05:43 +08:00
case 24 {
2024-03-30 15:05:00 +08:00
if(sendstate == 0){
FuncReq85(0x01);//开启DTC
FuncClearState();
}
else {
var ret = FuncWait(0x85);
nextstate(ret);
}
}
2024-05-14 16:05:43 +08:00
case 25 {
2024-03-30 15:05:00 +08:00
if(sendstate == 0){
FuncReq10(true,0x01);//进入默认会话
FuncClearState();
}
else {
var ret = FuncWait(0x10);
nextstate(ret);
}
}
else {
thread.command.$SendEnd(true);
//FuncDisplay("刷写完成,用时 " + boottime/100 + " S")
boottimer.disable();
}
}
if(alldata_blocknum != 0){
thread.command.$SetProgress(block_sended/alldata_blocknum * 100);
}
}