GameBoy Advance Multiboot & Dumper
Dependencies: SDFileSystem mbed
main.cpp@0:66a93ef88e4e, 2014-11-24 (annotated)
- Committer:
- akkera102
- Date:
- Mon Nov 24 13:28:15 2014 +0000
- Revision:
- 0:66a93ef88e4e
1st;
Who changed what in which revision?
User | Revision | Line number | New 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 |