一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

基于CAPL语言的网关BOOTLOADER刷写系统的制作方法

2022-03-09 04:59:35 来源:中国专利 TAG:

基于capl语言的网关bootloader刷写系统
1.技术领域:本发明属于车辆控制技术领域,特别涉及一种基于capl语言的网关bootloader刷写系统,及其重编程流程。
2.

背景技术:
bootloader是一段固化在车辆控制器中flash内存中的代码,可以通过启用bootloader中的应用程序刷新模块并调用相应的驱动程序来对控制器进行重编程,以达到应用程序更新的目的。
3.capl是一种用于can总线访问的编程语言,这种语言是基于事件进行建模,与c语言类似,是一种汽车电子行业常用的编程语言;本文就是基于capl语言,在vector公司canoe软件中用capl编写了bootloader重编程软件。
4.随着车辆网络架构的设计越来越复杂,车载网络的负载压力逐日剧增,网络安全也在车辆安全中占有绝对的地位;在不改变车载网络类型的情况下,可以通过网关控制器进行不同网段之间的路由,以实现降低车辆负载和保证车辆网络安全的目的。本文基于网关控制器作为应用软件刷写的载体,实现网关的软件版本迭代。进过检索并未发现有人申报类似的专利申请,,我们希望通过本技术填补该空白。
5.公开于该背景技术部分的信息仅仅旨在增加对本发明的总体背景的理解,而不应当被视为承认或以任何形式暗示该信息构成已为本领域一般技术人员所公知的现有技术。
6.

技术实现要素:
本发明的目的在于提供一种,从而克服上述现有技术中的缺陷。
7.为实现上述目的,本发明提供了一种基于capl语言的网关bootloader刷写系统,其特征在于:包括:工控机,用于在windows系统中运行vector canoe软件,并启用所开发的刷写脚本软件,通过脚本软件控制刷写;德国维克多总线开发软件vector cancase,用于运行德国维克多canoe软件,基于capl语言,在vector公司canoe软件中用capl编写了bootloader重编程软件;整车或网关控制器,至少含有诊断can通道,诊断can通道上运行bootloader;12v稳压电源,用于给整车或网关控制器供电。
8.优选地,上述技术方案中,bootloader刷写系统的软件架构主要包括:测试面板、解析刷写文件模块、主刷写模块、进度条模块、指令模块、结果显示模块;该系统的主要基于canoe软件开发环境开发,由capl脚本模块、panel模块组成;系统中的测试面板主要基于panel工具开发,通过按钮、输入框和进度条关联系统变量和环境变量以实现人机交互面板的编写,系统变量就是系统中设置的变量,环境变量是由用户自定义设置的变量;系统变量和环境变量可以通过vector canoe中的capl语言进行脚本编程,以实现各软件模块在can总线中的诊断命令交互逻辑,最终构建出整个系统的软件架构。
9.优选地,上述技术方案中,测试面板通过canoe中的panel工具编写,主要由:文字、文本框、下拉菜单、按钮和进度条组成;其中文字用来显示面板的标题或做一些标注;文本
框可以输入/输出一些文字信息,可以关联一些环境变量;下拉菜单可供用户选择下拉列表中的选项;按钮可以关联系统和环境变量以触发一些脚本效果,还可以设置文件路径按钮以加载并访问计算机中的文件;进度条可以通过编程实现对编程进度的监控。
10.优选地,上述技术方案中,解析刷写文件的模块通过文件路径按钮可以加载需要刷写的网关软件,而刷写文件分为驱动文件和应用文件,驱动文件是硬件厂商根据网关控制器的嵌入式操作系统所编写的配置文件,通过驱动文件可以让硬件设备正常运行,以达到既定的工作效果;应用文件是嵌入式软件更新的主体文件,通过该文件的刷写进行网关文件的更新。
11.优选地,上述技术方案中,解析刷写文件部分通过readfile函数实现了:判断文件是否符合解析类型;根据文件中每一行的标识符,将s19文件分块,等待刷写执行命令开始后按序刷写;在读取驱动和应用文件后,程序将自动校验文件类型是否符合,并同时通过crc32多项式校验来校核s19文件的完整性,文件类型或完整性不符都会自动报错;校核通过后会自动将s19文件根据其每行的前缀标识符进行分块,优选地,上述技术方案中,s19文件根据每行的前缀s0~s9分为8种类型:s0包括标识文件名,并不包含数据存储地址,以0000置位,此行表示文件的起始行,无需下载至控制器的微控制单元中;s1~s3分别记录着地址为2~4个字节的数据,图3中示例的s3为4个字节的数据记录;s5表示了s1~s3数据行的个数;s7~s9分别表示4~2个字节数据的结束行,此行也无需下载至控制单元中。
12.优选地,上述技术方案中,通过对数据文件的分行解析,将需要刷写的起始地址及数据通过can网络上的bootloader刷写诊断协议写入网关控制器。
13.基于capl语言的网关bootloader重编程流程,重编程时序分为三个编程步骤:预编程进行编程前的can网络准备、主编程下载应用软件或应用数据至控制器、后编程步骤进行can网络的重同步;预编程步骤通过对预编程条件的检查、设置控制器dtc为关闭和禁止应用报文的收发功能实现了重编程前的can网络准备,包括如下分步骤:a)为诊断会话控制,预编程步骤的命令都需要在此会话模式中完成;b)为编程条件检查的例程控制命令,通过此例程来检查控制器的编程条件以保证编程安全进行;c)为控制dtc设置功能,该功能可以设置控制器关闭dtc的生成;d)为通信控制;e)为编程之前的控制器信息读取步骤,此步骤会读取一些被编程控制器的软件标识符,以明确当前的控制器状态;在预编程步骤完成对控制器下载前的准备及状态检查之后,就可以进入主编程步骤;主编程步骤执行了控制器的编程事件,通过物理寻址的方式下载控制器应用软件数据,包括如下分步骤:a)诊断会话控制进入编程模式,以执行主编程操作;b)安全访问通过校验刷写诊断仪中和控制器预设的安全算法的一致性,保证主编程的安全;c)驱动下载操作当控制器的存储单元中不存在驱动软件时,下载那个驱动文件的传输,以满足应用软件需求;d)写入刷写工具的指纹信息以标识对控制器内存做修改的刷写工具名称及刷写日期等信息;e)擦除内存的例程控制命令用以擦除控制器内存中存储的应用软件数据;f)与驱动下载步骤类似,该步骤通过命令执行了应用数据的传输;g)通过检查编程完整性的例
程控制命令检查了编程后的控制器数据完整性;h)当所有数据传输完成时,要通过例程控制命令检查控制器重编程的依赖,这部分可由使用者自定义;i)最后,通过硬复位命令将控制器复位,以结束重编程过程,回归正常运行模式;后编程步骤包括如下分步骤:a)为会话模式控制,该命令将退出编程模式;b)为清除诊断信息的命令,命令执行了编程过程中的历史故障信息清除操作。
14.优选地,上述技术方案中,编程步骤中的安全算法交互方式为问答的方式,通过脚本语言控制系统向总线发送解锁请求,并根据总线回复的种子用算法计算得出秘钥,再反馈至控制器,以实现解锁功能;如在交互过程中出现7f负反馈,将会在窗口报错;过程用capl语言编程,驱动和数据传输、下载过程主要通过命令的配合实现数据的下载传输和结束,用capl语言描述,进度条模块主要指示刷写程序目前执行的进度,以告知使用该刷写面板的工程师是否刷写完成;进度条模块主要通过对数据刷写块的进度跟踪,设定了环境变量env_prog实现了进度条的变化填充;而在之前对刷写数据hex文件的解析函数中,已经通过getfileblocknum函数确定了hex文件中进度条断点的位置,最后根据断点的填充函数updateprocessbar完成了动态的进度条模块,capl语言编写包括如下:指令模块实现了控制器刷写的开始功能;面板中的start按钮关联了env_pb_start环境变量,这个环境变量调用了设定好的时序函数,点击按钮即可按照设定的编程序列开始执行程序刷写,同时该函数还读取了系统日期,在刷写过程中作为指纹写进控制器;capl最后的执行结果窗口显示了刷写反馈,可以显示刷写结果及过程中产生的错误信息;错误信息包括:解析和打开hex文件失败、控制器负反馈错误、通讯超时错误等预设种类的错误。
15.与现有技术相比,本发明具有如下有益效果:本系统的刷写功能稳定,操作界面简单易懂,不需要经过复杂的配置过程即可进行刷写,并可以拓展应用于其他整车控制器的刷写;该系统大大减少了在开发过程中需要迭代软件版本进行测试的时间,可以很轻松地更新控制器软件版本,节约了单控制器开发boot刷写的成本。
16.附图说明:图1 bootloader刷写系统;图2 网关bootloader测试面板;图3 .s19文件示例;图4 预编程步骤;图5 主编程步骤。
17.具体实施方式:下面对本发明的具体实施方式进行详细描述,但应当理解本发明的保护范围并不受具体实施方式的限制。
18.除非另有其它明确表示,否则在整个说明书和权利要求书中,术语“包括”或其变换如“包含”或“包括有”等等将被理解为包括所陈述的元件或组成部分,而并未排除其它元件或其它组成部分。
19.硬件设计方案:
本文中的bootloader刷写系统的硬件结构,由工控机、vector cancase、12v电源、整车或网关控制器组成,见图1:其中bootloader的运行环境可以是整车或单独的网关控制器,工控机需要在windows系统中运行vector canoe软件,并启用所开发的刷写脚本软件,通过脚本软件控制刷写;稳压电源负责整车或网关控制器的供电;网关控制器有四个通道的can通道,分别为:诊断can、adas can、底盘can和车身can,网关控制器可以实现这四个网段之间的报文路由,诊断can上只有网关控制器,而针对网关的bootloader刷写系统只运行在诊断can上,实现对网关控制器的重编程。
20.软件设计方案:刷写系统的软件架构主要包括:测试面板、解析刷写文件模块、主刷写模块、进度条模块、指令模块、结果显示模块;该系统的开发主要基于canoe软件开发环境开发,由capl脚本模块、panel模块组成;系统中的测试面板主要基于panel工具开发,通过按钮、输入框和进度条关联系统变量和环境变量以实现人机交互面板的编写,方便零基础的操作工使用,系统变量就是系统中设置的变量,环境变量是由用户自定义设置的变量;系统变量和环境变量可以通过vector canoe中的capl语言进行脚本编程,以实现bootloader系统里的各软件模块与总线之间的交互逻辑,并通过一些函数来实现例如安全验证算法的交互,以构建整个系统的软件架构。
21.首先来介绍测试面板,整个测试面板如图2,面板通过canoe中的panel工具编写,主要由:文字、文本框、下拉菜单、按钮和进度条组成;其中文字用来显示面板的标题或做一些标注;文本框可以输入/输出一些文字信息,可以关联一些环境变量;下拉菜单可供用户选择下拉列表中的选项;按钮可以关联系统和环境变量以触发一些脚本效果,还可以设置文件路径按钮以加载并访问计算机中的文件;进度条可以通过编程实现对编程进度的监控。
22.解析刷写文件的模块通过文件路径按钮可以加载需要刷写的网关软件,而刷写文件分为驱动文件和应用文件,文件类型都为.s19,s19包含了嵌入式系统里刷写包的全部内容,s19文件的示例见图3,驱动文件是硬件厂商根据网关控制器的嵌入式操作系统所编写的配置文件,通过驱动文件可以让硬件设备正常运行,以达到既定的工作效果;应用文件是嵌入式软件更新的主体文件,通过该文件的刷写进行网关文件的更新。解析刷写文件可以通过如下脚本实现:byte readfile(dword filehandle,byte filetype){
ꢀꢀꢀ
int i;
ꢀꢀ
int j;
ꢀꢀꢀ
int k;
ꢀꢀ
int n;
ꢀꢀ
dword p = 0;
ꢀꢀ
dword q = 0;
ꢀꢀ
char tmpstr[5]="0x";
ꢀꢀꢀ
if(filehandle!=0)
ꢀꢀ
{
ꢀꢀꢀꢀ
if(drvtype == filetype)
ꢀꢀꢀꢀ
{
ꢀꢀꢀꢀꢀꢀ
drvlinenum=0;
ꢀꢀꢀꢀꢀꢀ
while ( filegetstring(file_drv_line,elcount(file_drv_line),filehandle)!=0 )
ꢀꢀꢀꢀꢀꢀ
{
ꢀꢀꢀꢀꢀꢀꢀꢀ
i=0;
ꢀꢀꢀꢀꢀꢀꢀꢀ
j=0;
ꢀꢀꢀꢀꢀꢀꢀꢀ
if(((file_drv_line[0]=='s') && (file_drv_line[1]=='3'))||((file_drv_line[0]=='s') && (file_drv_line[1]=='2')))
ꢀꢀꢀꢀꢀꢀꢀꢀ
{
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
for(i=2;i《strlen(file_drv_line)-2;i )
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
{
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
tmpstr[2]=file_drv_line[i];
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
tmpstr[3]=file_drv_line[i 1];
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
tmpstr[4]='\0';
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
i ;
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
file_drv[drvlinenum][j]=atol(tmpstr);
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
j ;
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
}
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
for(n = 0;n 《 (file_drv[drvlinenum][0]
ꢀ‑ꢀ
5);n )
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
{
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
file_drv_crcdata[p] = file_drv[drvlinenum][n 5];
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
p ;
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
}
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
drvlinenum ;
ꢀꢀꢀꢀꢀꢀꢀꢀ
}
ꢀꢀꢀꢀꢀꢀ
}
ꢀꢀꢀꢀ
}
ꢀꢀꢀꢀ
else if(datatype == filetype)
ꢀꢀꢀꢀ
{
ꢀꢀꢀꢀꢀꢀ
datalinenum = 0;
ꢀꢀꢀꢀꢀꢀ
while ( filegetstring(file_data_line,elcount(file_data_line),filehandle)!=0 )
ꢀꢀꢀꢀꢀꢀ
{
ꢀꢀꢀꢀꢀꢀꢀꢀ
i=0;
ꢀꢀꢀꢀꢀꢀꢀꢀ
j=0;
ꢀꢀꢀꢀꢀꢀꢀꢀ
if(((file_data_line[0]=='s') && (file_data_line[1]=='3'))||
((file_data_line[0]=='s') && (file_data_line[1]=='2')))
ꢀꢀꢀꢀꢀꢀꢀꢀ
{
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
for(i=2;i《strlen(file_data_line)-2;i )
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
{
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
tmpstr[2]=file_data_line[i];
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
tmpstr[3]=file_data_line[i 1];
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
tmpstr[4]='\0';
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
i ;
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
file_data[datalinenum][j]=atol(tmpstr);
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
j ;
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
}
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
for(n = 0;n 《 (file_data[datalinenum][0]
ꢀ‑ꢀ
5);n )
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
{
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
file_data_crcdata[q] = file_data[datalinenum][n 5];
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
q ;
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
}
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
datalinenum ;
ꢀꢀꢀꢀꢀꢀꢀꢀ
}
ꢀꢀꢀꢀꢀꢀ
}
ꢀꢀꢀꢀ
}
ꢀꢀꢀꢀ
else
ꢀꢀꢀꢀ
{
ꢀꢀꢀꢀꢀꢀ
write("failure: wrong file type");
ꢀꢀꢀꢀꢀꢀ
stop();
ꢀꢀꢀꢀꢀꢀꢀꢀ
return 0;
ꢀꢀꢀꢀ
}
ꢀꢀꢀꢀ
for(i = 0;i《elcount(file_data[0]);i )
ꢀꢀꢀꢀ
{
ꢀꢀꢀꢀꢀꢀ
fileclose (filehandle);
ꢀꢀꢀꢀ
if(drvtype == filetype)
ꢀꢀꢀꢀ
{
ꢀꢀꢀꢀꢀꢀꢀꢀ
drvcrc = crccalc(filetype,drvblocklen);
ꢀꢀꢀꢀ
}
ꢀꢀꢀꢀ
else if(datatype == filetype)
ꢀꢀꢀꢀ
{
ꢀꢀꢀꢀꢀꢀꢀꢀ
datacrc = crccalc(filetype,datablocklen);
ꢀꢀꢀꢀ
}
ꢀꢀꢀꢀ
else
ꢀꢀꢀꢀ
{
ꢀꢀꢀꢀꢀꢀ
write("failure: wrong file type");
ꢀꢀꢀꢀꢀꢀ
stop();
ꢀꢀꢀꢀ
}
ꢀꢀꢀꢀꢀꢀ
return 1;
ꢀꢀ
}
ꢀꢀ
else
ꢀꢀ
{
ꢀꢀꢀꢀꢀꢀ
write("failure: the s19 file is error");
ꢀꢀꢀꢀ
stop();
ꢀꢀꢀꢀꢀ
return 0;
ꢀꢀ
}}该部分通过readfile函数实现了:1.判断文件是否符合解析类型;2.根据文件中每一行的标识符,将s19文件分块,等待刷写执行命令开始后按序刷写。在读取驱动和应用文件后,程序将自动校验文件类型是否符合,并同时通过crc32多项式校验来校核s19文件的完整性,文件类型或完整性不符都会自动报错;校核通过后会自动将s19文件根据其每行的前缀标识符进行分块,如图3所示的s19文件根据每行的前缀s0~s9分为8种类型:s0包括标识文件名,并不包含数据存储地址,以0000置位,此行表示文件的起始行,无需下载至控制器的微控制单元中;s1~s3分别记录着地址为2~4个字节的数据,图3中示例的s3为4个字节的数据记录;s5表示了s1~s3数据行的个数;s7~s9分别表示4~2个字节数据的结束行,此行也无需下载至控制单元中。
[0023]
通过对数据文件的分行解析,将需要刷写的起始地址及数据通过can网络上的bootloader刷写诊断协议写入网关控制器。
[0024]
bootloader定义了一个或多个应用软件或应用数据下载到控制器内存中的重编程流程。重编程时序分为三个编程步骤:预编程进行编程前的can网络准备、主编程下载应用软件或应用数据至控制器、后编程步骤进行can网络的重同步。
[0025]
预编程步骤通过对预编程条件的检查、设置控制器dtc为关闭和禁止应用报文的收发功能实现了重编程前的can网络准备。图4是预编程步骤的流程图,a)为诊断会话控制(命令10h 03h),预编程步骤的命令都需要在此会话模式中完成;b)为编程条件检查的例程控制命令(命令31h 01h 02h 03h),通过此例程来检查控制器的编程条件以保证编程安全进行;c)为控制dtc设置功能(命令85h 02h),该功能可以设置控制器关闭dtc的生成;d)为通信控制(命令28h 03h 03h)e)为编程之前的控制器信息读取步骤(命令为22h xx),此步骤会读取一些被编程控制器的软件标识符,以明确当前的控制器状态。在预编程步骤完成对控制器下载前的准备及状态检查之后,就可以进入主编程步骤。
[0026]
主编程步骤执行了控制器的编程事件,通过物理寻址的方式下载控制器应用软件数据,如图5所示。a)诊断会话控制(命令10h 02h )进入编程模式,以执行主编程操作;b)安
全访问(27h)通过校验刷写诊断仪中和控制器预设的安全算法的一致性,保证主编程的安全;c)驱动下载操作(34h、36h、37h、31h)当控制器的存储单元中不存在驱动软件时,那个驱动文件的传输,以满足应用软件需求,其中34h操作请求下载数据,36h进行数据传输且是单数据块传输结束的标志,37h请求数据传输退出以结束整个传输过程;d)写入刷写工具的指纹信息(2eh f1h 5ah)以标识对控制器内存做修改的刷写工具名称及刷写日期等信息;e)擦除内存的例程控制命令(31h 01h ffh 00h)用以擦除控制器内存中存储的应用软件数据;f)与驱动下载步骤类似,该步骤通过34h、36h、37h和31h命令执行了应用数据的传输;g)通过检查编程完整性的例程控制命令(31h 01h 02h 02h)检查了编程后的控制器数据完整性;h)当所有数据传输完成时,要通过例程控制命令(31h 01h ffh 01h)检查控制器重编程的依赖,这部分可由供应商自定义;i)最后,通过硬复位命令(11h 01h)将控制器复位,以结束重编程过程,回归正常运行模式。
[0027]
后编程步骤,a)为会话模式控制(10h 01h),该命令将退出编程模式;b)为清除诊断信息的命令(14h ffh ffh ffh),命令执行了编程过程中的历史故障信息清除操作。
[0028]
编程步骤中的安全算法交互方式为问答的方式,通过脚本语言控制系统向总线发送解锁请求,并根据总线回复的种子用算法计算得出秘钥,再反馈至控制器,以实现解锁功能;如在交互过程中出现7f负反馈,将会在窗口报错;过程用capl语言编程如下:service_securityaccess (byte sub){
ꢀꢀꢀꢀ
gtxdatabuffer[0] = 0x27;
ꢀꢀꢀꢀ
if(sub == 0x05||sub == 0x01||sub == 0x09||sub == 0x03||sub == 0x11)
ꢀꢀꢀꢀ
{
ꢀꢀꢀꢀꢀꢀꢀꢀ
gtxdatabuffer[1] = sub;
ꢀꢀꢀꢀꢀꢀꢀꢀ
osektl_datareq(gtxdatabuffer, 2);
ꢀꢀꢀꢀ
}
ꢀꢀꢀꢀ
else if(sub ==0x06||sub ==0x02||sub ==0x0a||sub == 0x04||sub == 0x12)
ꢀꢀꢀꢀ
{
ꢀꢀꢀꢀꢀꢀꢀꢀ
gtxdatabuffer[1] = sub;
ꢀꢀꢀꢀꢀꢀꢀꢀ
gtxdatabuffer[2] = key_byte[0];
ꢀꢀꢀꢀꢀꢀꢀꢀ
gtxdatabuffer[3] = key_byte[1];
ꢀꢀꢀꢀꢀꢀꢀꢀ
gtxdatabuffer[4] = key_byte[2];
ꢀꢀꢀꢀꢀꢀꢀꢀ
gtxdatabuffer[5] = key_byte[3];
ꢀꢀꢀꢀꢀꢀꢀꢀ
osektl_datareq(gtxdatabuffer, 6);
ꢀꢀꢀꢀ
}
ꢀꢀꢀꢀ
else
ꢀꢀꢀꢀ
{
ꢀꢀꢀꢀ
}}
byte service_securityaccess_resp (byte
ꢀꢀ
sub){
ꢀꢀꢀꢀ
byte rtn;
ꢀꢀꢀꢀ
if((grxdatabuffer[0] == 0x67) && (grxdatabuffer[1] == sub))
ꢀꢀꢀꢀ
{
ꢀꢀꢀꢀꢀꢀꢀꢀ
seedtokey();
ꢀꢀꢀꢀꢀꢀꢀꢀ
rtn = resp_ok;
ꢀꢀꢀꢀ
}
ꢀꢀꢀꢀ
else
ꢀꢀꢀꢀ
{
ꢀꢀꢀꢀꢀꢀꢀꢀ
rtn = resp_ng;
ꢀꢀꢀꢀ
}
ꢀꢀꢀꢀ
return rtn;}驱动和数据传输、下载过程主要通过34h、36h、37h命令的配合实现数据的下载传输和结束,用capl语言描述如下:service_requestdownload(byte sub, dword addr, dword lth){
ꢀꢀꢀꢀ
gtxdatabuffer[0] = 0x34;
ꢀꢀꢀꢀ
gtxdatabuffer[1] = sub;
ꢀꢀꢀꢀ
gtxdatabuffer[2] = 0x44;
ꢀꢀꢀꢀ
gtxdatabuffer[3] = (byte)(addr 》》 24);
ꢀꢀꢀꢀ
gtxdatabuffer[4] = (byte)(addr 》》 16);
ꢀꢀꢀꢀ
gtxdatabuffer[5] = (byte)(addr 》》 8);
ꢀꢀꢀꢀ
gtxdatabuffer[6] = (byte)(addr);
ꢀꢀꢀꢀ
gtxdatabuffer[7] = (byte)(lth 》》 24);
ꢀꢀꢀꢀ
gtxdatabuffer[8] = (byte)(lth 》》 16);
ꢀꢀꢀꢀ
gtxdatabuffer[9] = (byte)(lth 》》 8);
ꢀꢀꢀꢀ
gtxdatabuffer[10] = (byte)(lth);
ꢀꢀꢀꢀ
osektl_datareq(gtxdatabuffer, 11);
ꢀꢀ
write("request dawnload : addr = 0x%x;lth = 0x%x",addr,lth);}byte service_requestdownload_resp (byte
ꢀꢀ
sub){
ꢀꢀꢀꢀ
byte rtn;
ꢀꢀꢀꢀ
if((grxdatabuffer[0] == 0x74) /*&& (grxdatabuffer[1] == sub)*/)
ꢀꢀꢀꢀ
{
ꢀꢀꢀꢀꢀꢀꢀꢀ
rtn = resp_ok;
ꢀꢀꢀꢀ
}
ꢀꢀꢀꢀ
else
ꢀꢀꢀꢀ
{
ꢀꢀꢀꢀꢀꢀꢀꢀ
rtn = resp_ng;
ꢀꢀꢀꢀ
}
ꢀꢀꢀꢀ
return rtn;}service_transferdata(byte cnt,dword len){
ꢀꢀꢀꢀ
word i;
ꢀꢀꢀꢀ
gtxdatabuffer[0] = 0x36;
ꢀꢀꢀꢀ
gtxdatabuffer[1] = cnt;
ꢀꢀꢀꢀ
for(i = 0; i 《 len; i )
ꢀꢀꢀꢀ
{
ꢀꢀꢀꢀꢀꢀꢀꢀ
gtxdatabuffer[2 i] = mass_data[i];
ꢀꢀꢀꢀ
}
ꢀꢀꢀꢀ
osektl_datareq(gtxdatabuffer, (len 2));}byte service_transferdata_resp (byte cnt){
ꢀꢀꢀꢀ
byte rtn;
ꢀꢀꢀꢀ
if((grxdatabuffer[0] == 0x76) && (grxdatabuffer[1] == cnt))
ꢀꢀꢀꢀ
{
ꢀꢀꢀꢀꢀꢀꢀꢀ
rtn = resp_ok;
ꢀꢀꢀꢀ
}
ꢀꢀꢀꢀ
else if ((grxdatabuffer[0] == 0x7f) && (grxdatabuffer[1] == 0x36) && (grxdatabuffer[2] == 0x78))
ꢀꢀꢀꢀ
{
ꢀꢀꢀꢀꢀꢀꢀꢀ
rtn = resp_wait;
ꢀꢀꢀꢀ
}
ꢀꢀꢀꢀ
else
ꢀꢀꢀꢀ
{
ꢀꢀꢀꢀꢀꢀꢀꢀ
rtn = resp_ng;
ꢀꢀꢀꢀ
}
ꢀꢀꢀꢀ
return rtn;}service_requesttransferexit(){
ꢀꢀꢀꢀ
gtxdatabuffer[0] = 0x37;
ꢀꢀꢀꢀ
osektl_datareq(gtxdatabuffer, 1);
}byte service_requesttransferexit_resp (){
ꢀꢀꢀꢀ
byte rtn;
ꢀꢀꢀꢀ
if(grxdatabuffer[0] == 0x77)
ꢀꢀꢀꢀ
{
ꢀꢀꢀꢀꢀꢀꢀꢀ
rtn = resp_ok;
ꢀꢀꢀꢀ
}
ꢀꢀꢀꢀ
else
ꢀꢀꢀꢀ
{
ꢀꢀꢀꢀꢀꢀꢀꢀ
rtn = resp_ng;
ꢀꢀꢀꢀ
}
ꢀꢀꢀꢀ
return rtn;}进度条模块主要指示刷写程序目前执行的进度,以告知使用该刷写面板的工程师是否刷写完成;进度条模块主要通过对数据刷写块的进度跟踪,设定了环境变量env_prog实现了进度条的变化填充;而在之前对刷写数据hex文件的解析函数中,已经通过getfileblocknum函数确定了hex文件中进度条断点的位置,最后根据断点的填充函数updateprocessbar完成了动态的进度条模块,capl语言编写代码如下:void getfileblocknum(byte filetype){
ꢀꢀ
dword i = 0;
ꢀꢀ
dword j = 0;
ꢀꢀ
dword lineaddr[maxlinenum];
ꢀꢀ
dword linelen[maxlinenum];
ꢀꢀ
if(drvtype == filetype)
ꢀꢀ
{
ꢀꢀꢀꢀ
drvsegnumbers = 0;
ꢀꢀꢀꢀ
drvblocklen = 0;
ꢀꢀꢀꢀ
/*init variables*/
ꢀꢀꢀꢀ
lineaddr[0] = ((dword)(file_drv[0][1]) 《《 24) | ((dword)(file_drv[0][2] 《《 16) | ((dword)(file_drv[0][3]) 《《 8) | (dword)(file_drv[0][4]));
ꢀꢀꢀꢀ
linelen[0] =((dword)(file_drv[0][0])-5);/*substract 4byte addr and 1 byte crc*/
ꢀꢀꢀꢀ
drvsegnumbers = drvsegnumbers 1;
ꢀꢀꢀꢀ
drvblocklen = linelen[0];
ꢀꢀꢀꢀ
for(i = 1; i 《 drvlinenum; i )
ꢀꢀꢀꢀ
{
ꢀꢀꢀꢀꢀꢀ
lineaddr[i] = ((dword)(file_drv[i][1]) 《《 24) | ((dword)(file_
drv[i][2] 《《 16) | ((dword)(file_drv[i][3]) 《《 8) | (dword)(file_drv[i][4]));
ꢀꢀꢀꢀꢀꢀ
linelen[i] =((dword)(file_drv[i][0])-5);/*substract 4byte addr and 1 byte crc*/
ꢀꢀꢀꢀꢀꢀ
if(lineaddr[i] == (lineaddr[i-1] linelen[i-1]))
ꢀꢀꢀꢀꢀꢀ
{
ꢀꢀꢀꢀꢀꢀꢀꢀ
drvblocklen = drvblocklen linelen[i];
ꢀꢀꢀꢀꢀꢀ
}
ꢀꢀꢀꢀꢀꢀ
else
ꢀꢀꢀꢀꢀꢀ
{
ꢀꢀꢀꢀꢀꢀꢀꢀꢀ
drvsegnumbers = drvsegnumbers 1;/*how many block need to transfered = send how many message_34*/
ꢀꢀꢀꢀꢀꢀꢀꢀꢀ
drvblocklen = drvblocklen linelen[i];
ꢀꢀꢀꢀꢀꢀ
}
ꢀꢀꢀꢀ
}
ꢀꢀꢀꢀ
write("blocklen=%ld",drvblocklen);
ꢀꢀꢀꢀ
write("segnumbers=%ld",drvsegnumbers);
ꢀꢀ
}
ꢀꢀ
else if(datatype == filetype)
ꢀꢀ
{
ꢀꢀꢀꢀ
datasegnumbers = 0;
ꢀꢀꢀꢀ
datablocklen = 0;
ꢀꢀꢀꢀ
/*init variables*/
ꢀꢀꢀꢀ
lineaddr[0] = ((dword)(file_data[0][1]) 《《 24) | ((dword)(file_data[0][2] 《《 16) | ((dword)(file_data[0][3]) 《《 8) | (dword)(file_data[0][4]));
ꢀꢀꢀꢀ
linelen[0] =((dword)(file_data[0][0])-5);/*substract 4byte addr and 1 byte crc*/
ꢀꢀꢀꢀ
datasegnumbers = datasegnumbers 1;
ꢀꢀꢀꢀ
datablocklen = linelen[0];
ꢀꢀꢀꢀ
for(i = 1; i 《 datalinenum; i )
ꢀꢀꢀꢀ
{
ꢀꢀꢀꢀꢀꢀ
lineaddr[i] = ((dword)(file_data[i][1]) 《《 24) | ((dword)(file_data[i][2] 《《 16) | ((dword)(file_data[i][3]) 《《 8) | (dword)(file_data[i][4]));
ꢀꢀꢀꢀꢀꢀ
linelen[i] =((dword)(file_data[i][0])-5);/*substract 4byte addr and 1 byte crc*/
ꢀꢀꢀꢀꢀꢀ
if(lineaddr[i] == (lineaddr[i-1] linelen[i-1]))
ꢀꢀꢀꢀꢀꢀ
{
ꢀꢀꢀꢀꢀꢀꢀꢀ
datablocklen = datablocklen linelen[i];
(datablocklen drvblocklen) );
ꢀꢀꢀꢀꢀꢀꢀꢀ
break;
ꢀꢀꢀꢀꢀꢀ
case 4:
ꢀꢀꢀꢀꢀꢀꢀꢀ
putvalue(env_prog5, global_processbar[index] * 100 / (datablocklen drvblocklen) );
ꢀꢀꢀꢀꢀꢀꢀꢀ
break;
ꢀꢀꢀꢀꢀꢀ
case 5:
ꢀꢀꢀꢀꢀꢀꢀꢀ
putvalue(env_prog6, global_processbar[index] * 100 / (datablocklen drvblocklen) );
ꢀꢀꢀꢀꢀꢀꢀꢀ
break;
ꢀꢀꢀꢀꢀꢀ
default:
ꢀꢀꢀꢀꢀꢀꢀꢀ
break;
ꢀꢀ
}}指令模块实现了控制器刷写的开始功能。面板中的start按钮关联了env_pb_start环境变量,这个环境变量调用了设定好的时序函数,点击按钮即可按照设定的编程序列开始执行程序刷写,同时该函数还读取了系统日期,在刷写过程中作为指纹写进控制器。capl代码如下:on envvar env_pb_start{
ꢀꢀꢀꢀ
if(getvalue(env_pb_start) == 1)
ꢀꢀꢀꢀ
{
ꢀꢀꢀꢀꢀꢀꢀꢀ
putvalue(env_errorinfo, "");
ꢀꢀꢀꢀꢀꢀꢀꢀ
putvalue(env_errorinfo1, "");
ꢀꢀꢀꢀꢀꢀꢀꢀ
putvalue(env_errorinfo2, "");
ꢀꢀꢀꢀꢀꢀꢀꢀ
putvalue(env_prog1, 0);
ꢀꢀꢀꢀꢀꢀꢀꢀ
putvalue(env_st_sw, 15);
ꢀꢀꢀꢀꢀꢀꢀꢀ
putvalue(env_st_prgdate, 15);
ꢀꢀꢀꢀꢀꢀꢀꢀ
putvalue(env_st_sn, 15);
ꢀꢀꢀꢀꢀꢀꢀꢀ
if(statemachine == state_prestart)
ꢀꢀꢀꢀꢀꢀꢀꢀ
{
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
statemachine = state_started;
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
canceltimer(scheduler);
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
getconfig();
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
osektl_config();
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
inputfilecheck();
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
settimer(scheduler, timescale);
ꢀꢀꢀꢀꢀꢀꢀꢀ
}
ꢀꢀꢀꢀ
}
}最后的执行结果窗口显示了刷写反馈,可以显示刷写结果及过程中产生的错误信息;错误信息包括:解析和打开hex文件失败、控制器负反馈错误、通讯超时错误等。
[0029]
结论:本文概述了基于capl语言的网关bootloader刷写系统的硬件及软件开发系统构成,该系统应用于网关控制器的刷写中,使零基础的工程师可以便利地使用该系统进行刷写,并可以根据反馈结果发现刷写过程中出现的问题。
[0030]
本系统的刷写功能稳定,操作界面简单易懂,不需要经过复杂的配置过程即可进行刷写,并可以拓展应用于其他整车控制器的刷写;该系统大大减少了在开发过程中需要迭代软件版本进行测试的时间,可以很轻松地更新控制器软件版本,节约了单控制器开发boot刷写的成本。
[0031]
前述对本发明的具体示例性实施方案的描述是为了说明和例证的目的。这些描述并非想将本发明限定为所公开的精确形式,并且很显然,根据上述教导,可以进行很多改变和变化。对示例性实施例进行选择和描述的目的在于解释本发明的特定原理及其实际应用,从而使得本领域的技术人员能够实现并利用本发明的各种不同的示例性实施方案以及各种不同的选择和改变。本发明的范围意在由权利要求书及其等同形式所限定。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献