diff --git a/usb-loader/mch_flasher.c b/usb-loader/mch_flasher.c index 5d98232824f6d8851bc821ce6ea680293c1faa5f..c5ed8d6604abbfbafedb8ff5f06b53f15bcf3ef6 100644 --- a/usb-loader/mch_flasher.c +++ b/usb-loader/mch_flasher.c @@ -48,7 +48,7 @@ extern const char git_user[]; extern const char git_revision[]; char *program_path; - +char *program_name; int applet_silent_mode = 1; unsigned int buffer_size = 0x3000; @@ -314,15 +314,12 @@ int samba_connect(int board_rev) if(board_rev == BOARD_REV_V3 && id != ID_SAM9G45) die ("Not a 9G45 CPU"); } -int ddr_init(int board_rev, int NR) +int ddr_init(int board_rev) { if(board_rev == BOARD_REV_V2) samba_load_applet("isp-extram-at91sam9263", INTERNAL_SRAM_BUF); else if(board_rev == BOARD_REV_V3) - { - if(NR==14) samba_load_applet("isp-extram-at91sam9g45-NR14", INTERNAL_SRAM_BUF); - else samba_load_applet("isp-extram-at91sam9g45-NR13", INTERNAL_SRAM_BUF); - } + samba_load_applet("isp-extram-at91sam9g45", INTERNAL_SRAM_BUF); mbox_write(INTERNAL_SRAM_BUF, MBOX_COMMAND, APPLET_CMD_INIT); @@ -419,50 +416,101 @@ int dataflash_program(const char *filename) dataflash_write(0, SDRAM_START, len); } + +void show_help(const char* serial_port) +{ + printf("WhiteRabbit MCH DataFlash programmer (c) T.W. 2010\n"); + printf("Compiled by %s (%s)\ngit rev:%s\n\n",git_user,build_time,git_revision); + printf("Usage: %s [options] <dataflash image>\n", program_name); + printf("Options:\n"); + printf("\t-a \t\t perform all actions (same as -wec). Default option.\n"); + printf("\t-w \t\t write the dataflash\n"); + printf("\t-e \t\t erase the dataflash\n"); + printf("\t-c \t\t check the DDR\n"); + printf("\t-s SERIAL_PORT\t By default it is: -s %s\n",serial_port); + printf("\t-h \t\t Show this little help\n"); + printf("\n"); +} + main(int argc, char *argv[]) { int board_rev = BOARD_REV_V3; char *serial_port = "/dev/ttyACM0"; + char c; + int erase=0; + int check=0; + int write=0; + int noopts=1; + + program_name = basename(argv[0]); + program_path = dirname(argv[0]); + //Parse options + + while (--argc > 0 && (*++argv)[0] == '-') { + noopts=0; + while (c = *++argv[0]) { + switch (c) { + case 'a': erase = 1; check=1; write=1; break; + case 'e': erase=1; break; + case 'c': check=1; break; + case 'w': write=1; break; + case 's': serial_port = argv[1]; break; + case 'h': show_help(serial_port); + return 0; + break; + default: + printf("find: illegal option %c\n", c); + argc = 0; + break; + } + } + } + --argv; + ++argc; + + //Default value are all + if(noopts) { erase = 1; check=1; write=1; } - if(argc < 2) + printf("prog=%s, n=%d, serial=%s, (e=%d,c=%d,w=%d)\n", argv[1],argc,serial_port, erase,check,write); + + if(write && argc < 2) { - printf("WhiteRabbit MCH DataFlash programmer (c) T.W. 2010\n"); - printf("Usage: %s <dataflash image> [serial port (default = %s)\n", argv[0], serial_port); - return 0; + show_help(serial_port); + return 0; } - if(argc > 2) - serial_port = argv[2]; - //Print line to know the version of software for testing purpose fprintf(stderr,"\nCompiled by %s (%s)\ngit rev:%s\n\n",git_user,build_time,git_revision); - - program_path = dirname(argv[0]); - + serial_open(serial_port, PORT_SPEED); fprintf(stderr,"Initializing SAM-BA: "); samba_connect(board_rev); fprintf(stderr,"Initializing DDR...\n\n"); - ddr_init(board_rev,14); - - sys_delay(100); + ddr_init(board_rev); - fprintf(stderr,"Initializing DDR...\n\n"); - ddr_init(board_rev,13); - - fprintf(stderr,"Checking DDR...\n\n"); - ddr_check(board_rev); + if(check) + { + fprintf(stderr,"Checking DDR...\n\n"); + ddr_check(board_rev); + } fprintf(stderr,"Initializing DataFlash...\n\n"); dataflash_init(board_rev); - fprintf(stderr,"Erasing DataFlash...\n\n"); - dataflash_erase_all(); + if(erase) + { + fprintf(stderr,"Erasing DataFlash...\n\n"); + dataflash_erase_all(); + } + + if(write) + { + fprintf(stderr,"Programming DataFlash...\n"); + dataflash_program(argv[1]); + } - fprintf(stderr,"Programming DataFlash...\n"); - dataflash_program(argv[1]); printf("Programming done!\n"); serial_close();