#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#pragma pack(1)
// config MCU clock
#define MCU_CONFIG
//#define MCU_6TO6
//#define MCU_6TO12
//#define MCU_12TO12
//#define MCU_12TO6
#ifdef MCU_6TO6
#define MCU_CLOCK
#endif
#ifdef MCU_6TO12
#define MCU_CLOCK
#endif
#ifdef MCU_12TO12
#define MCU_CLOCK
#define MCU_CLOCK_12MHZ
#undef MCU_CONFIG
#endif
#ifdef MCU_12TO6
#define MCU_CLOCK
#define MCU_CLOCK_12MHZ
#endif
#ifndef MCU_CLOCK
#error "You must define MCU clock!"
#endif
#define VERSION "0.1"
#define DEFAULT_PORT "/dev/ttyS1"
#define LOW_BAUD B2400
#ifdef MCU_CLOCK_12MHZ
#define HIGH_BAUD B57600
#define MSG_HIGH_BAUD "57600bps"
#else
#define HIGH_BAUD B38400
#define MSG_HIGH_BAUD "38400bps"
#endif
#define BUFFSIZE 1024
#define TIMEOUT 2
#define BLOCK_SIZE 128
#define PKG_MINIMAL_LEN 9
#define PKG_SIGN1 '\x46'
#define PKG_SIGN2 '\xb9'
#define PKG_SIGN3 '\x16'
#define PKG_SIGN 0x46b9
enum pkg_type {
PKG_TYPE1=0x68,
PKG_TYPE2=0x6a,
};
enum pkg_code {
CODE_INFO=0x50,
CODE_MODI=0x8f,
CODE_NEWB=0x8e,
CODE_ERASE=0x84,
CODE_DATA=0x00,
CODE_END =0x69,
CODE_CONF=0x8d,
CODE_BYE =0x82,
};
int port_fd=-1;
FILE *rom_file;
int file_length;
int debug=0;
enum pkg_code step;
int block_no;
struct timeval start_tv;
typedef unsigned int uint32;
typedef unsigned short int uint16;
typedef unsigned char uint8;
// Package format: head + data + tail
typedef struct _pkg_head {
uint16 sign; // 0x46b9
uint8 type; // 68: MCU to PC; 6a: PC to MCU
uint16 lenth; // from 'type' to 'pkg_tail.sign'
uint8 code;
} pkg_head, *ppkg_head;
typedef struct _pkg_tail {
uint16 cksum; // from 'pkg_head.type' to 'data'
uint8 sign; // 0x16
} pkg_tail, *ppkg_tail;
typedef struct _pkg_data_head {
uint16 dummy; // always 0x0000
uint16 addr; // start addr
uint16 lenth; // 0x0080
} pkg_data_head, *ppkg_data_head;
void print_data(char *data, int len)
{
unsigned char ch;
int i, j;
printf("Length: %x\n", len);
for(i=0; i
ch=data[i];
if((i&0x0f)==0)
printf("%04x: ", i);
if((i&0x07)!=0x07)
printf("%02x ", ch);
else
if((i&0x0f)!=0x0f)
printf("%02x-", ch);
else {
printf("%02x ", ch);
for(j=0x0f; j>=0; j--) {
ch=data[i-j];
if(!isascii(ch) || iscntrl(ch))
ch='.';
putchar(ch);
}
putchar('\n');
}
}
if(len&0x0f) {
for(; i
printf(" ");
putchar(' ');
for(j=len&~0x0f; j
ch=data[j];
if(!isascii(ch) || iscntrl(ch))
ch='.';
putchar(ch);
}
putchar('\n');
}
}
enum dbg_type {RECV, SEND};
void print_dbg(int type, char *buf, int buf_len)
{
struct timeval tv;
unsigned int sec, usec;
if(debug) {
if(type==SEND)
printf("\n[Send]\t\t");
else
printf("\n[Received]\t");
gettimeofday(&tv, NULL);
if(start_tv.tv_usec>tv.tv_usec) {
usec=tv.tv_usec-start_tv.tv_usec+1000000;
sec=tv.tv_sec-start_tv.tv_sec-1;
} else {
usec=tv.tv_usec-start_tv.tv_usec;
sec=tv.tv_sec-start_tv.tv_sec;
}
printf("[%d.%06d]\n", sec