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

Committer:
va009039
Date:
Sat Apr 09 07:59:56 2016 +0000
Revision:
5:f22e2df90a70
Parent:
4:94d28a7b4363
add Nucleo-L152RE.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
va009039 4:94d28a7b4363 1 // emu812/main.cpp 2016/4/9
va009039 4:94d28a7b4363 2 #if defined(TARGET_LPC1768)
va009039 1:913dfd59e25a 3 #include "EMU81x.h"
va009039 4:94d28a7b4363 4 #include "SDStorage.h"
va009039 4:94d28a7b4363 5 #include "F32RFileSystem.h"
va009039 4:94d28a7b4363 6 #include "ROMSLOT.h"
va009039 0:e38daa7b1a22 7
va009039 2:3f3637d7c2bc 8 DigitalOut led1(LED1),led2(LED2),led3(LED3);
va009039 2:3f3637d7c2bc 9 RawSerial pc(MBED_UARTUSB);
va009039 2:3f3637d7c2bc 10 RawSerial uart1(MBED_UART0); // p9,p10
va009039 2:3f3637d7c2bc 11 I2C i2c(MBED_I2C0); // p28,p27
va009039 4:94d28a7b4363 12 #if defined(USE_SD)
va009039 4:94d28a7b4363 13 SDStorage storage(MBED_SPI0);
va009039 4:94d28a7b4363 14 F32RFileSystem local(&storage, "local");
va009039 4:94d28a7b4363 15 #else
va009039 1:913dfd59e25a 16 LocalFileSystem local("local");
va009039 4:94d28a7b4363 17 #endif
va009039 4:94d28a7b4363 18 ROMSLOT slot;
va009039 0:e38daa7b1a22 19
va009039 1:913dfd59e25a 20 class MyEMU812 : public EMU81x {
va009039 1:913dfd59e25a 21 virtual void DigitalWrite_Callback(int port, int pin, int value) {
va009039 2:3f3637d7c2bc 22 switch(pin) {
va009039 2:3f3637d7c2bc 23 case 16: led1 = value; break; // PIO0_16 LED_BLUE
va009039 2:3f3637d7c2bc 24 case 17: led2 = value; break; // PIO0_17 LED_GREEN
va009039 2:3f3637d7c2bc 25 case 7: led3 = value; break; // PIO0_7 LED_RED
va009039 1:913dfd59e25a 26 }
va009039 1:913dfd59e25a 27 }
va009039 1:913dfd59e25a 28 virtual void SerialPutc_Callback(int ch, uint8_t c) {
va009039 2:3f3637d7c2bc 29 switch(ch) {
va009039 2:3f3637d7c2bc 30 case 0: pc.putc(c); break;
va009039 2:3f3637d7c2bc 31 case 1: uart1.putc(c); break;
va009039 2:3f3637d7c2bc 32 }
va009039 2:3f3637d7c2bc 33 }
va009039 2:3f3637d7c2bc 34 virtual int SerialGetc_Callback(int ch) {
va009039 2:3f3637d7c2bc 35 switch(ch) {
va009039 2:3f3637d7c2bc 36 case 0: return pc.getc();
va009039 2:3f3637d7c2bc 37 case 1: return uart1.getc();
va009039 2:3f3637d7c2bc 38 }
va009039 2:3f3637d7c2bc 39 return -1;
va009039 2:3f3637d7c2bc 40 }
va009039 2:3f3637d7c2bc 41 virtual int SerialReadable_Callback(int ch) {
va009039 2:3f3637d7c2bc 42 switch(ch) {
va009039 2:3f3637d7c2bc 43 case 0: return pc.readable();
va009039 2:3f3637d7c2bc 44 case 1: return uart1.readable();
va009039 2:3f3637d7c2bc 45 }
va009039 2:3f3637d7c2bc 46 return 0;
va009039 2:3f3637d7c2bc 47 }
va009039 2:3f3637d7c2bc 48 virtual int I2CWrite_Callback(uint8_t addr, const uint8_t* data, int size) {
va009039 2:3f3637d7c2bc 49 return i2c.write(addr, (char*)data, size);
va009039 2:3f3637d7c2bc 50 }
va009039 2:3f3637d7c2bc 51 virtual int I2CRead_Callback(uint8_t addr, uint8_t* data, int size) {
va009039 2:3f3637d7c2bc 52 return i2c.read(addr, (char*)data, size);
va009039 1:913dfd59e25a 53 }
va009039 1:913dfd59e25a 54 };
va009039 1:913dfd59e25a 55
va009039 4:94d28a7b4363 56 uint8_t* load(size_t limit, const char* filename) {
va009039 4:94d28a7b4363 57 pc.printf("loading[%s]", filename);
va009039 0:e38daa7b1a22 58 FileHandle* fh = local.open(filename, O_RDONLY);
va009039 2:3f3637d7c2bc 59 MBED_ASSERT(fh);
va009039 4:94d28a7b4363 60 uint32_t addr = slot.New(limit);
va009039 4:94d28a7b4363 61 for(size_t n = 0; n <= limit;) {
va009039 4:94d28a7b4363 62 uint8_t buf[256];
va009039 4:94d28a7b4363 63 size_t r = fh->read(buf, sizeof(buf));
va009039 4:94d28a7b4363 64 if (r == 0) {
va009039 4:94d28a7b4363 65 pc.printf(" %u bytes\n", n);
va009039 4:94d28a7b4363 66 break;
va009039 4:94d28a7b4363 67 }
va009039 4:94d28a7b4363 68 slot.Write(addr + n, (const uint8_t*)buf, sizeof(buf));
va009039 4:94d28a7b4363 69 n += r;
va009039 4:94d28a7b4363 70 pc.putc('.');
va009039 4:94d28a7b4363 71 }
va009039 0:e38daa7b1a22 72 fh->close();
va009039 4:94d28a7b4363 73 return (uint8_t*)addr;
va009039 0:e38daa7b1a22 74 }
va009039 1:913dfd59e25a 75
va009039 0:e38daa7b1a22 76 int main() {
va009039 0:e38daa7b1a22 77 pc.baud(115200);
va009039 4:94d28a7b4363 78 pc.puts("mbed LPC812 emulator pre-alpha version 0.01\n");
va009039 1:913dfd59e25a 79
va009039 1:913dfd59e25a 80 MyEMU812 mcu;
va009039 4:94d28a7b4363 81 mcu.assign_flash(load(0x4000, "LPC812.IMG"));
va009039 4:94d28a7b4363 82 mcu.assign_rom(load(0x2000, "LPC812.ROM"));
va009039 1:913dfd59e25a 83
va009039 1:913dfd59e25a 84 mcu.reset();
va009039 1:913dfd59e25a 85 for(;;) {
va009039 1:913dfd59e25a 86 mcu.run(100);
va009039 2:3f3637d7c2bc 87 mcu.clock_in(10000);
va009039 0:e38daa7b1a22 88 }
va009039 1:913dfd59e25a 89 /* NOTREACHED */
va009039 0:e38daa7b1a22 90 }
va009039 4:94d28a7b4363 91 #endif // TARGET_LPC1768