From 75e9007f003ca9b20b76cdb0aae60cf1fa866846 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20Fr=C3=B6schle?= Date: Thu, 31 Jan 2013 14:06:51 +0000 Subject: [PATCH] Going to extend basflash.c to 1.) load srec files to their RAM destination without flashing for testing 2.) load and flash srec files from SD card --- BaS_gcc/include/s19reader.h | 4 +- BaS_gcc/sources/BaS.c | 2 +- BaS_gcc/sources/basflash.c | 176 ++++++++++++++++++++++++++++++++++++ BaS_gcc/sources/s19reader.c | 2 +- 4 files changed, 180 insertions(+), 4 deletions(-) diff --git a/BaS_gcc/include/s19reader.h b/BaS_gcc/include/s19reader.h index 4dd805b..5039e1a 100644 --- a/BaS_gcc/include/s19reader.h +++ b/BaS_gcc/include/s19reader.h @@ -1,5 +1,5 @@ /* - * bas_types.h + * s19reader.h * * Created on: 17.11.2012 * Author: mfro @@ -26,6 +26,6 @@ #ifndef _S19READER_H_ #define _S19READER_H_ -extern void flasher_load(char *flasher_filename); +extern void srec_execute(char *filename); #endif /* _S19READER_H_ */ diff --git a/BaS_gcc/sources/BaS.c b/BaS_gcc/sources/BaS.c index ebaca7a..67a9c30 100644 --- a/BaS_gcc/sources/BaS.c +++ b/BaS_gcc/sources/BaS.c @@ -241,7 +241,7 @@ void BaS(void) xprintf("finished\r\n"); sd_card_init(); - flasher_load("BASFLASH.S19"); + srec_execute("BASFLASH.S19"); /* * memory setup diff --git a/BaS_gcc/sources/basflash.c b/BaS_gcc/sources/basflash.c index f246beb..8f1f550 100644 --- a/BaS_gcc/sources/basflash.c +++ b/BaS_gcc/sources/basflash.c @@ -6,9 +6,185 @@ */ #include +#include #include +#include +#include +#include + +typedef enum {OK, ERR} err_t; + +bool memcpy() +{ + return true; +} + +bool verify() +{ + return true; +} + +bool simulate() +{ + return true; +} + +void srec_flash(char *flash_filename) +{ + DRESULT res; + FRESULT fres; + FATFS fs; + FIL file; + err_t err; + void *start_address; + uint32_t length; + + // disk_initialize(0); + res = disk_status(0); + if (res == RES_OK) + { + fres = f_mount(0, &fs); + if (fres == FR_OK) + { + if ((fres = f_open(&file, flash_filename, FA_READ) != FR_OK)) + { + xprintf("flasher file %s not present on disk\r\n", flash_filename); + } + else + { + f_close(&file); + + /* first pass: parse and check for inconsistencies */ + xprintf("check file integrity: "); + err = read_srecords(flash_filename, &start_address, &length, simulate); + if (err == OK) + { + /* next pass: copy data to destination */ + xprintf("OK.\r\ncopy/flash data: "); + err = read_srecords(flash_filename, &start_address, &length, memcpy); + if (err == OK) + { + /* next pass: verify data */ + xprintf("OK.\r\nverify data: "); + err = read_srecords(flash_filename, &start_address, &length, verify); + if (err == OK) + { + xprintf("OK.\r\n"); + typedef void void_func(void); + void_func *func; + xprintf("target successfully written and verified. Start address: %p\r\n", start_address); + + func = start_address; + (*func)(); + } + else + { + xprintf("failed\r\n"); + } + } + else + { + xprintf("failed\r\n"); + } + } + else + { + xprintf("failed\r\n"); + } + } + } + else + { + // xprintf("could not mount FAT FS\r\n"); + } + f_mount(0, 0L); + } + else + { + // xprintf("could not initialize SD card\r\n"); + } +} + +void srec_load(char *flash_filename) +{ + DRESULT res; + FRESULT fres; + FATFS fs; + FIL file; + err_t err; + void *start_address; + uint32_t length; + + // disk_initialize(0); + res = disk_status(0); + if (res == RES_OK) + { + fres = f_mount(0, &fs); + if (fres == FR_OK) + { + if ((fres = f_open(&file, flash_filename, FA_READ) != FR_OK)) + { + xprintf("flasher file %s not present on disk\r\n", flash_filename); + } + else + { + f_close(&file); + + /* first pass: parse and check for inconsistencies */ + xprintf("check file integrity: "); + err = read_srecords(flash_filename, &start_address, &length, simulate); + if (err == OK) + { + /* next pass: copy data to destination */ + xprintf("OK.\r\ncopy/flash data: "); + err = read_srecords(flash_filename, &start_address, &length, memcpy); + if (err == OK) + { + /* next pass: verify data */ + xprintf("OK.\r\nverify data: "); + err = read_srecords(flash_filename, &start_address, &length, verify); + if (err == OK) + { + xprintf("OK.\r\n"); + typedef void void_func(void); + void_func *func; + xprintf("target successfully written and verified. Start address: %p\r\n", start_address); + + func = start_address; + (*func)(); + } + else + { + xprintf("failed\r\n"); + } + } + else + { + xprintf("failed\r\n"); + } + } + else + { + xprintf("failed\r\n"); + } + } + } + else + { + // xprintf("could not mount FAT FS\r\n"); + } + f_mount(0, 0L); + } + else + { + // xprintf("could not initialize SD card\r\n"); + } +} void basflash(void) { + const char *basauto_str = "\\BASAUTO\\"; + const char *bassimu_str = "\\BASSIMU\\"; + xprintf("\r\nHello from BASFLASH.S19!\r\n\r\n"); } diff --git a/BaS_gcc/sources/s19reader.c b/BaS_gcc/sources/s19reader.c index 7dd432a..e0aed3c 100644 --- a/BaS_gcc/sources/s19reader.c +++ b/BaS_gcc/sources/s19reader.c @@ -329,7 +329,7 @@ err_t verify(uint8_t *dst, uint8_t *src, uint32_t length) return OK; } -void flasher_load(char *flasher_filename) +void srec_execute(char *flasher_filename) { DRESULT res; FRESULT fres;