mbed LPC1114 emulator pre-alpha version
Dependencies: BaseV6M mbed F12RFileSystem F32RFileSystem ROMSLOT SDStorage
Fork of emu812 by
TOYOSHIKI TINY BASIC mbed Edition TTB_mbed_LPC1114.bin save as "LPC1114.IMG" .
Diff: EMU111x.cpp
- Revision:
- 3:5df725af50e0
- Parent:
- 2:b8b4f07d4691
- Child:
- 4:6629544a482e
--- a/EMU111x.cpp Tue Aug 11 06:49:07 2015 +0900 +++ b/EMU111x.cpp Thu Aug 13 07:39:24 2015 +0900 @@ -1,4 +1,4 @@ -// EMU111x.cpp 2015/8/8 +// EMU111x.cpp 2015/8/12 #include "mbed.h" #include "EMU111x.h" #define V6M_LOG_LEVEL 2 @@ -20,42 +20,20 @@ void EMU111x_SYSCON::poke32(uint32_t a, uint32_t d) { switch(a&0xfff) { - case 0x000: - V6M_INFO("P: LPC_SYSCON->SYSMEMREMAP << %08x", d); - break; - case 0x004: - V6M_INFO("P: LPC_SYSCON->PRESETCTRL << %08x", d); - break; - case 0x008: - V6M_INFO("P: LPC_SYSCON->SYSPLLCTRL << %08x", d); - break; - case 0x040: - V6M_INFO("P: LPC_SYSCON->SYSPLLCLKSEL << %08x", d); - break; - case 0x044: - V6M_INFO("P: LPC_SYSCON->SYSPLLCLKUEN << %08x", d); - break; - case 0x070: - V6M_INFO("P: LPC_SYSCON->MAINCLKSEL << %08x", d); - break; - case 0x074: - V6M_INFO("P: LPC_SYSCON->MAINCLKUEN << %08x", d); - break; - case 0x078: - V6M_INFO("P: LPC_SYSCON->SYSAHBCLKDIV << %08x", d); - break; - case 0x080: - V6M_INFO("P: LPC_SYSCON->SYSAHBCLKCTRL << %08x", d); - break; - case 0x094: - V6M_INFO("P: LPC_SYSCON->SSP0CLKDIV << %08x", d); - break; - case 0x098: - V6M_INFO("P: LPC_SYSCON->UARTCLKDIV << %08x", d); - break; - case 0x238: - V6M_INFO("P: LPC_SYSCON->PDRUNCFG << %08x", d); - break; + #define c(OFFSET,NAME) case OFFSET: V6M_INFO("P: LPC_SYSCON->%s << %08x", #NAME, d); break; + c(0x000, SYSMEMREMAP); + c(0x004, PRESETCTRL); + c(0x008, SYSPLLCTRL); + c(0x040, SYSPLLCLKSEL); + c(0x044, SYSPLLCLKUEN); + c(0x070, MAINCLKSEL); + c(0x074, MAINCLKUEN); + c(0x078, SYSAHBCLKDIV); + c(0x080, SYSAHBCLKCTRL); + c(0x094, SSP0CLKDIV); + c(0x098, UARTCLKDIV); + c(0x238, PDRUNCFG); + #undef c default: V6M_WARN("P: LPC_SYSCON %08x << %08x", a, d); break; @@ -65,12 +43,9 @@ uint32_t EMU111x_SYSCON::peek32(uint32_t a) { uint32_t d = 0x00; switch(a&0xfff) { - case 0x000: - V6M_INFO("P: LPC_SYSCON->SYSMEMREMAP >> %08x", a, d); - break; - case 0x004: - V6M_INFO("P: LPC_SYSCON->PRESETCTRL >> %08x", a, d); - break; + #define c(OFFSET,NAME) case OFFSET: V6M_INFO("P: LPC_SYSCON->%s >> %08x", #NAME, d); break; + c(0x000, SYSMEMREMAP); + c(0x004, PRESETCTRL); case 0x00c: d = 0x01; V6M_INFO("P: LPC_SYSCON->SYSPLLSTAT >> %08x", a, d); @@ -83,12 +58,9 @@ d = 0x01; V6M_INFO("P: LPC_SYSCON->MAINCLKUEN >> %08x", a, d); break; - case 0x080: - V6M_INFO("P: LPC_SYSCON->SYSAHBCLKCTRL >> %08x", a, d); - break; - case 0x238: - V6M_INFO("P: LPC_SYSCON->PDRUNCFG >> %08x", d); - break; + c(0x080, SYSAHBCLKCTRL); + c(0x238, PDRUNCFG); + #undef c default: V6M_WARN("P: LPC_SYSCON %08x >> %08x", a, d); break; @@ -100,6 +72,7 @@ PIO0_4 = 0xd0; PIO0_5 = 0xd0; PIO0_6 = 0xd0; + PIO0_7 = 0xd0; PIO0_8 = 0xd0; PIO0_9 = 0xd0; R_PIO0_11 = 0xd0; @@ -112,6 +85,7 @@ c(0x30, PIO0_4); c(0x34, PIO0_5); c(0x4c, PIO0_6); + c(0x50, PIO0_7); c(0x60, PIO0_8); c(0x64, PIO0_9); c(0x74, R_PIO0_11); @@ -131,6 +105,7 @@ c(0x30, PIO0_4); c(0x34, PIO0_5); c(0x4c, PIO0_6); + c(0x50, PIO0_7); c(0x60, PIO0_8); c(0x64, PIO0_9); c(0x74, R_PIO0_11); @@ -182,21 +157,20 @@ uint32_t EMU111x_GPIO::peek32(uint32_t a) { uint32_t d = 0x00; - uint32_t mask; - int pin; + if ((a&0xffff) < 0x3ffc) { + uint32_t mask = (a>>2)&0xfff; + int pin = pinpos(mask); + if (dir & mask) { // output + d = data & mask; + } else { // input + if (mcu.DigitalRead_Callback(port, pin)) { + d = mask; + } + } + V6M_INFO("P: LPC_GPIO%d->MASKED_ACCESS[%03x] >> %08x", port, mask, d); + return d; + } switch(a&0xffff) { - case 0x0080: - mask = (a>>2)&0xfff; - pin = pinpos(mask); - if (dir & mask) { // output - d = data & mask; - } else { // input - if (mcu.DigitalRead_Callback(port, pin)) { - d = mask; - } - } - V6M_WARN("P: LPC_GPIO%d->MASKED_ACCESS[%03x] >> %08x", port, mask, d); - break; case 0x3ffc: d = data; V6M_INFO("P: LPC_GPIO%d->DATA >> %08x", port, d); @@ -332,7 +306,7 @@ i2c_addr = d & 0xff; i2c_pos = 0; if (i2c_addr & 0x01) { - i2c_size = mcu.I2CRead_Callback(i2c_addr, i2c_data, sizeof(i2c_data)); + mcu.I2CRead_Callback(i2c_addr, i2c_data, sizeof(i2c_data)); stat = 0x40; i2c_pos = 0; } else { @@ -373,10 +347,10 @@ V6M_INFO("P: LPC_I2C->STAT >> %08x", d); break; case 0x08: - if (i2c_pos < i2c_size) { + if (i2c_pos < sizeof(i2c_data)) { d = i2c_data[i2c_pos++]; } - if (i2c_pos < i2c_size) { + if (i2c_pos < sizeof(i2c_data)) { stat = 0x50; } else { stat = 0x58; @@ -456,7 +430,7 @@ } } -EMU111x::EMU111x():tmr32b1(1),uart(*this),i2c(*this),spi0(*this,0),spi1(*this,1),gpio0(*this,0),gpio1(*this,1) { +EMU111x::EMU111x():tmr32b1(1),_uart(*this),_i2c(*this),_spi0(*this,0),_spi1(*this,1),gpio0(*this,0),gpio1(*this,1) { flash = NULL; rom = NULL; ram = new uint8_t[EMU111x_RAM_SIZE]; @@ -474,13 +448,13 @@ break; case EMU111x_APB_BASE>>24: switch((a>>12)&0xff) { - case 0x00: i2c.poke32(a, d); break; - case 0x08: uart.poke32(a, d); break; + case 0x00: _i2c.poke32(a, d); break; + case 0x08: _uart.poke32(a, d); break; case 0x18: tmr32b1.poke32(a, d); break; - case 0x40: spi0.poke32(a, d); break; + case 0x40: _spi0.poke32(a, d); break; case 0x44: iocon.poke32(a, d); break; case 0x48: syscon.poke32(a, d); break; - case 0x58: spi1.poke32(a, d); break; + case 0x58: _spi1.poke32(a, d); break; default: V6M_WARN("P: %08x << %08x", a, d); break; @@ -540,13 +514,13 @@ break; case EMU111x_APB_BASE>>24: switch((a>>12)&0xff) { - case 0x00: d = i2c.peek32(a); break; - case 0x08: d = uart.peek32(a); break; + case 0x00: d = _i2c.peek32(a); break; + case 0x08: d = _uart.peek32(a); break; case 0x18: d = tmr32b1.peek32(a); break; - case 0x40: d = spi0.peek32(a); break; + case 0x40: d = _spi0.peek32(a); break; case 0x44: d = iocon.peek32(a); break; case 0x48: d = syscon.peek32(a); break; - case 0x58: d = spi1.peek32(a); break; + case 0x58: d = _spi1.peek32(a); break; default: V6M_WARN("P: %08x >> %08x", a, d); break;