URL
https://opencores.org/ocsvn/mips789/mips789/trunk
Subversion Repositories mips789
Compare Revisions
- This comparison shows the changes necessary to convert path
/mips789/branches/avendor/CTool
- from Rev 35 to Rev 51
- ↔ Reverse comparison
Rev 35 → Rev 51
/convert_sp.c
0,0 → 1,306
|
/* convert.c by Steve Rhoads 4/26/01 */ |
/* Now uses the ELF format (get gccmips_elf.zip) */ |
/* set $gp and zero .sbss and .bss */ |
/* Reads test.axf and creates code.txt */ |
/* modified by Liwei 2007-8-29 */ |
#include <stdio.h> |
#include <stdlib.h> |
#include <string.h> |
#define BUF_SIZE (1024*1024*4) |
/*Assumes running on PC little endian*/ |
#ifndef USE_BIG_ENDIAN |
#define ntohl(A) (((A)>>24)|(((A)&0x00ff0000)>>8)|(((A)&0xff00)<<8)|((A)<<24)) |
#define ntohs(A) (unsigned short)((((A)&0xff00)>>8)|((A)<<8)) |
#else |
#define ntohl(A) A |
#define ntohs(A) A |
#endif |
|
#define EI_NIDENT 16 |
#define SHT_PROGBITS 1 |
#define SHT_STRTAB 3 |
#define SHT_NOBITS 8 |
|
typedef struct |
{ |
unsigned char e_ident[EI_NIDENT]; |
unsigned short e_e_type ; |
unsigned short e_machine ; |
unsigned long e_version ; |
unsigned long e_entry ; |
unsigned long e_phoff ; |
unsigned long e_shoff ; |
unsigned long e_flags ; |
unsigned short e_ehsize ; |
unsigned short e_phentsize ; |
unsigned short e_phnum ; |
unsigned short e_shentsize ; |
unsigned short e_shnum ; |
unsigned short e_shstrndx ; |
} |
ElfHeader ; |
|
typedef struct |
{ |
unsigned long p_type ; |
unsigned long p_offset ; |
unsigned long p_vaddr ; |
unsigned long p_paddr ; |
unsigned long p_filesz ; |
unsigned long p_memsz ; |
unsigned long p_flags ; |
unsigned long p_align ; |
} |
Elf32_Phdr ; |
|
typedef struct |
{ |
unsigned long sh_name ; |
unsigned long sh_type ; |
unsigned long sh_flags ; |
unsigned long sh_addr ; |
unsigned long sh_offset ; |
unsigned long sh_size ; |
unsigned long sh_link ; |
unsigned long sh_info ; |
unsigned long sh_addralign ; |
unsigned long sh_entsize ; |
} |
Elf32_Shdr ; |
|
typedef struct |
{ |
unsigned long ri_gprmask ; |
unsigned long ri_cprmask[4]; |
unsigned long ri_gp_value ; |
} |
ELF_RegInfo ; |
|
#define PT_MIPS_REGINFO 0x70000000 |
#define SHT_MIPS_REGINFO 0x70000006 |
|
void set_low(unsigned char*ptr,unsigned long address,unsigned long value) |
{ |
unsigned long opcode ; |
opcode=*(unsigned long*)(ptr+address); |
opcode=ntohl(opcode); |
opcode=(opcode&0xffff0000)|(value&0xffff); |
opcode=ntohl(opcode); |
*(unsigned long*)(ptr+address)=opcode ; |
} |
|
/*the two functions listed between are added by Liwei 2007-8-29*/ |
char HEX[]="0123456789ABCDEF" ; |
char hex[]="0123456789abcdef" ; |
unsigned char hex2byte(char hex_char) |
{ |
unsigned char i ; |
for(i=0;i<16;++i)if(HEX[i]==hex_char)return i ; |
for(i=0;i<16;++i)if(hex[i]==hex_char)return i ; |
return 0 ; |
} |
unsigned int par2u32(char*par) |
{ |
unsigned int i,ret=0 ; |
if(par==NULL)return ; |
if((0==strncmp(par,"0x",2))||(0==strncmp(par,"0X",2))) |
for(i=2;;++i) |
{ |
if(par[i]=='\0')return ret ; |
if(par[i]==' ')return ret ; |
ret=ret*16+hex2byte(par[i]); |
} |
else |
for(i=0;;++i) |
{ |
if(par[i]=='\0')return ret ; |
if(par[i]==' ')return ret ; |
ret=ret*10+hex2byte(par[i]); |
} |
return 0 ; |
} |
/****************************/ |
|
int main(int argc,char*argv[]) |
{ |
FILE*infile,*outfile,*txtfile ; |
unsigned char*buf,*code ; |
long size,stack_pointer ; |
long stack_limit=0 ; |
unsigned long length,d,i,gp_ptr=0,gp_ptr_backup=0 ; |
unsigned long bss_start=0,bss_end=0 ; |
|
ElfHeader*elfHeader ; |
Elf32_Phdr*elfProgram ; |
ELF_RegInfo*elfRegInfo ; |
Elf32_Shdr*elfSection ; |
(void)argc ; |
(void)argv ; |
// printf(">%s<=>%d<\n",argv[1],par2u32((char*)argv[1]));//Liwei 2007-8.29 |
// printf(">%s<=>%d<\n",argv[2],par2u32((char*)argv[2]));//Liwei 2007-8.29 |
// printf("argc = %d\n",argc); |
if(argc>=3) |
stack_limit=((par2u32((char*)argv[1])-par2u32((char*)argv[2]))); |
//alig 4 |
/* added by Liwei 2007_8_29 */ |
/*usage example : |
convert_sp 0x800 0xf0 |
the sp_pointer is limited and set as (0x800 - 0xf0) |
0x800 is your instructions space lenth while 0xf0 is your stack lenth |
but make sure your instructions space is big enough... |
comment by Liwei |
*/ |
printf("test.axf -> code.txt & test.bin\n"); |
infile=fopen("test.axf","rb"); |
if(infile==NULL) |
{ |
printf("Can't open test.axf"); |
return 0 ; |
} |
buf=(unsigned char*)malloc(BUF_SIZE); |
size=(int)fread(buf,1,BUF_SIZE,infile); |
fclose(infile); |
code=(unsigned char*)malloc(BUF_SIZE); |
memset(code,0,BUF_SIZE); |
|
elfHeader=(ElfHeader*)buf ; |
if(strncmp((char*)elfHeader->e_ident+1,"ELF",3)) |
{ |
printf("Error: Not an ELF file!\n"); |
printf("Use the gccmips_elf.zip from opencores/projects/plasma!\n"); |
return-1 ; |
} |
|
elfHeader->e_entry=ntohl(elfHeader->e_entry); |
elfHeader->e_phoff=ntohl(elfHeader->e_phoff); |
elfHeader->e_shoff=ntohl(elfHeader->e_shoff); |
elfHeader->e_flags=ntohl(elfHeader->e_flags); |
elfHeader->e_phentsize=ntohs(elfHeader->e_phentsize); |
elfHeader->e_phnum=ntohs(elfHeader->e_phnum); |
elfHeader->e_shentsize=ntohs(elfHeader->e_shentsize); |
elfHeader->e_shnum=ntohs(elfHeader->e_shnum); |
printf("Entry=0x%x ",elfHeader->e_entry); |
length=0 ; |
|
for(i=0;i<elfHeader->e_phnum;++i) |
{ |
elfProgram=(Elf32_Phdr*)(buf+elfHeader->e_phoff+ |
elfHeader->e_phentsize*i); |
elfProgram->p_type=ntohl(elfProgram->p_type); |
elfProgram->p_offset=ntohl(elfProgram->p_offset); |
elfProgram->p_vaddr=ntohl(elfProgram->p_vaddr); |
elfProgram->p_filesz=ntohl(elfProgram->p_filesz); |
elfProgram->p_memsz=ntohl(elfProgram->p_memsz); |
elfProgram->p_flags=ntohl(elfProgram->p_flags); |
|
elfProgram->p_vaddr-=elfHeader->e_entry ; |
|
if(elfProgram->p_type==PT_MIPS_REGINFO) |
{ |
elfRegInfo=(ELF_RegInfo*)(buf+elfProgram->p_offset); |
gp_ptr=ntohl(elfRegInfo->ri_gp_value); |
} |
if(elfProgram->p_vaddr<BUF_SIZE) |
{ |
/* printf("[0x%x,0x%x,0x%x,0x%x,0x%x]\n", elfProgram->p_vaddr, */ |
/* elfProgram->p_offset, elfProgram->p_filesz, elfProgram->p_memsz, */ |
/* elfProgram->p_flags); */ |
memcpy(code+elfProgram->p_vaddr,buf+elfProgram->p_offset, |
elfProgram->p_filesz); |
length=elfProgram->p_vaddr+elfProgram->p_filesz ; |
/* printf("length = %d 0x%x\n", length, length); */ |
} |
} |
|
for(i=0;i<elfHeader->e_shnum;++i) |
{ |
elfSection=(Elf32_Shdr*)(buf+elfHeader->e_shoff+ |
elfHeader->e_shentsize*i); |
elfSection->sh_name=ntohl(elfSection->sh_name); |
elfSection->sh_type=ntohl(elfSection->sh_type); |
elfSection->sh_addr=ntohl(elfSection->sh_addr); |
elfSection->sh_offset=ntohl(elfSection->sh_offset); |
elfSection->sh_size=ntohl(elfSection->sh_size); |
|
if(elfSection->sh_type==SHT_MIPS_REGINFO) |
{ |
elfRegInfo=(ELF_RegInfo*)(buf+elfSection->sh_offset); |
gp_ptr=ntohl(elfRegInfo->ri_gp_value); |
} |
if(elfSection->sh_type==SHT_PROGBITS) |
{ |
/* printf("elfSection->sh_addr=0x%x\n", elfSection->sh_addr); */ |
if(elfSection->sh_addr>gp_ptr_backup) |
gp_ptr_backup=elfSection->sh_addr ; |
} |
if(elfSection->sh_type==SHT_NOBITS) |
{ |
if(bss_start==0) |
{ |
bss_start=elfSection->sh_addr ; |
} |
bss_end=elfSection->sh_addr+elfSection->sh_size ; |
} |
} |
|
if(length>bss_start-elfHeader->e_entry) |
{ |
length=bss_start-elfHeader->e_entry ; |
} |
if(bss_start==length) |
{ |
bss_start=length ; |
bss_end=length+4 ; |
} |
if(gp_ptr==0) |
gp_ptr=gp_ptr_backup+0x7ff0 ; |
|
/* #if 0 */ |
/*Initialize the $gp register for sdata and sbss */ |
printf("gp_ptr=0x%x ",gp_ptr); |
/*modify the first opcodes in boot.asm */ |
/*modify the lui opcode */ |
set_low(code,0,gp_ptr>>16); |
/*modify the ori opcode */ |
set_low(code,4,gp_ptr&0xffff); |
|
/*Clear .sbss and .bss */ |
printf("sbss=0x%x bss_end=0x%x\nlength=0x%x ",bss_start,bss_end,length); |
set_low(code,8,bss_start>>16); |
set_low(code,12,bss_start&0xffff); |
set_low(code,16,bss_end>>16); |
set_low(code,20,bss_end&0xffff); |
|
/*Set stack pointer */ |
if(elfHeader->e_entry<0x10000000) |
stack_pointer=bss_end+512 ; |
else |
stack_pointer=bss_end+1024*4 ; |
|
if(stack_limit)stack_pointer=(stack_pointer<stack_limit)?stack_pointer:stack_limit ; |
//added by Liwei 2007-8-29 |
stack_pointer&=~7 ; |
printf("SP=0x%x\n",stack_pointer); |
set_low(code,24,stack_pointer>>16); |
set_low(code,28,stack_pointer&0xffff); |
/* #endif */ |
|
/*write out test.bin */ |
outfile=fopen("test.bin","wb"); |
fwrite(code,length,1,outfile); |
fclose(outfile); |
|
|
/*write out code.txt */ |
txtfile=fopen("code.txt","w"); |
for(i=0;i<=length;i+=4) |
{ |
d=ntohl(*(unsigned long*)(code+i)); |
fprintf(txtfile,"%8.8x\n",d); |
} |
fclose(txtfile); |
free(buf); |
printf("\n"); |
return 0 ; |
} |
/gensim.c
0,0 → 1,218
/****************************************************************** |
* * |
* Author: Liwei * |
* * |
* This file is part of the "mips789" project. * |
* Downloaded from: * |
* http://www.opencores.org/pdownloads.cgi/list/mips789 * |
* * |
* If you encountered any problem, please contact me via, * |
* Email:mcupro@opencores.org or mcupro@163.com * |
* * |
******************************************************************/ |
|
#include "stdio.h" |
#include "stdlib.h" |
|
#define MAX_LEN (1024*2) |
|
int print_module(FILE * ft){ |
if (ft==NULL)return 0; |
fprintf(ft,"//This file is only used for simulation.\nmodule sim_mem_array \n"); |
fprintf(ft," ( \n"); |
fprintf(ft," input clk, \n"); |
fprintf(ft," input [31:0] pc_i, \n"); |
fprintf(ft," output [31:0] ins_o, \n"); |
fprintf(ft," input [3:0] wren, \n"); |
fprintf(ft," input [31:0]din, \n"); |
fprintf(ft," input [31:0]data_addr_i, \n"); |
fprintf(ft," output [31:0]dout \n"); |
fprintf(ft," ); \n\n"); |
fprintf(ft," wire [29:0] data_addr,pc; \n"); |
fprintf(ft," wire [31:0]dout_w; \n"); |
fprintf(ft," assign dout = dout_w; \n"); |
fprintf(ft," assign data_addr=data_addr_i[31:2]; \n"); |
fprintf(ft," assign pc= pc_i[31:2]; \n\n"); |
|
|
fprintf(ft," sim_syn_ram3 ram3 ( \n"); |
fprintf(ft," .data(din[31:24]), \n"); |
fprintf(ft," .wraddress(data_addr), \n"); |
fprintf(ft," .rdaddress_a(pc), \n"); |
fprintf(ft," .rdaddress_b(data_addr), \n"); |
fprintf(ft," .wren(wren[3]), \n"); |
fprintf(ft," .clock(clk), \n"); |
fprintf(ft," .qa(ins_o[31:24]), \n"); |
fprintf(ft," .qb(dout_w[31:24]) \n"); |
fprintf(ft," ); \n"); |
|
fprintf(ft," sim_syn_ram2 ram2( \n"); |
fprintf(ft," .data(din[23:16]), \n"); |
fprintf(ft," .wraddress(data_addr), \n"); |
fprintf(ft," .rdaddress_a(pc), \n"); |
fprintf(ft," .rdaddress_b(data_addr), \n"); |
fprintf(ft," .wren(wren[2]), \n"); |
fprintf(ft," .clock(clk), \n"); |
fprintf(ft," .qa(ins_o[23:16]), \n"); |
fprintf(ft," .qb(dout_w[23:16]) \n"); |
fprintf(ft," ); \n"); |
|
fprintf(ft," sim_syn_ram1 ram1( \n"); |
fprintf(ft," .data(din[15:8]), \n"); |
fprintf(ft," .wraddress(data_addr), \n"); |
fprintf(ft," .rdaddress_a(pc), \n"); |
fprintf(ft," .rdaddress_b(data_addr), \n"); |
fprintf(ft," .wren(wren[1]), \n"); |
fprintf(ft," .clock(clk), \n"); |
fprintf(ft," .qa(ins_o[15:8]), \n"); |
fprintf(ft," .qb(dout_w[15:8]) \n"); |
fprintf(ft," ); \n"); |
|
fprintf(ft," sim_syn_ram0 ram0( \n"); |
fprintf(ft," .data(din[7:0]), \n"); |
fprintf(ft," .wraddress(data_addr), \n"); |
fprintf(ft," .rdaddress_a(pc), \n"); |
fprintf(ft," .rdaddress_b(data_addr), \n"); |
fprintf(ft," .wren(wren[0]), \n"); |
fprintf(ft," .clock(clk), \n"); |
fprintf(ft," .qa(ins_o[7:0]), \n"); |
fprintf(ft," .qb(dout_w[7:0]) \n"); |
fprintf(ft," ); \n"); |
fprintf(ft,"endmodule \n\n\n"); |
return 1; |
} |
|
/*Liwei 2007-8-29*/ |
char HEX[]="0123456789ABCDEF" ; |
char hex[]="0123456789abcdef" ; |
unsigned char hex2byte( char hex_char) |
{ |
unsigned char i ; |
for(i=0;i<16;++i)if(HEX[i]==hex_char)return i ; |
for(i=0;i<16;++i)if(hex[i]==hex_char)return i ; |
return 0 ; |
} |
unsigned int par2u32(char*par) |
{ |
unsigned int i,ret=0 ; |
if(par==NULL)return ; |
if((0==strncmp(par,"0x",2))||(0==strncmp(par,"0X",2))) |
for(i=2;;++i) {if(par[i]=='\0')return ret ;if(par[i]==' ')return ret ; ret=ret*16+hex2byte(par[i]);} |
else |
for(i=0;;++i) {if(par[i]=='\0')return ret ;if(par[i]==' ')return ret ; ret=ret*10+hex2byte(par[i]);} |
return 0 ; |
} |
|
main(int argc,char*argv[]) |
{ |
int j=4,i=0,ii=0 ; |
int cntr=0,base=0 ; |
|
char str1[100],str2[111]; |
|
FILE*ff=fopen("code.txt","r"); |
FILE*ft=fopen("sim_ram.v","w"); |
|
if(NULL!=argv[1]) |
base=par2u32(argv[1])/4; |
print_module(ft); |
for(j=0;j<4;++j) |
{ |
cntr=-10 ; |
fprintf(ft,"module sim_syn_ram%d(\n",j); |
fprintf(ft," input [7:0] data,\n"); |
fprintf(ft," input [10:0] wraddress,\n"); |
fprintf(ft," input [10:0] rdaddress_a,\n"); |
fprintf(ft," input [10:0] rdaddress_b,\n"); |
fprintf(ft," input wren,\n"); |
fprintf(ft," input clock,\n"); |
fprintf(ft," output [7:0] qa,\n"); |
fprintf(ft," output [7:0] qb\n"); |
fprintf(ft," );\n\n"); |
|
fprintf(ft," reg [7:0] r_data;\n"); |
fprintf(ft," reg [10:0] r_wraddress;\n"); |
fprintf(ft," reg [10:0] r_rdaddress_a;\n"); |
fprintf(ft," reg [10:0] r_rdaddress_b;\n"); |
fprintf(ft," reg r_wren;\n"); |
|
fprintf(ft," reg [7:0] mem_bank [0:2047] ;\n"); |
if(base!=0) |
fprintf(ft," \ninteger i;\n initial begin\n for(i=0;i<%d;i=1+i)\n mem_bank[i] = 'h00;\n ",base); |
else |
fprintf(ft," \ninitial begin \n "); |
|
rewind(ff); |
cntr=-10 ; |
i=-1 ; |
|
while(fgets(str2,100,ff)) |
{ |
++i ; |
if(3==j) |
{ |
str2[2]=0 ; |
fprintf(ft,"mem_bank[%d] = 'h%s ; ",base+i,&str2[0]); |
++cntr ; |
if(!(cntr%10)) |
{ |
cntr=0 ; |
fprintf(ft,"\n "); |
} |
} |
else |
if(2==j) |
{ |
str2[4]=0 ; |
|
fprintf(ft,"mem_bank[%d] = 'h%s ; ",base+i,&str2[2]); |
|
++cntr ; |
if(!(cntr%10)) |
{ |
cntr=0 ; |
fprintf(ft,"\n "); |
} |
} |
else |
if(1==j) |
{ |
str2[6]=0 ; |
fprintf(ft,"mem_bank[%d] = 'h%s ; ",base+i,&str2[4]); |
|
++cntr ; |
if(!(cntr%10)) |
{ |
cntr=0 ; |
fprintf(ft,"\n "); |
} |
} |
else |
if(0==j) |
{ |
str2[8]=0 ; |
fprintf(ft,"mem_bank[%d] = 'h%s ; ",base+i,&str2[6]); |
|
++cntr ; |
if(!(cntr%10)) |
{ |
cntr=0 ; |
fprintf(ft,"\n "); |
} |
} |
} |
fprintf(ft," \n end\n"); |
fprintf(ft," always @ (posedge clock) if (r_wren) mem_bank[r_wraddress]<=r_data;\n"); |
fprintf(ft," always @ (posedge clock)\n"); |
fprintf(ft," begin\n"); |
fprintf(ft," r_data<=data;\n"); |
fprintf(ft," r_wraddress<=wraddress;\n"); |
fprintf(ft," r_rdaddress_a<=rdaddress_a;\n"); |
fprintf(ft," r_rdaddress_b<=rdaddress_b;\n"); |
fprintf(ft," r_wren<=wren;\n"); |
fprintf(ft," end\n"); |
fprintf(ft," assign qa =(r_rdaddress_a>%d)?0:mem_bank[r_rdaddress_a];\n",base+i); |
fprintf(ft," assign qb =(r_rdaddress_b>%d)?0:mem_bank[r_rdaddress_b];\n",base+i); |
fprintf(ft,"endmodule\n\n\n\n"); |
}fclose(ft); |
} |
/genmif.c
0,0 → 1,110
/****************************************************************** |
* * |
* Author: Liwei * |
* * |
* This file is part of the "mips789" project. * |
* Downloaded from: * |
* http://www.opencores.org/pdownloads.cgi/list/mips789 * |
* * |
* If you encountered any problem, please contact me via * |
* Email:mcupro@opencores.org or mcupro@163.com * |
* * |
******************************************************************/ |
|
#include "stdio.h" |
#include "stdlib.h" |
#define DEFAULT_LEN "2048" |
/*Liwei 2007-8-29*/ |
char HEX[]="0123456789ABCDEF" ; |
char hex[]="0123456789abcdef" ; |
unsigned char hex2byte(char hex_char) |
{ |
unsigned char i ; |
for(i=0;i<16;++i)if(HEX[i]==hex_char)return i ; |
for(i=0;i<16;++i)if(hex[i]==hex_char)return i ; |
return 0 ; |
} |
unsigned int par2u32(char*par) |
{ |
unsigned int i,ret=0 ; |
if(par==NULL)return ; |
if((0==strncmp(par,"0x",2))||(0==strncmp(par,"0X",2))) |
for(i=2;;++i) |
{ |
if(par[i]=='\0')return ret ;if(par[i]==' ')return ret ; |
ret=ret*16+hex2byte(par[i]); |
} |
else |
for(i=0;;++i) |
{ |
if(par[i]=='\0')return ret ;if(par[i]==' ')return ret ; |
ret=ret*10+hex2byte(par[i]); |
} |
return 0 ; |
} |
/****************************/ |
|
|
void main(int argc,char*argv[]) |
{ |
int j=4,base=0,i=0 ; |
char str1[100],str2[111]; |
FILE*ff=fopen("code.txt","r"); |
FILE*ft ; |
for(j=0;j<4;++j) |
{ |
if(j==0) |
ft=fopen("qu2_ram0.mif","w"); |
else if(j==1) |
ft=fopen("qu2_ram1.mif","w"); |
else if(j==2) |
ft=fopen("qu2_ram2.mif","w"); |
else if(j==3) |
ft=fopen("qu2_ram3.mif","w"); |
base=(NULL!=argv[1])?par2u32(argv[1]):0 ; |
base=base/4 ; |
fprintf(ft,"WIDTH=8;\n"); |
fprintf(ft,"DEPTH=%s;\n\n",DEFAULT_LEN); |
fprintf(ft,"ADDRESS_RADIX=HEX;\n"); |
fprintf(ft,"DATA_RADIX=HEX;\n\n"); |
fprintf(ft,"CONTENT BEGIN \n"); |
i=base ; |
|
if(base)while(i) |
{ |
fprintf(ft," %X : %s;\n ",base-i,"00"); |
--i ; |
} |
|
rewind(ff); |
rewind(ff); |
rewind(ff); |
i=-1 ; |
|
while(fgets(str2,100,ff)) |
{ |
++i ; |
if(3==j) |
{ |
str2[2]=0 ; |
fprintf(ft," %X : %s;\n ",i+base,&str2[0]); |
} |
else if(2==j) |
{ |
str2[4]=0 ; |
fprintf(ft," %X : %s;\n ",i+base,&str2[2]); |
} |
else if(1==j) |
{ |
str2[6]=0 ; |
fprintf(ft," %X : %s;\n ",i+base,&str2[4]); |
} |
else if(0==j) |
{ |
str2[8]=0 ; |
fprintf(ft," %X : %s;\n ",i+base,&str2[6]); |
} |
} |
fprintf(ft,"END;"); |
} |
} |
/ser_dld.c
0,0 → 1,173
|
/* RS-232 example */ |
/* Compiles with Microsoft Visual C++ 5.0/6.0 */ |
/* (c) fpga4fun.com KNJN LLC - 2003, 2004, 2005, 2006 */ |
/* modified by Liwei 2007-9-2 */ |
|
#include "stdio.h" |
#include "windows.h" |
#include "conio.h" |
#define MAX_PRG_SIZE 0x1d00 |
|
#define DEFAULT_BAUD_RATE 38400 |
/*the two functions listed between are added by Liwei 2007-8-29*/ |
char HEX[]="0123456789ABCDEF" ; |
char hex[]="0123456789abcdef" ; |
unsigned char hex2byte(char hex_char) |
{ |
unsigned char i ; |
for(i=0;i<16;++i)if(HEX[i]==hex_char)return i ; |
for(i=0;i<16;++i)if(hex[i]==hex_char)return i ; |
return 0 ; |
} |
unsigned char hex2u8(char*par) |
{ |
return(hex2byte(par[0])*16+hex2byte(par[1])); |
} |
unsigned int par2u32(char*par) |
{ |
unsigned int i,ret=0 ; |
if(par==NULL)return ; |
if((0==strncmp(par,"0x",2))||(0==strncmp(par,"0X",2))) |
for(i=2;;++i) |
{ |
if(par[i]=='\0')return ret ;if(par[i]==' ')return ret ; |
ret=ret*16+hex2byte(par[i]); |
} |
else |
for(i=0;;++i) |
{ |
if(par[i]=='\0')return ret ;if(par[i]==' ')return ret ; |
ret=ret*10+hex2byte(par[i]); |
} |
return 0 ; |
} |
/****************************/ |
HANDLE hCom ; |
|
void OpenCom(unsigned int baudrate,char*comno) |
{ |
DCB dcb ; |
COMMTIMEOUTS ct ; |
|
hCom=CreateFile(comno,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); |
if(hCom==INVALID_HANDLE_VALUE)exit(1); |
if(!SetupComm(hCom,4096,4096))exit(1); |
|
if(!GetCommState(hCom,&dcb))exit(1); |
dcb.BaudRate=baudrate ; |
//modified by `Liwei 2007-9-4 |
((DWORD*)(&dcb))[2]=0x1001 ; |
/* set port properties for TXDI + no flow-control */ |
dcb.ByteSize=8 ; |
dcb.Parity=NOPARITY ; |
dcb.StopBits=2 ; |
if(!SetCommState(hCom,&dcb))exit(1); |
|
/* set the timeouts to 0 */ |
ct.ReadIntervalTimeout=MAXDWORD ; |
ct.ReadTotalTimeoutMultiplier=0 ; |
ct.ReadTotalTimeoutConstant=0 ; |
ct.WriteTotalTimeoutMultiplier=0 ; |
ct.WriteTotalTimeoutConstant=0 ; |
if(!SetCommTimeouts(hCom,&ct))exit(1); |
} |
|
void CloseCom() |
{ |
CloseHandle(hCom); |
} |
|
DWORD WriteCom(char*buf,int len) |
{ |
DWORD nSend ; |
if(!WriteFile(hCom,buf,len,&nSend,NULL))exit(1); |
|
return nSend ; |
} |
|
void WriteComChar(char b) |
{ |
WriteCom(&b,1); |
} |
|
int ReadCom(char*buf,int len) |
{ |
DWORD nRec ; |
if(!ReadFile(hCom,buf,len,&nRec,NULL))exit(1); |
|
return(int)nRec ; |
} |
|
char ReadComChar() |
{ |
DWORD nRec ; |
char c ; |
if(!ReadFile(hCom,&c,1,&nRec,NULL))exit(1); |
|
return nRec?c:0 ; |
} |
//ser_dld 19200 COM1 N |
void main(int argc,char*argv[]) |
{ |
char c,s[11]; |
int i,baud_rate ; |
|
FILE*ff=fopen("code.txt","r"); |
baud_rate=(NULL!=argv[1])?par2u32(argv[1]):DEFAULT_BAUD_RATE ; |
//baud_rate=DEFAULT_BAUD_RATE; |
OpenCom(baud_rate,argv[2]); |
WriteComChar('?'); |
Sleep(1); |
i=100 ; |
while(i--); |
c=ReadComChar(); |
WriteComChar('!'); |
Sleep(10); |
c=ReadComChar(); |
if((argv[3]!=NULL)&&(argv[3][0]=='N')) |
{ |
|
} |
else |
{ |
if(c!='O') |
{ |
//printf("%c",c); |
printf("1,Powerup you board.\n2,Chech cable.\nany key to exit...\n"); |
getchar(); |
return ; |
} |
else |
{ |
printf("Downloading,wait...\n"); |
} |
} |
|
|
rewind(ff); |
while(fgets(s,10,ff)) |
{ |
WriteComChar(hex2u8((char*)(s+0))); |
printf("%2.2x ",hex2u8((char*)(s+0))); |
Sleep(1); |
|
WriteComChar(hex2u8((char*)(s+2))); |
printf("%2.2x ",hex2u8((char*)(s+2))); |
Sleep(1); |
|
WriteComChar(hex2u8((char*)(s+4))); |
printf("%2.2x ",hex2u8((char*)(s+4))); |
Sleep(1); |
|
WriteComChar(hex2u8((char*)(s+6))); |
printf("%2.2x \n",hex2u8((char*)(s+6))); |
Sleep(1); |
|
} |
Sleep(1); |
printf("Download to MIPS789 OK!\nPress RESET botton to RUN the MIPS789 program..."); |
WriteComChar(0x88); |
getch(); |
CloseCom(); |
} |