mbed LPC812 emulator pre-alpha version
Dependencies: BaseV6M mbed F12RFileSystem F32RFileSystem ROMSLOT SDStorage
Example
TTB_mbed_LPC812.bin save as "LPC812.IMG" .
internal boot rom image(0x1fff0000-0x1fff1fff) save as "LPC812.ROM".
Tested programs
- TTB_mbed - TOYOSHIKI TINY BASIC mbed Edition
- mbed_blinky - LED1 blinky
Diff: main.cpp
- Revision:
- 2:3f3637d7c2bc
- Parent:
- 1:913dfd59e25a
- Child:
- 3:ab1c7a09dfb6
--- a/main.cpp Mon Aug 10 22:52:48 2015 +0900 +++ b/main.cpp Wed Aug 12 20:31:34 2015 +0900 @@ -1,36 +1,59 @@ -// main.cpp 2015/8/10 +// main.cpp 2015/8/12 #include "EMU81x.h" -#include "mbed_blinky_LPC812_bin.h" -DigitalOut led1(LED1); -RawSerial pc(USBTX,USBRX); +DigitalOut led1(LED1),led2(LED2),led3(LED3); +RawSerial pc(MBED_UARTUSB); +RawSerial uart1(MBED_UART0); // p9,p10 +I2C i2c(MBED_I2C0); // p28,p27 LocalFileSystem local("local"); -uint8_t flash[1024*16] __attribute__((section("AHBSRAM0"))); -uint8_t rom[1024*8] __attribute__((section("AHBSRAM1"))); +uint8_t* flash = (uint8_t*)0x2007c000; // AHBSRAM0 +uint8_t* rom = (uint8_t*)0x20080000; // AHBSRAM1 class MyEMU812 : public EMU81x { virtual void DigitalWrite_Callback(int port, int pin, int value) { - if (pin == 16) { // PIO0_16 - led1 = value; + switch(pin) { + case 16: led1 = value; break; // PIO0_16 LED_BLUE + case 17: led2 = value; break; // PIO0_17 LED_GREEN + case 7: led3 = value; break; // PIO0_7 LED_RED } } virtual void SerialPutc_Callback(int ch, uint8_t c) { - pc.putc(c); + switch(ch) { + case 0: pc.putc(c); break; + case 1: uart1.putc(c); break; + } + } + virtual int SerialGetc_Callback(int ch) { + switch(ch) { + case 0: return pc.getc(); + case 1: return uart1.getc(); + } + return -1; + } + virtual int SerialReadable_Callback(int ch) { + switch(ch) { + case 0: return pc.readable(); + case 1: return uart1.readable(); + } + return 0; + } + virtual int I2CWrite_Callback(uint8_t addr, const uint8_t* data, int size) { + return i2c.write(addr, (char*)data, size); + } + virtual int I2CRead_Callback(uint8_t addr, uint8_t* data, int size) { + return i2c.read(addr, (char*)data, size); } }; -int load(uint8_t* buf, int size, const char* filename) { +uint8_t* load(uint8_t* buf, int size, const char* filename) { pc.printf("loading[%s]... ", filename); FileHandle* fh = local.open(filename, O_RDONLY); - if (fh == NULL) { - pc.printf("fail\n"); - return -1; - } + MBED_ASSERT(fh); int n = fh->read(buf, size); + pc.printf("%d bytes\n", n); fh->close(); - pc.printf("%d bytes\n", n); - return n; + return buf; } int main() { @@ -38,18 +61,13 @@ pc.puts("LPC812 emulator\n"); MyEMU812 mcu; - mcu.assign_flash(mbed_blinky_LPC812_bin); - - if (load(flash, sizeof(flash), "LPC812.IMG") >= 0) { - load(rom, sizeof(rom), "LPC812.ROM"); - mcu.assign_flash(flash); - mcu.assign_rom(rom); - } + mcu.assign_flash(load(flash, 16*1024, "LPC812.IMG")); + mcu.assign_rom(load(rom, 8*1024, "LPC812.ROM")); mcu.reset(); for(;;) { mcu.run(100); - mcu.clock_in(20000); + mcu.clock_in(10000); } /* NOTREACHED */ }