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
main.cpp@5:f22e2df90a70, 2016-04-09 (annotated)
- 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?
User | Revision | Line number | New 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 |