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_L152RE.cpp
- Revision:
- 4:94d28a7b4363
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main_L152RE.cpp Sat Apr 09 16:37:45 2016 +0900 @@ -0,0 +1,88 @@ +// emu812/main_L152RE.cpp 2016/4/9 +#if defined(TARGET_NUCLEO_L152RE) +#include "EMU81x.h" +#include "SDStorage.h" +#include "F32RFileSystem.h" +#include "ROMSLOT.h" + +DigitalOut led1(D3),led2(D2),led3(D5); +RawSerial pc(USBTX,USBRX); +RawSerial uart1(PC_10,PC_11); +I2C i2c(D14, D15); +SDStorage storage(D11, D12, D13, D4); // mosi, miso, sclk, cs +F32RFileSystem local(&storage, "local"); +ROMSLOT slot; + +class MyEMU812 : public EMU81x { + virtual void DigitalWrite_Callback(int port, int pin, int 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) { + 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); + } +}; + +uint8_t* load(size_t limit, const char* filename) { + pc.printf("loading[%s]", filename); + FileHandle* fh = local.open(filename, O_RDONLY); + MBED_ASSERT(fh); + uint32_t addr = slot.New(limit); + for(size_t n = 0; n <= limit;) { + uint8_t buf[256]; + size_t r = fh->read(buf, sizeof(buf)); + if (r == 0) { + pc.printf(" %u bytes\n", n); + break; + } + slot.Write(addr + n, (const uint8_t*)buf, sizeof(buf)); + n += r; + pc.putc('.'); + } + fh->close(); + return (uint8_t*)addr; +} + +int main() { + pc.baud(115200); + pc.puts("mbed LPC812 emulator pre-alpha version 0.01\n"); + + MyEMU812 mcu; + mcu.assign_flash(load(0x4000, "LPC812.IMG")); + mcu.assign_rom(load(0x2000, "LPC812.ROM")); + + mcu.reset(); + for(;;) { + mcu.run(100); + mcu.clock_in(10000); + } + /* NOTREACHED */ +} +#endif // TARGET_NUCLEO_L152RE +