GameBoy Advance Multiboot & Dumper

Dependencies:   SDFileSystem mbed

main.cpp

Committer:
akkera102
Date:
2014-11-24
Revision:
0:66a93ef88e4e

File content as of revision 0:66a93ef88e4e:

#include "main.h"
#include "crc.h"
#include "multiboot.h"
#include "SDFileSystem.h"

static SDFileSystem sd(p11, p12, p13, p8, "sd");
static Serial pc(USBTX, USBRX);
 
int main(void)
{
    int ret = MultiBoot("/local/test.gba");
    if(ret == EXIT_FAILURE)
    {
        SystemError("MultiBoot", ret);
    }

    WaitSPI32(0x0, 0x1234abcd, "Wait for GBA(Calculate dump size)");

    uint32_t size    = WriteSPI32(0x0, "size");
    uint32_t sizeCRC = WriteSPI32(0x0, "sizeCRC");
    uint32_t crc     = crcU32(size);

    if(crc != sizeCRC)
    {
        SystemError("sizeCRC", crc);
    }
    pc.printf("sizeCRC OK!\n");

    FILE *fp = fopen("/sd/data.bin", "w");
    if(fp == NULL)
    {
        SystemError("Could not open file for write", 0);
    }

    uint32_t table[256/4];
    uint32_t cnt = 0;
    int i;

    pc.printf("data sending...(NoDebug)\n");
    crcReset();

    for(i=0; i<size/4; i++)
    {
        table[cnt] = WriteSPI32NoDebug(0x0);
        crc = crcU32n(table[cnt]);
        cnt++;

        if(cnt >= 256/4)
        {
            fwrite(&table, sizeof(uint32_t), 256/4, fp);
            cnt = 0;
        }

        wait_us(100);   // GBA too slow...
    }
    fclose(fp);

    uint32_t dataCRC = WriteSPI32(0x0, "dataCRC");
    if(crc != dataCRC)
    {
        SystemError("dataCRC", crc);
    }
    pc.printf("dataCRC OK!\n");


    pc.printf("All done\n");
    for(;;)
    {
        wait(1);
    }
}

void SystemError(char* str, uint32_t hex)
{
    pc.printf("[Err][0x%x] %s\n", hex, str);

    for(;;)
    {
        wait(1);
    }
}