mbed LPC812 emulator pre-alpha version

Dependencies:   BaseV6M mbed F12RFileSystem F32RFileSystem ROMSLOT SDStorage

320 340

Example

TTB_mbed_LPC812.bin save as "LPC812.IMG" .
internal boot rom image(0x1fff0000-0x1fff1fff) save as "LPC812.ROM".

Tested programs

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 */
 }