1. S19文件格式详解
S-record格式文件是Freescale CodeWarrior编译器生成的后缀名为.S19的程序文件,是一段直接烧写进MCU的ASCII码,英文全称问Motorola format for EEPROM programming。
【注意:编者】:
上面“是一段直接烧写进MCU的ASCII码”,这样说可能会误导初学者,因为并不是直接将ASCII码写进MCU,写进MCU前还要对S19文件进行一个解析,把有用的机器代码分解出来,然后再进行写入,写入的也不是ASCII而是二进制码。
网上有关S-record格式文件的资料很少,经过我的收集和实验,整理出以下文档,方便大家对Freescale单片机做深入了解。
1、格式定义及含义
S-record每行最大是78个字节,156个字符
S-record format
type count address data checksum
type(类型):2个字符。用来描述记录的类型 (S0,S1,S2,S3,S5,S7,S8,S9)。
count(计数):2个字符。 用来组成和说明了一个16进制的值,显示了在记录中剩余成对字符的计数。
address(地址):4或6或8个字节。用来组成和说明了一个16进制的值,显示了数据应该装载的地址, 这部分的长度取决于载入地址的字节数。2个字节的地址占用4个字符,3个字节的地址占用6个字符,4个字节的地址占用8个字符。
data(数据):0—64字符。用来组成和说明一个代表了内存载入数据或者描述信息的16进制的值。
checksum(校验和):2个字符。这些字符当被配对并换算成16进制数据的时候形成了一个最低有效字符节,该字符节用来表达作为补充数据,地址和数据库的字符对所代表的(字节的)补码的byte总和。即计数值、地址场和数据场的若干字符以两个字符为一对,将它们相加求和,和的溢出部分不计,只保留最低两位字符NN,checksum =0xFF-0xNN。
S0 Record:记录类型是“S0” (0x5330)。地址场没有被用,用零置位(0x0000)。数据场中的信息被划分为以下四个子域:
name(名称):20个字符,用来编码单元名称
ver(版本):2个字符,用来编码版本号
rev(修订版本):2个字符,用来编码修订版本号
description(描述):0-36个字符,用来编码文本注释
此行表示程序的开始,不需烧入memory。
S1 Record:记录类型是“S1” (0x5331)。地址场由2个字节地址来说明。数据场由可载入的数据组成。
S2 Record:记录类型是“S2” (0x5332)。地址场由3个字节地址来说明。数据场由可载入的数据组成。
S3 Record:记录类型是“S3” (0x5333)。地址场由4个字节地址来说明。数据场由可载入的数据组成。
S5 Record:记录类型是“S5” (0x5335)。地址场由2字节的值说明,包含了先前传输的S1、S2、S3记录的计数。没有数据场。
S7 Record:记录类型是“S7” (0x5337)。地址场由4字节的地址说明,包含了开始执行地址。没有数据场。此行表示程序的结束,不需烧入memory。
S8 Record:记录类型是“S8” (0x5338)。地址场由3字节的地址说明,包含了开始执行地址。没有数据场。此行表示程序的结束,不需烧入memory。
S9 Record:记录类型是“S9” (0x5339)。地址场由2字节的地址说明,包含了开始执行地址。没有数据场。此行表示程序的结束,不需烧入memory。
根据不同的描述信息,在以上三种不同的结束行中选择一种使用
2、EXAMPLE
2.1 example I
S19文件首行: S0 21 0000 36384B50524F47202020313143524541544544204259204541535936384B 6D
首行翻译信息: S0 0000 6 8 K P R O G 1 1 C R E A T E D B Y E A S Y 6 8 K
色块图例:module name version number revision number checksum
checksum的算法:
0x21+0x00+0x00+0x36+0x38+0x4B+0x50+0x52+0x4F+0x47+0x20+0x20+0x20+0x31+0x31+0x43+0x52+0x45+0x41+0x54+0x45+0x44
+0x20+0x42+0x59+0x20+0x45+0x41+0x53+0x59+0x36+0x38+0x4B=0x792
checksum=0xFF-0x92=6D
注意:EASy68K总是用S8 record作为结束行。
2.2 example II
S1 23 C000 CF1400790011CC09395B105A124A8046304A8000300001C01BCB73140007340027
色块图例:type count address data checksum
2.3 example III
S2 24 308000 C61E877C1516C6197B151ACE04C07E15187A153EC74A90F9301D026A01C6017B F0
色块图例:type count address data checksum
3、另附Freescale HCS12DP256B 16位单片机空程序S19文件:
S0520000453A5C576F6F64795C4C6561726E696E675C50726F6772616D6D655C42444DD2FDB5BCB3CCD0F25C44556D795C447032 35365C62696E5C48435331325F53657269616C5F4D6F6E69746F722E6162735A
S123C000CF1100790011CC09395B105A124A8004304A8000300000C01BC01F00000000001B
S104C020001B
S105FFFEC0003D
S22430800010EF20FEFEC017FDC015270E35ED31EC3169700434FB310326F2FEC019EC31274F
S2113080200BED31180A30700434F920F10AE7
S804000000FB
2. 参考代码
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define MAX_EXTENSION_SIZE 16
#define MAX_LINE_SIZE 1024
#define MAX_FILE_NAME_SIZE 260
typedef char filetype[MAX_FILE_NAME_SIZE];
filetype Filename;
FILE *fin,*fout;
int filemode;
unsigned char Ascii2Int(unsigned char tmp0, unsigned char tmp1)
{
unsigned char s[2];
unsigned char value;
s[0] = 0;
s[1] = 0;
if (tmp0 >= '0' && tmp0 <= '9')
s[0] = tmp0 - '0';
else if (tmp0 >= 'a' && tmp0 <='f')
s[0] = tmp0 - 'a' + 0xA;
else if (tmp0 >= 'A' && tmp0 <= 'F')
s[0] = tmp0 - 0x61 + 0XA;
if (tmp1 >= '0' && tmp1 <= '9')
s[1] = tmp1 - '0';
else if (tmp1 >= 'a' && tmp1 <= 'f')
s[1] = tmp1 - 'a' + 0xA;
else if (tmp1 >= 'A' && tmp1 <= 'F')
s[1] = tmp1 - 'A' + 0xA;
value = s[0]<<4;
value = value + s[1];
return value;
}
void PutExtension(char *Flnm, char *Extension)
{
char *Period; /* location of period in file name */
char Samename = -1;
/* This assumes DOS like file names */
/* Don't use strchr(): consider the following filename:
../my.dir/file.hex
*/
if ((Period = strrchr(Flnm,'.')) != NULL)
*(Period) = '\0';
if (strcmp(Extension, Period + 1) == 0)
Samename = 0;
strcat(Flnm,".");
strcat(Flnm, Extension);
if (0 == Samename) {
printf ("Input and output filenames (%s) are the same.", Flnm);
}
}
int main(int argc, char *argv[])
{
unsigned char tmp[2];
char buf[20];
unsigned char value = 0;
unsigned char chksum = 0;
unsigned char num = 0;
unsigned char func = 0xff;
int addr = 0;
int size = 0;
/* line inputted from file */
char Line[MAX_LINE_SIZE];
char Extension[MAX_EXTENSION_SIZE];
strcpy(Extension, "bin");
/*读取文件名*/
strncpy(Filename, argv[argc -1], sizeof(Filename));
/*打开或创建两个文件*/
fin = fopen(Filename, "r");
PutExtension(Filename, Extension);
fout = fopen(Filename,"wb");
while(!feof(fin))
{
/*读取一行数据,以's'开始*/
while (1) {
fread(tmp, sizeof(char), 1, fin);
/*寻找行首*/
if (tmp[0]=='S'||tmp[0]=='s')
break;
if (feof(fin)) {
fclose(fin);
fclose(fout);
printf("file convert ok!\n");
return;
}
}
chksum = 0;
addr = 0;
/*读取's'后面的字符: type*/
fread(tmp, sizeof(char), 1, fin);
func = tmp[0];
/*获取数据数量,两个字符: count*/
fread(tmp, sizeof(char), 2, fin);
num = Ascii2Int(tmp[0], tmp[1]);
chksum += num;
/*类型type, 处理每一行的地址address数据*/
switch (func) {
case '0':
fread(tmp, sizeof(char), 2, fin);
value = Ascii2Int(tmp[0], tmp[1]);
chksum += value;
addr += value;
addr = addr<<8;
fread(tmp, sizeof(char), 2, fin);
value = Ascii2Int(tmp[0], tmp[1]);
chksum += value;
addr += value;
num -= 2;
break;
case '1':
fread(tmp, sizeof(char), 2, fin);
value = Ascii2Int(tmp[0], tmp[1]);
chksum += value;
addr += value;
addr=addr<<8;
fread(tmp, sizeof(char), 2, fin);
value = Ascii2Int(tmp[0], tmp[1]);
chksum += value;
addr += value;
num -= 2;
break;
case '2':
fread(tmp, sizeof(char), 2, fin);
value = Ascii2Int(tmp[0], tmp[1]);
chksum += value;
addr += value;
addr = addr<<8;
fread(tmp, sizeof(char), 2, fin);
value = Ascii2Int(tmp[0], tmp[1]);
chksum += value;
addr += value;
addr = addr<<8;
fread(tmp,sizeof(char), 2, fin);
value = Ascii2Int(tmp[0], tmp[1]);
chksum += value;
addr += value;
num -= 3;
break;
case '3':
fread(tmp, sizeof(char), 2, fin);
value=Ascii2Int(tmp[0], tmp[1]);
chksum += value;
addr += value;
addr = addr<<8;
fread(tmp, sizeof(char), 2, fin);
value = Ascii2Int(tmp[0], tmp[1]);
chksum += value;
addr += value;
addr = addr<<8;
fread(tmp, sizeof(char), 2, fin);
value = Ascii2Int(tmp[0], tmp[1]);
chksum += value;
addr += value;
addr = addr<<8;
fread(tmp, sizeof(char), 2, fin);
value = Ascii2Int(tmp[0], tmp[1]);
chksum += value;
addr += value;
num -= 4;
break;
case '5':
break;
case '7':
break;
case '8':
break;
case '9':
break;
default :
break;
}
#if 0
switch (func) {
case '0':
printf("\n module version:\n");
break;
case '1':
//Memo1->Lines->Add(" \n地址 ");
//sprintf(buf," 0x%x ",addr);
//Memo1->Text=Memo1->Text+buf;
//Memo1->Text=Memo1->Text+"-数据信息:";
break;
case '2':
//Memo1->Lines->Add(" \n地址 ");
//sprintf(buf," 0x%x ",addr);
//Memo1->Text=Memo1->Text+buf;
//Memo1->Text=Memo1->Text+"-数据信息:";
break;
case '3':
//Memo1->Lines->Add(" \n地址 ");
//sprintf(buf," 0x%x ",addr);
//Memo1->Text=Memo1->Text+buf;
//Memo1->Text=Memo1->Text+"-数据信息:";
break;
case '5':
printf("\n data line count:\n");
break;
case '7':
printf(" \n program start address:\n");
break;
case '8':
printf(" \n program start address:\n");
break;
case '9':
printf(" \n program start address:\n");
break;
}
#endif
/*循环读取一行数据, 写入.bin文件中*/
while (num > 1) {
fread(tmp, sizeof(char), 2, fin);
num--;
value = Ascii2Int(tmp[0], tmp[1]);
switch (func) {
case '0':
// sprintf(buf," 0x%2x ",value);
// printf("s0 text: %s\n", buf);
break;
case '1':
// sprintf(buf," 0x%2x ",value);
// printf("s0 text: %s\n", buf);
fwrite(&value, sizeof(char), 1, fout);
size++;
break;
case '2':
// sprintf(buf," 0x%2x ",value);
// printf("s0 text: %s\n", buf);
fwrite(&value, sizeof(char), 1, fout);
size++;
break;
case '3':
// sprintf(buf," 0x%2x ",value);
// printf("s0 text: %s\n", buf);
fwrite(&value, sizeof(char), 1, fout);
size++;
break;
case '5':
// sprintf(buf," 0x%2x ",value);
// printf("s5 text: %s\n", buf);
break;
case '7':
// sprintf(buf," 0x%2x ",value);
// printf("s7 text: %s\n", buf);
break;
case '8':
// sprintf(buf," 0x%2x ",value);
// printf("s8 text: %s\n", buf);
break;
case '9':
// sprintf(buf," 0x%2x ",value);
// printf("s9 text: %s\n", buf);
break;
}
chksum += value;
}
/*获取check sum*/
fread(tmp, sizeof(char), 2, fin);
value = Ascii2Int(tmp[0], tmp[1]);
if(value != 0xff - chksum)
printf("crc sum error! text_value:0x%x, clc_chksum:0x%x\n", value, (0xff - chksum));
else
printf("crc sum ok! text_value:0x%x, clc_chksum:0x%x\n", value, (0xff - chksum));
}
}
3 . 参考代码2
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define MAX_EXTENSION_SIZE 16
#define MAX_LINE_SIZE 1024
#define MAX_FILE_NAME_SIZE 260
typedef char filetype[MAX_FILE_NAME_SIZE];
typedef struct {
unsigned int file_size;
unsigned int start_addr;
unsigned int end_addr;
FILE *file_in, *file_out;
} update_file_info, * p_update_file_info;
update_file_info g_update_ecu_file_info;
void get_line(char* str, FILE *in)
{
char *result;
result = fgets(str, MAX_LINE_SIZE, in);
if ((NULL == result) && !feof (in))
printf("Error occurred while reading from file\n");
}
void put_extension(char *file_name, char *extension)
{
/* location of period in file name */
char *Period;
int ret = -1;
/*find '.': the last postion*/
if (NULL != (Period = strrchr(file_name,'.')))
*(Period) = '\0';
if (strcmp(extension, Period + 1) == 0)
ret = 0;
strcat(file_name, ".");
strcat(file_name, extension);
}
void s19_to_bin(char *path)
{
/*保存行内容*/
char *p_line = NULL;
char extension[MAX_EXTENSION_SIZE] = {0};
filetype filename;
char *p = NULL;
unsigned char *memory_block = NULL;
unsigned int memory_block_position;
/*记录行数*/
unsigned int record_line = 0;
int ret;
unsigned int i;
/*行信息*/
unsigned int type;
unsigned int data_length;
unsigned int address;
char *p_data = NULL;
unsigned char check_sum = 0;
unsigned int temp2;
unsigned int max_data_length;
g_update_ecu_file_info.start_addr = (unsigned int)(-1);
g_update_ecu_file_info.end_addr = 0;
p_line = (char *)malloc(MAX_LINE_SIZE * sizeof(char));
if (NULL == p_line)
printf("malloc line buffer error. \n");
p_data = (char *)malloc(MAX_LINE_SIZE * sizeof(char));
if (NULL == p_data)
printf("malloc data buffer error. \n");
/* default is for binary file extension */
strncpy(extension, "bin", sizeof(extension));
/* get filename */
if (strlen(path) < MAX_FILE_NAME_SIZE) {
strcpy(filename, path);
} else {
printf("filename length exceeds %d characters.\n", MAX_FILE_NAME_SIZE);
}
/* Just a normal file name */
g_update_ecu_file_info.file_in = fopen(filename, "r");
put_extension(filename, extension);
g_update_ecu_file_info.file_out = fopen(filename,"wb");
/*1. calc the size by address*/
do {
/* Read a line from input file. */
get_line(p_line, g_update_ecu_file_info.file_in);
record_line++;
i = strlen(p_line);
if (--i != 0) {
if (p_line[i] == '\n')
p_line[i] = '\0';
ret = sscanf(p_line, "S%1x%2x", &type, &data_length);
if (2 != ret)
printf("Error in line %d of hex file\n", record_line);
// printf("type:%d, data_length:%d, record_line:%d\n", type, data_length, record_line);
switch (type) {
case 0:
ret = sscanf(p_line, "S%1x%2x%4x%s",&type, &data_length, &address, p_data);
if (4 != ret)
printf("Error in line %d of hex file\n", record_line);
break;
case 1:
ret = sscanf(p_line, "S%1x%2x%4x%s",&type, &data_length, &address, p_data);
if (4 != ret)
printf("Error in line %d of hex file\n", record_line);
printf("address: 0x%x\n", address);
if (g_update_ecu_file_info.start_addr > address)
g_update_ecu_file_info.start_addr = address;
address = address + data_length - 1;
if (g_update_ecu_file_info.end_addr < address)
g_update_ecu_file_info.end_addr = address;
break;
case 2:
ret = sscanf(p_line, "S%1x%2x%6x%s",&type, &data_length, &address, p_data);
if (4 != ret)
printf("Error in line %d of hex file\n", record_line);
if (g_update_ecu_file_info.start_addr > address)
g_update_ecu_file_info.start_addr = address;
address = address + data_length - 1;
if (g_update_ecu_file_info.end_addr < address)
g_update_ecu_file_info.end_addr = address;
break;
case 3:
ret = sscanf(p_line, "S%1x%2x%8x%s",&type, &data_length, &address, p_data);
if (4 != ret)
printf("Error in line %d of hex file\n", record_line);
if (g_update_ecu_file_info.start_addr > address)
g_update_ecu_file_info.start_addr = address;
address = address + data_length - 1;
if (g_update_ecu_file_info.end_addr < address)
g_update_ecu_file_info.end_addr = address;
break;
case 5:
ret = sscanf(p_line, "S%1x%2x%4x%s",&type, &data_length, &address, p_data);
if (4 != ret)
printf("Error in line %d of hex file\n", record_line);
break;
case 7:
ret = sscanf(p_line, "S%1x%2x%8x%s",&type, &data_length, &address, p_data);
if (4 != ret)
printf("Error in line %d of hex file\n", record_line);
break;
case 8:
ret = sscanf(p_line, "S%1x%2x%6x%s",&type, &data_length, &address, p_data);
if (4 != ret)
printf("Error in line %d of hex file\n", record_line);
break;
case 9:
ret = sscanf(p_line, "S%1x%2x%4x%s",&type, &data_length, &address, p_data);
if (4 != ret)
printf("Error in line %d of hex file\n", record_line);
break;
default:
break;
}
}
} while (!feof(g_update_ecu_file_info.file_in));
/*calc the data size*/
max_data_length = g_update_ecu_file_info.end_addr - g_update_ecu_file_info.start_addr + 1;
g_update_ecu_file_info.file_size = max_data_length;
printf("start addr:0x%08x\n", g_update_ecu_file_info.start_addr);
printf("end addr:0x%08x\n", g_update_ecu_file_info.end_addr);
printf("data size: %d Bytes\n", g_update_ecu_file_info.file_size);
memory_block = (unsigned char *)malloc(max_data_length * sizeof(unsigned char));
if (NULL == memory_block)
printf("malloc memory_block buffer error. \n");
memset (memory_block, 0xFF, max_data_length);
/*****************2. deal with data***********************/
record_line = 0;
/*init file inner pointer*/
rewind(g_update_ecu_file_info.file_in);
/* Read the file & process the lines. */
/* repeat until EOF(Filin) */
do {
/* Read a line from input file. */
get_line(p_line, g_update_ecu_file_info.file_in);
record_line++;
i = strlen(p_line);
if (--i != 0) {
if (p_line[i] == '\n')
p_line[i] = '\0';
ret = sscanf(p_line, "S%1x%2x", &type, &data_length);
if (2 != ret)
printf("Error in line %d of hex file\n", record_line);
// printf("type:%d, data_length:%d, record_line:%d\n", type, data_length, record_line);
switch (type) {
case 0:
ret = sscanf(p_line, "S%1x%2x%4x%s",&type, &data_length, &address, p_data);
if (4 != ret)
printf("Error in line %d of hex file\n", record_line);
check_sum = data_length + (address >> 8) + (address & 0xff);
break;
case 1:
ret = sscanf(p_line, "S%1x%2x%4x%s",&type, &data_length, &address, p_data);
if (4 != ret)
printf("Error in line %d of hex file\n", record_line);
check_sum = data_length + (address >> 8) + (address & 0xff);
printf("type:%d, data_length:0x%x, address: 0x%x, record_line:%d \n", type, data_length, address, record_line);
printf("p_data: %s\n", p_data);
/*行内容:data段的起始位置*/
p = (char *)p_data;
/*计算相对于最低位置的地址*/
memory_block_position = address - g_update_ecu_file_info.start_addr;
/*开始存储数据*/
if (memory_block_position < g_update_ecu_file_info.file_size) {
/*save data*/
data_length = data_length - 3;
do {
ret = sscanf(p, "%2x", &temp2);
if (1 != ret)
printf("ReadDataBytes: error in line %d of hex file\n", record_line);
p += 2;
memory_block[memory_block_position++] = temp2;
check_sum = (check_sum + temp2) & 0xFF;
} while (--data_length != 0);
} else
printf("Overlapped record detected\n");
/* Read the Checksum value. */
ret = sscanf(p, "%2x",&temp2);
if (1 != ret)
printf("Error in line %d of hex file\n", record_line);
/* Verify Checksum value. */
if(temp2 != 0xff - check_sum)
printf("crc sum error! text_value:0x%x, clc_chksum:0x%x\n", temp2, (0xff - check_sum));
break;
case 2:
ret = sscanf(p_line, "S%1x%2x%6x%s",&type, &data_length, &address, p_data);
if (4 != ret)
printf("Error in line %d of hex file\n", record_line);
check_sum = data_length + (address >> 16) +
((address >> 8)&0xff) + (address & 0xff);
/*行内容:data段的起始位置*/
p = (char *)p_data;
/*计算相对于最低位置的地址*/
memory_block_position = address - g_update_ecu_file_info.start_addr;
/*开始存储数据*/
if (memory_block_position < g_update_ecu_file_info.file_size) {
/*save data*/
data_length = data_length - 4;
do {
ret = sscanf(p, "%2x", &temp2);
if (1 != ret)
printf("ReadDataBytes: error in line %d of hex file\n", record_line);
p += 2;
memory_block[memory_block_position++] = temp2;
check_sum = (check_sum + temp2) & 0xFF;
} while (--data_length != 0);
} else
printf("Overlapped record detected\n");
/* Read the Checksum value. */
ret = sscanf(p, "%2x",&temp2);
if (1 != ret)
printf("Error in line %d of hex file\n", record_line);
/* Verify Checksum value. */
if(temp2 != 0xff - check_sum)
printf("crc sum error! text_value:0x%x, clc_chksum:0x%x\n", temp2, (0xff - check_sum));
break;
case 3:
ret = sscanf(p_line, "S%1x%2x%8x%s",&type, &data_length, &address, p_data);
if (4 != ret)
printf("Error in line %d of hex file\n", record_line);
check_sum = data_length + (address >> 24) +
((address >> 16) & 0xff) + ((address >> 8)&0xff) +
(address & 0xff);
/*行内容:data段的起始位置*/
p = (char *)p_data;
/*计算相对于最低位置的地址*/
memory_block_position = address - g_update_ecu_file_info.start_addr;
/*开始存储数据*/
if (memory_block_position < g_update_ecu_file_info.file_size) {
/*save data*/
data_length = data_length - 5;
do {
ret = sscanf(p, "%2x", &temp2);
if (1 != ret)
printf("ReadDataBytes: error in line %d of hex file\n", record_line);
p += 2;
memory_block[memory_block_position++] = temp2;
check_sum = (check_sum + temp2) & 0xFF;
} while (--data_length != 0);
} else
printf("Overlapped record detected\n");
/* Read the Checksum value. */
ret = sscanf(p, "%2x",&temp2);
if (1 != ret)
printf("Error in line %d of hex file\n", record_line);
/* Verify Checksum value. */
if(temp2 != 0xff - check_sum)
printf("crc sum error! text_value:0x%x, clc_chksum:0x%x\n", temp2, (0xff - check_sum));
break;
case 5:
ret = sscanf(p_line, "S%1x%2x%4x%s",&type, &data_length, &address, p_data);
if (4 != ret)
printf("Error in line %d of hex file\n", record_line);
check_sum = data_length + (address >> 8) + (address & 0xff);
break;
case 7:
ret = sscanf(p_line, "S%1x%2x%8x%s",&type, &data_length, &address, p_data);
if (4 != ret)
printf("Error in line %d of hex file\n", record_line);
check_sum = data_length + (address >> 24) +
((address >> 16) & 0xff) + ((address >> 8)&0xff) +
(address & 0xff);
break;
case 8:
ret = sscanf(p_line, "S%1x%2x%6x%s",&type, &data_length, &address, p_data);
if (4 != ret)
printf("Error in line %d of hex file\n", record_line);
check_sum = data_length + (address >> 16) +
((address >> 8)&0xff) + (address & 0xff);
break;
case 9:
ret = sscanf(p_line, "S%1x%2x%4x%s",&type, &data_length, &address, p_data);
if (4 != ret)
printf("Error in line %d of hex file\n", record_line);
check_sum = data_length + (address >> 8) + (address & 0xff);
break;
default:
break;
}
}
}while (!feof(g_update_ecu_file_info.file_in));
/*write binary file*/
fwrite (memory_block, g_update_ecu_file_info.file_size, 1, g_update_ecu_file_info.file_out);
fflush(g_update_ecu_file_info.file_out);
fclose(g_update_ecu_file_info.file_in);
fclose(g_update_ecu_file_info.file_out);
free(memory_block);
memory_block = NULL;
free(p_line);
p_line = NULL;
free(p_data);
p_data = NULL;
}
int main(int argc, char *argv[])
{
s19_to_bin(argv[argc-1]);
return 0;
}