GameBoy Advance Multiboot & Dumper

Dependencies:   SDFileSystem mbed

Committer:
akkera102
Date:
Mon Nov 24 13:28:15 2014 +0000
Revision:
0:66a93ef88e4e
1st;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
akkera102 0:66a93ef88e4e 1 #include "main.h"
akkera102 0:66a93ef88e4e 2 #include "crc.h"
akkera102 0:66a93ef88e4e 3 #include "multiboot.h"
akkera102 0:66a93ef88e4e 4 #include "SDFileSystem.h"
akkera102 0:66a93ef88e4e 5
akkera102 0:66a93ef88e4e 6 static SDFileSystem sd(p11, p12, p13, p8, "sd");
akkera102 0:66a93ef88e4e 7 static Serial pc(USBTX, USBRX);
akkera102 0:66a93ef88e4e 8
akkera102 0:66a93ef88e4e 9 int main(void)
akkera102 0:66a93ef88e4e 10 {
akkera102 0:66a93ef88e4e 11 int ret = MultiBoot("/local/test.gba");
akkera102 0:66a93ef88e4e 12 if(ret == EXIT_FAILURE)
akkera102 0:66a93ef88e4e 13 {
akkera102 0:66a93ef88e4e 14 SystemError("MultiBoot", ret);
akkera102 0:66a93ef88e4e 15 }
akkera102 0:66a93ef88e4e 16
akkera102 0:66a93ef88e4e 17 WaitSPI32(0x0, 0x1234abcd, "Wait for GBA(Calculate dump size)");
akkera102 0:66a93ef88e4e 18
akkera102 0:66a93ef88e4e 19 uint32_t size = WriteSPI32(0x0, "size");
akkera102 0:66a93ef88e4e 20 uint32_t sizeCRC = WriteSPI32(0x0, "sizeCRC");
akkera102 0:66a93ef88e4e 21 uint32_t crc = crcU32(size);
akkera102 0:66a93ef88e4e 22
akkera102 0:66a93ef88e4e 23 if(crc != sizeCRC)
akkera102 0:66a93ef88e4e 24 {
akkera102 0:66a93ef88e4e 25 SystemError("sizeCRC", crc);
akkera102 0:66a93ef88e4e 26 }
akkera102 0:66a93ef88e4e 27 pc.printf("sizeCRC OK!\n");
akkera102 0:66a93ef88e4e 28
akkera102 0:66a93ef88e4e 29 FILE *fp = fopen("/sd/data.bin", "w");
akkera102 0:66a93ef88e4e 30 if(fp == NULL)
akkera102 0:66a93ef88e4e 31 {
akkera102 0:66a93ef88e4e 32 SystemError("Could not open file for write", 0);
akkera102 0:66a93ef88e4e 33 }
akkera102 0:66a93ef88e4e 34
akkera102 0:66a93ef88e4e 35 uint32_t table[256/4];
akkera102 0:66a93ef88e4e 36 uint32_t cnt = 0;
akkera102 0:66a93ef88e4e 37 int i;
akkera102 0:66a93ef88e4e 38
akkera102 0:66a93ef88e4e 39 pc.printf("data sending...(NoDebug)\n");
akkera102 0:66a93ef88e4e 40 crcReset();
akkera102 0:66a93ef88e4e 41
akkera102 0:66a93ef88e4e 42 for(i=0; i<size/4; i++)
akkera102 0:66a93ef88e4e 43 {
akkera102 0:66a93ef88e4e 44 table[cnt] = WriteSPI32NoDebug(0x0);
akkera102 0:66a93ef88e4e 45 crc = crcU32n(table[cnt]);
akkera102 0:66a93ef88e4e 46 cnt++;
akkera102 0:66a93ef88e4e 47
akkera102 0:66a93ef88e4e 48 if(cnt >= 256/4)
akkera102 0:66a93ef88e4e 49 {
akkera102 0:66a93ef88e4e 50 fwrite(&table, sizeof(uint32_t), 256/4, fp);
akkera102 0:66a93ef88e4e 51 cnt = 0;
akkera102 0:66a93ef88e4e 52 }
akkera102 0:66a93ef88e4e 53
akkera102 0:66a93ef88e4e 54 wait_us(100); // GBA too slow...
akkera102 0:66a93ef88e4e 55 }
akkera102 0:66a93ef88e4e 56 fclose(fp);
akkera102 0:66a93ef88e4e 57
akkera102 0:66a93ef88e4e 58 uint32_t dataCRC = WriteSPI32(0x0, "dataCRC");
akkera102 0:66a93ef88e4e 59 if(crc != dataCRC)
akkera102 0:66a93ef88e4e 60 {
akkera102 0:66a93ef88e4e 61 SystemError("dataCRC", crc);
akkera102 0:66a93ef88e4e 62 }
akkera102 0:66a93ef88e4e 63 pc.printf("dataCRC OK!\n");
akkera102 0:66a93ef88e4e 64
akkera102 0:66a93ef88e4e 65
akkera102 0:66a93ef88e4e 66 pc.printf("All done\n");
akkera102 0:66a93ef88e4e 67 for(;;)
akkera102 0:66a93ef88e4e 68 {
akkera102 0:66a93ef88e4e 69 wait(1);
akkera102 0:66a93ef88e4e 70 }
akkera102 0:66a93ef88e4e 71 }
akkera102 0:66a93ef88e4e 72
akkera102 0:66a93ef88e4e 73 void SystemError(char* str, uint32_t hex)
akkera102 0:66a93ef88e4e 74 {
akkera102 0:66a93ef88e4e 75 pc.printf("[Err][0x%x] %s\n", hex, str);
akkera102 0:66a93ef88e4e 76
akkera102 0:66a93ef88e4e 77 for(;;)
akkera102 0:66a93ef88e4e 78 {
akkera102 0:66a93ef88e4e 79 wait(1);
akkera102 0:66a93ef88e4e 80 }
akkera102 0:66a93ef88e4e 81 }
akkera102 0:66a93ef88e4e 82