mbed LPC1114 emulator pre-alpha version

Dependencies:   BaseV6M mbed F12RFileSystem F32RFileSystem ROMSLOT SDStorage

Fork of emu812 by Norimasa Okamoto

480
TOYOSHIKI TINY BASIC mbed Edition TTB_mbed_LPC1114.bin save as "LPC1114.IMG" .

Committer:
va009039
Date:
Thu Aug 13 07:39:24 2015 +0900
Revision:
3:5df725af50e0
Parent:
2:b8b4f07d4691
Child:
4:6629544a482e
add  LED2

Who changed what in which revision?

UserRevisionLine numberNew contents of line
va009039 3:5df725af50e0 1 // EMU111x.cpp 2015/8/12
va009039 2:b8b4f07d4691 2 #include "mbed.h"
va009039 2:b8b4f07d4691 3 #include "EMU111x.h"
va009039 2:b8b4f07d4691 4 #define V6M_LOG_LEVEL 2
va009039 2:b8b4f07d4691 5 #include "v6m_log.h"
va009039 2:b8b4f07d4691 6
va009039 2:b8b4f07d4691 7 const int EMU111x_RAM_SIZE = (1024*4);
va009039 2:b8b4f07d4691 8 const int EMU111x_FLASH_SIZE = (1024*32);
va009039 2:b8b4f07d4691 9 const int EMU111x_ROM_SIZE = (1024*16);
va009039 2:b8b4f07d4691 10
va009039 2:b8b4f07d4691 11 const uint32_t EMU111x_FLASH_BASE = 0x00000000;
va009039 2:b8b4f07d4691 12 const uint32_t EMU111x_RAM_BASE = 0x10000000;
va009039 2:b8b4f07d4691 13 const uint32_t EMU111x_ROM_BASE = 0x1fff0000;
va009039 2:b8b4f07d4691 14 const uint32_t EMU111x_APB_BASE = 0x40000000;
va009039 2:b8b4f07d4691 15 const uint32_t EMU111x_AHB_BASE = 0x50000000;
va009039 2:b8b4f07d4691 16 const uint32_t EMU111x_SCS_BASE = 0xe000e000;
va009039 2:b8b4f07d4691 17
va009039 2:b8b4f07d4691 18 EMU111x_SYSCON::EMU111x_SYSCON() {
va009039 2:b8b4f07d4691 19 }
va009039 2:b8b4f07d4691 20
va009039 2:b8b4f07d4691 21 void EMU111x_SYSCON::poke32(uint32_t a, uint32_t d) {
va009039 2:b8b4f07d4691 22 switch(a&0xfff) {
va009039 3:5df725af50e0 23 #define c(OFFSET,NAME) case OFFSET: V6M_INFO("P: LPC_SYSCON->%s << %08x", #NAME, d); break;
va009039 3:5df725af50e0 24 c(0x000, SYSMEMREMAP);
va009039 3:5df725af50e0 25 c(0x004, PRESETCTRL);
va009039 3:5df725af50e0 26 c(0x008, SYSPLLCTRL);
va009039 3:5df725af50e0 27 c(0x040, SYSPLLCLKSEL);
va009039 3:5df725af50e0 28 c(0x044, SYSPLLCLKUEN);
va009039 3:5df725af50e0 29 c(0x070, MAINCLKSEL);
va009039 3:5df725af50e0 30 c(0x074, MAINCLKUEN);
va009039 3:5df725af50e0 31 c(0x078, SYSAHBCLKDIV);
va009039 3:5df725af50e0 32 c(0x080, SYSAHBCLKCTRL);
va009039 3:5df725af50e0 33 c(0x094, SSP0CLKDIV);
va009039 3:5df725af50e0 34 c(0x098, UARTCLKDIV);
va009039 3:5df725af50e0 35 c(0x238, PDRUNCFG);
va009039 3:5df725af50e0 36 #undef c
va009039 2:b8b4f07d4691 37 default:
va009039 2:b8b4f07d4691 38 V6M_WARN("P: LPC_SYSCON %08x << %08x", a, d);
va009039 2:b8b4f07d4691 39 break;
va009039 2:b8b4f07d4691 40 }
va009039 2:b8b4f07d4691 41 }
va009039 2:b8b4f07d4691 42
va009039 2:b8b4f07d4691 43 uint32_t EMU111x_SYSCON::peek32(uint32_t a) {
va009039 2:b8b4f07d4691 44 uint32_t d = 0x00;
va009039 2:b8b4f07d4691 45 switch(a&0xfff) {
va009039 3:5df725af50e0 46 #define c(OFFSET,NAME) case OFFSET: V6M_INFO("P: LPC_SYSCON->%s >> %08x", #NAME, d); break;
va009039 3:5df725af50e0 47 c(0x000, SYSMEMREMAP);
va009039 3:5df725af50e0 48 c(0x004, PRESETCTRL);
va009039 2:b8b4f07d4691 49 case 0x00c:
va009039 2:b8b4f07d4691 50 d = 0x01;
va009039 2:b8b4f07d4691 51 V6M_INFO("P: LPC_SYSCON->SYSPLLSTAT >> %08x", a, d);
va009039 2:b8b4f07d4691 52 break;
va009039 2:b8b4f07d4691 53 case 0x044:
va009039 2:b8b4f07d4691 54 d = 0x01;
va009039 2:b8b4f07d4691 55 V6M_INFO("P: LPC_SYSCON->SYSPLLCLKUEN >> %08x", a, d);
va009039 2:b8b4f07d4691 56 break;
va009039 2:b8b4f07d4691 57 case 0x074:
va009039 2:b8b4f07d4691 58 d = 0x01;
va009039 2:b8b4f07d4691 59 V6M_INFO("P: LPC_SYSCON->MAINCLKUEN >> %08x", a, d);
va009039 2:b8b4f07d4691 60 break;
va009039 3:5df725af50e0 61 c(0x080, SYSAHBCLKCTRL);
va009039 3:5df725af50e0 62 c(0x238, PDRUNCFG);
va009039 3:5df725af50e0 63 #undef c
va009039 2:b8b4f07d4691 64 default:
va009039 2:b8b4f07d4691 65 V6M_WARN("P: LPC_SYSCON %08x >> %08x", a, d);
va009039 2:b8b4f07d4691 66 break;
va009039 2:b8b4f07d4691 67 }
va009039 2:b8b4f07d4691 68 return d;
va009039 2:b8b4f07d4691 69 }
va009039 2:b8b4f07d4691 70
va009039 2:b8b4f07d4691 71 EMU111x_IOCON::EMU111x_IOCON() {
va009039 2:b8b4f07d4691 72 PIO0_4 = 0xd0;
va009039 2:b8b4f07d4691 73 PIO0_5 = 0xd0;
va009039 2:b8b4f07d4691 74 PIO0_6 = 0xd0;
va009039 3:5df725af50e0 75 PIO0_7 = 0xd0;
va009039 2:b8b4f07d4691 76 PIO0_8 = 0xd0;
va009039 2:b8b4f07d4691 77 PIO0_9 = 0xd0;
va009039 2:b8b4f07d4691 78 R_PIO0_11 = 0xd0;
va009039 2:b8b4f07d4691 79 SCK_LOC = 0x00;
va009039 2:b8b4f07d4691 80 }
va009039 2:b8b4f07d4691 81
va009039 2:b8b4f07d4691 82 void EMU111x_IOCON::poke32(uint32_t a, uint32_t d) {
va009039 2:b8b4f07d4691 83 switch(a&0xff) {
va009039 2:b8b4f07d4691 84 #define c(V,PIN) case V: PIN = d; V6M_INFO("P: LPC_IOCON->%s << %08x", #PIN, d); break;
va009039 2:b8b4f07d4691 85 c(0x30, PIO0_4);
va009039 2:b8b4f07d4691 86 c(0x34, PIO0_5);
va009039 2:b8b4f07d4691 87 c(0x4c, PIO0_6);
va009039 3:5df725af50e0 88 c(0x50, PIO0_7);
va009039 2:b8b4f07d4691 89 c(0x60, PIO0_8);
va009039 2:b8b4f07d4691 90 c(0x64, PIO0_9);
va009039 2:b8b4f07d4691 91 c(0x74, R_PIO0_11);
va009039 2:b8b4f07d4691 92 c(0xa0, PIO1_5);
va009039 2:b8b4f07d4691 93 c(0xa4, PIO1_6);
va009039 2:b8b4f07d4691 94 c(0xa8, PIO1_7);
va009039 2:b8b4f07d4691 95 c(0xb0, SCK_LOC);
va009039 2:b8b4f07d4691 96 #undef c
va009039 2:b8b4f07d4691 97 default: V6M_WARN("P: LPC_IOCON %08x << %08x", a, d); break;
va009039 2:b8b4f07d4691 98 }
va009039 2:b8b4f07d4691 99 }
va009039 2:b8b4f07d4691 100
va009039 2:b8b4f07d4691 101 uint32_t EMU111x_IOCON::peek32(uint32_t a) {
va009039 2:b8b4f07d4691 102 uint32_t d = 0x00;
va009039 2:b8b4f07d4691 103 switch(a&0xff) {
va009039 2:b8b4f07d4691 104 #define c(V,PIN) case V: d = PIN; V6M_INFO("P: LPC_IOCON->%s >> %08x", #PIN, d); break;
va009039 2:b8b4f07d4691 105 c(0x30, PIO0_4);
va009039 2:b8b4f07d4691 106 c(0x34, PIO0_5);
va009039 2:b8b4f07d4691 107 c(0x4c, PIO0_6);
va009039 3:5df725af50e0 108 c(0x50, PIO0_7);
va009039 2:b8b4f07d4691 109 c(0x60, PIO0_8);
va009039 2:b8b4f07d4691 110 c(0x64, PIO0_9);
va009039 2:b8b4f07d4691 111 c(0x74, R_PIO0_11);
va009039 2:b8b4f07d4691 112 c(0xa0, PIO1_5);
va009039 2:b8b4f07d4691 113 c(0xa4, PIO1_6);
va009039 2:b8b4f07d4691 114 c(0xa8, PIO1_7);
va009039 2:b8b4f07d4691 115 c(0xb0, SCK_LOC);
va009039 2:b8b4f07d4691 116 #undef c
va009039 2:b8b4f07d4691 117 default: V6M_WARN("P: LPC_IOCON %08x >> %08x", a, d); break;
va009039 2:b8b4f07d4691 118 }
va009039 2:b8b4f07d4691 119 return d;
va009039 2:b8b4f07d4691 120 }
va009039 2:b8b4f07d4691 121
va009039 2:b8b4f07d4691 122 EMU111x_GPIO::EMU111x_GPIO(EMU111x& mcu_, int port_):mcu(mcu_),port(port_) {
va009039 2:b8b4f07d4691 123 data = 0x00;
va009039 2:b8b4f07d4691 124 dir = 0x00;
va009039 2:b8b4f07d4691 125 }
va009039 2:b8b4f07d4691 126
va009039 2:b8b4f07d4691 127 void EMU111x_GPIO::poke32(uint32_t a, uint32_t d) {
va009039 2:b8b4f07d4691 128 switch(a&0xffff) {
va009039 2:b8b4f07d4691 129 case 0x3ffc:
va009039 2:b8b4f07d4691 130 data = d;
va009039 2:b8b4f07d4691 131 for(int pin = 0; pin < 12; pin++) {
va009039 2:b8b4f07d4691 132 uint32_t mask = 1UL<<pin;
va009039 2:b8b4f07d4691 133 if (dir & mask) { // output
va009039 2:b8b4f07d4691 134 mcu.DigitalWrite_Callback(port, pin, (d&mask) ? 1 : 0);
va009039 2:b8b4f07d4691 135 }
va009039 2:b8b4f07d4691 136 }
va009039 2:b8b4f07d4691 137 V6M_INFO("P: LPC_GPIO%d->DATA %08x << %08x", port, a, d);
va009039 2:b8b4f07d4691 138 break;
va009039 2:b8b4f07d4691 139 case 0x8000:
va009039 2:b8b4f07d4691 140 dir = d;
va009039 2:b8b4f07d4691 141 V6M_INFO("P: LPC_GPIO%d->DIR << %08x", port, d);
va009039 2:b8b4f07d4691 142 break;
va009039 2:b8b4f07d4691 143 default:
va009039 2:b8b4f07d4691 144 V6M_WARN("P: LPC_GPIO%d %08x << %08x", port, a, d);
va009039 2:b8b4f07d4691 145 break;
va009039 2:b8b4f07d4691 146 }
va009039 2:b8b4f07d4691 147 }
va009039 2:b8b4f07d4691 148
va009039 2:b8b4f07d4691 149 static int pinpos(uint32_t data) {
va009039 2:b8b4f07d4691 150 for(int pin = 0; pin < 12; pin++) {
va009039 2:b8b4f07d4691 151 if (data & (1UL<<pin)) {
va009039 2:b8b4f07d4691 152 return pin;
va009039 2:b8b4f07d4691 153 }
va009039 2:b8b4f07d4691 154 }
va009039 2:b8b4f07d4691 155 return 0;
va009039 2:b8b4f07d4691 156 }
va009039 2:b8b4f07d4691 157
va009039 2:b8b4f07d4691 158 uint32_t EMU111x_GPIO::peek32(uint32_t a) {
va009039 2:b8b4f07d4691 159 uint32_t d = 0x00;
va009039 3:5df725af50e0 160 if ((a&0xffff) < 0x3ffc) {
va009039 3:5df725af50e0 161 uint32_t mask = (a>>2)&0xfff;
va009039 3:5df725af50e0 162 int pin = pinpos(mask);
va009039 3:5df725af50e0 163 if (dir & mask) { // output
va009039 3:5df725af50e0 164 d = data & mask;
va009039 3:5df725af50e0 165 } else { // input
va009039 3:5df725af50e0 166 if (mcu.DigitalRead_Callback(port, pin)) {
va009039 3:5df725af50e0 167 d = mask;
va009039 3:5df725af50e0 168 }
va009039 3:5df725af50e0 169 }
va009039 3:5df725af50e0 170 V6M_INFO("P: LPC_GPIO%d->MASKED_ACCESS[%03x] >> %08x", port, mask, d);
va009039 3:5df725af50e0 171 return d;
va009039 3:5df725af50e0 172 }
va009039 2:b8b4f07d4691 173 switch(a&0xffff) {
va009039 2:b8b4f07d4691 174 case 0x3ffc:
va009039 2:b8b4f07d4691 175 d = data;
va009039 2:b8b4f07d4691 176 V6M_INFO("P: LPC_GPIO%d->DATA >> %08x", port, d);
va009039 2:b8b4f07d4691 177 break;
va009039 2:b8b4f07d4691 178 case 0x8000:
va009039 2:b8b4f07d4691 179 d = dir;
va009039 2:b8b4f07d4691 180 V6M_INFO("P: LPC_GPIO%d->DIR >> %08x", port, d);
va009039 2:b8b4f07d4691 181 break;
va009039 2:b8b4f07d4691 182 default:
va009039 2:b8b4f07d4691 183 V6M_WARN("P: LPC_GPIO%d %08x >> %08x", port, a, d);
va009039 2:b8b4f07d4691 184 break;
va009039 2:b8b4f07d4691 185 }
va009039 2:b8b4f07d4691 186 return d;
va009039 2:b8b4f07d4691 187 }
va009039 2:b8b4f07d4691 188
va009039 2:b8b4f07d4691 189 EMU111x_TMR32B::EMU111x_TMR32B(int ch_):ch(ch_) {
va009039 2:b8b4f07d4691 190 V6M_ASSERT(ch == 0 || ch == 1);
va009039 2:b8b4f07d4691 191 tc = 0;
va009039 2:b8b4f07d4691 192 }
va009039 2:b8b4f07d4691 193
va009039 2:b8b4f07d4691 194 void EMU111x_TMR32B::clock_in(uint32_t n) {
va009039 2:b8b4f07d4691 195 V6M_ASSERT(n != 0);
va009039 2:b8b4f07d4691 196 tc += n;
va009039 2:b8b4f07d4691 197 }
va009039 2:b8b4f07d4691 198
va009039 2:b8b4f07d4691 199 void EMU111x_TMR32B::poke32(uint32_t a, uint32_t d) {
va009039 2:b8b4f07d4691 200 switch(a&0xff) {
va009039 2:b8b4f07d4691 201 case 0x04:
va009039 2:b8b4f07d4691 202 V6M_INFO("P: LPC_TMR32B->TCR << %08x", d);
va009039 2:b8b4f07d4691 203 break;
va009039 2:b8b4f07d4691 204 case 0x0c:
va009039 2:b8b4f07d4691 205 V6M_INFO("P: LPC_TMR32B->PR << %08x", d);
va009039 2:b8b4f07d4691 206 break;
va009039 2:b8b4f07d4691 207 default:
va009039 2:b8b4f07d4691 208 V6M_WARN("P: LPC_TMR32B %08x << %08x", a, d);
va009039 2:b8b4f07d4691 209 break;
va009039 2:b8b4f07d4691 210 }
va009039 2:b8b4f07d4691 211 }
va009039 2:b8b4f07d4691 212
va009039 2:b8b4f07d4691 213 uint32_t EMU111x_TMR32B::peek32(uint32_t a) {
va009039 2:b8b4f07d4691 214 uint32_t d = 0x00;
va009039 2:b8b4f07d4691 215 switch(a&0xff) {
va009039 2:b8b4f07d4691 216 case 0x08:
va009039 2:b8b4f07d4691 217 d = tc;
va009039 2:b8b4f07d4691 218 V6M_INFO("P: LPC_TMR32B%d->TC >> %u", ch, d);
va009039 2:b8b4f07d4691 219 break;
va009039 2:b8b4f07d4691 220 default:
va009039 2:b8b4f07d4691 221 V6M_WARN("P: LPC_TMR32B%d %08x >> %02x", ch, a, d);
va009039 2:b8b4f07d4691 222 break;
va009039 2:b8b4f07d4691 223 }
va009039 2:b8b4f07d4691 224 return d;
va009039 2:b8b4f07d4691 225 }
va009039 2:b8b4f07d4691 226
va009039 2:b8b4f07d4691 227 EMU111x_UART::EMU111x_UART(EMU111x& mcu_):mcu(mcu_) {
va009039 2:b8b4f07d4691 228 lcr = 0x00;
va009039 2:b8b4f07d4691 229 }
va009039 2:b8b4f07d4691 230
va009039 2:b8b4f07d4691 231 void EMU111x_UART::poke32(uint32_t a, uint32_t d) {
va009039 2:b8b4f07d4691 232 switch(a&0xff) {
va009039 2:b8b4f07d4691 233 case 0x00:
va009039 2:b8b4f07d4691 234 mcu.SerialPutc_Callback(0, d);
va009039 2:b8b4f07d4691 235 V6M_INFO("P: LPC_UART->THR << %08x", d);
va009039 2:b8b4f07d4691 236 break;
va009039 2:b8b4f07d4691 237 case 0x04:
va009039 2:b8b4f07d4691 238 V6M_INFO("P: LPC_UART->IER << %08x", d);
va009039 2:b8b4f07d4691 239 break;
va009039 2:b8b4f07d4691 240 case 0x08:
va009039 2:b8b4f07d4691 241 V6M_INFO("P: LPC_UART->FCR << %08x", d);
va009039 2:b8b4f07d4691 242 break;
va009039 2:b8b4f07d4691 243 case 0x0c:
va009039 2:b8b4f07d4691 244 lcr = d;
va009039 2:b8b4f07d4691 245 V6M_INFO("P: LPC_UART->LCR << %08x", d);
va009039 2:b8b4f07d4691 246 break;
va009039 2:b8b4f07d4691 247 case 0x28:
va009039 2:b8b4f07d4691 248 fdr = d;
va009039 2:b8b4f07d4691 249 V6M_INFO("P: LPC_UART->FDR << %08x", d);
va009039 2:b8b4f07d4691 250 break;
va009039 2:b8b4f07d4691 251 default:
va009039 2:b8b4f07d4691 252 V6M_WARN("P: LPC_UART %08x << %08x", a, d);
va009039 2:b8b4f07d4691 253 break;
va009039 2:b8b4f07d4691 254 }
va009039 2:b8b4f07d4691 255 }
va009039 2:b8b4f07d4691 256
va009039 2:b8b4f07d4691 257 uint32_t EMU111x_UART::peek32(uint32_t a) {
va009039 2:b8b4f07d4691 258 uint32_t d = 0x00;
va009039 2:b8b4f07d4691 259 switch(a&0xff) {
va009039 2:b8b4f07d4691 260 case 0x00:
va009039 2:b8b4f07d4691 261 d = mcu.SerialGetc_Callback(0);
va009039 2:b8b4f07d4691 262 V6M_INFO("P: LPC_UART->RBR >> %08x", a, d);
va009039 2:b8b4f07d4691 263 break;
va009039 2:b8b4f07d4691 264 case 0x0c:
va009039 2:b8b4f07d4691 265 d = lcr;
va009039 2:b8b4f07d4691 266 V6M_INFO("P: LPC_UART->LCR >> %08x", a, d);
va009039 2:b8b4f07d4691 267 break;
va009039 2:b8b4f07d4691 268 case 0x14:
va009039 2:b8b4f07d4691 269 d = 0x20;
va009039 2:b8b4f07d4691 270 if (mcu.SerialReadable_Callback(0)) {
va009039 2:b8b4f07d4691 271 d |= 0x01;
va009039 2:b8b4f07d4691 272 }
va009039 2:b8b4f07d4691 273 V6M_INFO("P: LPC_UART->LSR >> %08x", a, d);
va009039 2:b8b4f07d4691 274 break;
va009039 2:b8b4f07d4691 275 default:
va009039 2:b8b4f07d4691 276 V6M_WARN("P: LPC_UART %08x >> %08x", a, d);
va009039 2:b8b4f07d4691 277 break;
va009039 2:b8b4f07d4691 278 }
va009039 2:b8b4f07d4691 279 return d;
va009039 2:b8b4f07d4691 280 }
va009039 2:b8b4f07d4691 281
va009039 2:b8b4f07d4691 282 EMU111x_I2C::EMU111x_I2C(EMU111x& mcu_):mcu(mcu_) {
va009039 2:b8b4f07d4691 283 con = 0;
va009039 2:b8b4f07d4691 284 stat = 0xf8;
va009039 2:b8b4f07d4691 285 }
va009039 2:b8b4f07d4691 286
va009039 2:b8b4f07d4691 287 void EMU111x_I2C::poke32(uint32_t a, uint32_t d) {
va009039 2:b8b4f07d4691 288 switch(a&0xff) {
va009039 2:b8b4f07d4691 289 case 0x00: // CONSET
va009039 2:b8b4f07d4691 290 if (d == 0x40) {
va009039 2:b8b4f07d4691 291 con = 0x40;
va009039 2:b8b4f07d4691 292 } else if (d == 0x24) { // start
va009039 2:b8b4f07d4691 293 con = 0x48;
va009039 2:b8b4f07d4691 294 stat = 0x10;
va009039 2:b8b4f07d4691 295 } else if (d == 0x10) { // stop
va009039 2:b8b4f07d4691 296 if ((i2c_addr&0x01) == 0x00) {
va009039 2:b8b4f07d4691 297 mcu.I2CWrite_Callback(i2c_addr, i2c_data, i2c_pos);
va009039 2:b8b4f07d4691 298 }
va009039 2:b8b4f07d4691 299 } else {
va009039 2:b8b4f07d4691 300 V6M_ASSERT(0);
va009039 2:b8b4f07d4691 301 }
va009039 2:b8b4f07d4691 302 V6M_INFO("P: LPC_I2C->CONSET << %08x", d);
va009039 2:b8b4f07d4691 303 break;
va009039 2:b8b4f07d4691 304 case 0x08: // DAT
va009039 2:b8b4f07d4691 305 if (stat == 0x10) { // start
va009039 2:b8b4f07d4691 306 i2c_addr = d & 0xff;
va009039 2:b8b4f07d4691 307 i2c_pos = 0;
va009039 2:b8b4f07d4691 308 if (i2c_addr & 0x01) {
va009039 3:5df725af50e0 309 mcu.I2CRead_Callback(i2c_addr, i2c_data, sizeof(i2c_data));
va009039 2:b8b4f07d4691 310 stat = 0x40;
va009039 2:b8b4f07d4691 311 i2c_pos = 0;
va009039 2:b8b4f07d4691 312 } else {
va009039 2:b8b4f07d4691 313 stat = 0x18;
va009039 2:b8b4f07d4691 314 }
va009039 2:b8b4f07d4691 315 } else {
va009039 2:b8b4f07d4691 316 if (i2c_pos < sizeof(i2c_data)) {
va009039 2:b8b4f07d4691 317 i2c_data[i2c_pos++] = d & 0xff;
va009039 2:b8b4f07d4691 318 }
va009039 2:b8b4f07d4691 319 stat = 0x18;
va009039 2:b8b4f07d4691 320 }
va009039 2:b8b4f07d4691 321 V6M_INFO("P: LPC_I2C->DAT << %08x", d);
va009039 2:b8b4f07d4691 322 break;
va009039 2:b8b4f07d4691 323 case 0x10:
va009039 2:b8b4f07d4691 324 V6M_INFO("P: LPC_I2C->SCLH << %08x", d);
va009039 2:b8b4f07d4691 325 break;
va009039 2:b8b4f07d4691 326 case 0x14:
va009039 2:b8b4f07d4691 327 V6M_INFO("P: LPC_I2C->SCLL << %08x", d);
va009039 2:b8b4f07d4691 328 break;
va009039 2:b8b4f07d4691 329 case 0x18:
va009039 2:b8b4f07d4691 330 V6M_INFO("P: LPC_I2C->CONCLR << %08x", d);
va009039 2:b8b4f07d4691 331 break;
va009039 2:b8b4f07d4691 332 default:
va009039 2:b8b4f07d4691 333 V6M_WARN("P: LPC_I2C %08x << %08x", a, d);
va009039 2:b8b4f07d4691 334 break;
va009039 2:b8b4f07d4691 335 }
va009039 2:b8b4f07d4691 336 }
va009039 2:b8b4f07d4691 337
va009039 2:b8b4f07d4691 338 uint32_t EMU111x_I2C::peek32(uint32_t a) {
va009039 2:b8b4f07d4691 339 uint32_t d = 0x00000000;
va009039 2:b8b4f07d4691 340 switch(a&0xff) {
va009039 2:b8b4f07d4691 341 case 0x00:
va009039 2:b8b4f07d4691 342 d = con;
va009039 2:b8b4f07d4691 343 V6M_INFO("P: LPC_I2C->CON >> %08x", d);
va009039 2:b8b4f07d4691 344 break;
va009039 2:b8b4f07d4691 345 case 0x04:
va009039 2:b8b4f07d4691 346 d = stat;
va009039 2:b8b4f07d4691 347 V6M_INFO("P: LPC_I2C->STAT >> %08x", d);
va009039 2:b8b4f07d4691 348 break;
va009039 2:b8b4f07d4691 349 case 0x08:
va009039 3:5df725af50e0 350 if (i2c_pos < sizeof(i2c_data)) {
va009039 2:b8b4f07d4691 351 d = i2c_data[i2c_pos++];
va009039 2:b8b4f07d4691 352 }
va009039 3:5df725af50e0 353 if (i2c_pos < sizeof(i2c_data)) {
va009039 2:b8b4f07d4691 354 stat = 0x50;
va009039 2:b8b4f07d4691 355 } else {
va009039 2:b8b4f07d4691 356 stat = 0x58;
va009039 2:b8b4f07d4691 357 }
va009039 2:b8b4f07d4691 358 V6M_INFO("P: LPC_I2C->DAT >> %08x", d);
va009039 2:b8b4f07d4691 359 break;
va009039 2:b8b4f07d4691 360 default:
va009039 2:b8b4f07d4691 361 V6M_WARN("P: LPC_I2C %08x >> %08x", a, d);
va009039 2:b8b4f07d4691 362 break;
va009039 2:b8b4f07d4691 363 }
va009039 2:b8b4f07d4691 364 return d;
va009039 2:b8b4f07d4691 365 }
va009039 2:b8b4f07d4691 366
va009039 2:b8b4f07d4691 367 EMU111x_SPI::EMU111x_SPI(EMU111x& mcu_, int ch_):mcu(mcu_),ch(ch_) {
va009039 2:b8b4f07d4691 368 cr0 = 0;
va009039 2:b8b4f07d4691 369 cr1 = 0;
va009039 2:b8b4f07d4691 370 }
va009039 2:b8b4f07d4691 371
va009039 2:b8b4f07d4691 372 void EMU111x_SPI::poke32(uint32_t a, uint32_t d) {
va009039 2:b8b4f07d4691 373 switch(a&0xff) {
va009039 2:b8b4f07d4691 374 case 0x00:
va009039 2:b8b4f07d4691 375 cr0 = d;
va009039 2:b8b4f07d4691 376 V6M_INFO("P: LPC_SPI%d->CR0 << %08x", ch, d);
va009039 2:b8b4f07d4691 377 break;
va009039 2:b8b4f07d4691 378 case 0x04:
va009039 2:b8b4f07d4691 379 cr1 = d;
va009039 2:b8b4f07d4691 380 V6M_INFO("P: LPC_SPI%d->CR1 << %08x", ch, d);
va009039 2:b8b4f07d4691 381 break;
va009039 2:b8b4f07d4691 382 case 0x08:
va009039 2:b8b4f07d4691 383 dr = mcu.SPIWrite_Callback(ch, d);
va009039 2:b8b4f07d4691 384 V6M_INFO("P: LPC_SPI%d->DR << %08x", ch, d);
va009039 2:b8b4f07d4691 385 break;
va009039 2:b8b4f07d4691 386 case 0x10:
va009039 2:b8b4f07d4691 387 V6M_INFO("P: LPC_SPI%d->CPSR << %08x", ch, d);
va009039 2:b8b4f07d4691 388 break;
va009039 2:b8b4f07d4691 389 default:
va009039 2:b8b4f07d4691 390 V6M_WARN("P: LPC_SPI%d %08x << %08x", ch, a, d);
va009039 2:b8b4f07d4691 391 break;
va009039 2:b8b4f07d4691 392 }
va009039 2:b8b4f07d4691 393 }
va009039 2:b8b4f07d4691 394
va009039 2:b8b4f07d4691 395 uint32_t EMU111x_SPI::peek32(uint32_t a) {
va009039 2:b8b4f07d4691 396 uint32_t d = 0;
va009039 2:b8b4f07d4691 397 switch(a&0xff) {
va009039 2:b8b4f07d4691 398 case 0x00:
va009039 2:b8b4f07d4691 399 d = cr0;
va009039 2:b8b4f07d4691 400 V6M_INFO("P: LPC_SPI%d->CR0 >> %08x", ch, d);
va009039 2:b8b4f07d4691 401 break;
va009039 2:b8b4f07d4691 402 case 0x04:
va009039 2:b8b4f07d4691 403 d = cr1;
va009039 2:b8b4f07d4691 404 V6M_INFO("P: LPC_SPI%d->CR1 >> %08x", ch, d);
va009039 2:b8b4f07d4691 405 break;
va009039 2:b8b4f07d4691 406 case 0x08:
va009039 2:b8b4f07d4691 407 d = dr;
va009039 2:b8b4f07d4691 408 V6M_INFO("P: LPC_SPI%d->DR >> %08x", ch, d);
va009039 2:b8b4f07d4691 409 break;
va009039 2:b8b4f07d4691 410 case 0x0c:
va009039 2:b8b4f07d4691 411 d = 0x06;
va009039 2:b8b4f07d4691 412 V6M_INFO("P: LPC_SPI%d->SR >> %08x", ch, d);
va009039 2:b8b4f07d4691 413 break;
va009039 2:b8b4f07d4691 414 default:
va009039 2:b8b4f07d4691 415 V6M_WARN("P: LPC_SPI%d %08x >> %08x", ch, a, d);
va009039 2:b8b4f07d4691 416 break;
va009039 2:b8b4f07d4691 417 }
va009039 2:b8b4f07d4691 418 return d;
va009039 2:b8b4f07d4691 419 }
va009039 2:b8b4f07d4691 420
va009039 2:b8b4f07d4691 421 void EMU111x_NVIC::poke32(uint32_t a, uint32_t d) {
va009039 2:b8b4f07d4691 422 switch(a) {
va009039 2:b8b4f07d4691 423 case 0xe000e100:
va009039 2:b8b4f07d4691 424 iser = d;
va009039 2:b8b4f07d4691 425 V6M_INFO("P: NVIC->ISER[0] << %08x", d);
va009039 2:b8b4f07d4691 426 break;
va009039 2:b8b4f07d4691 427 default:
va009039 2:b8b4f07d4691 428 V6M_WARN("P: NVIC %08x >> %08x", a, d);
va009039 2:b8b4f07d4691 429 break;
va009039 2:b8b4f07d4691 430 }
va009039 2:b8b4f07d4691 431 }
va009039 2:b8b4f07d4691 432
va009039 3:5df725af50e0 433 EMU111x::EMU111x():tmr32b1(1),_uart(*this),_i2c(*this),_spi0(*this,0),_spi1(*this,1),gpio0(*this,0),gpio1(*this,1) {
va009039 2:b8b4f07d4691 434 flash = NULL;
va009039 2:b8b4f07d4691 435 rom = NULL;
va009039 2:b8b4f07d4691 436 ram = new uint8_t[EMU111x_RAM_SIZE];
va009039 2:b8b4f07d4691 437 }
va009039 2:b8b4f07d4691 438
va009039 2:b8b4f07d4691 439 void EMU111x::poke32(uint32_t a, uint32_t d) {
va009039 2:b8b4f07d4691 440 switch(a>>24) {
va009039 2:b8b4f07d4691 441 case EMU111x_RAM_BASE>>24:
va009039 2:b8b4f07d4691 442 V6M_ASSERT(a < (EMU111x_RAM_BASE+EMU111x_RAM_SIZE));
va009039 2:b8b4f07d4691 443 ram[a - EMU111x_RAM_BASE] = d;
va009039 2:b8b4f07d4691 444 ram[a - EMU111x_RAM_BASE + 1] = d>>8;
va009039 2:b8b4f07d4691 445 ram[a - EMU111x_RAM_BASE + 2] = d>>16;
va009039 2:b8b4f07d4691 446 ram[a - EMU111x_RAM_BASE + 3] = d>>24;
va009039 2:b8b4f07d4691 447 V6M_INFO("W: %08x << %08x", a, d);
va009039 2:b8b4f07d4691 448 break;
va009039 2:b8b4f07d4691 449 case EMU111x_APB_BASE>>24:
va009039 2:b8b4f07d4691 450 switch((a>>12)&0xff) {
va009039 3:5df725af50e0 451 case 0x00: _i2c.poke32(a, d); break;
va009039 3:5df725af50e0 452 case 0x08: _uart.poke32(a, d); break;
va009039 2:b8b4f07d4691 453 case 0x18: tmr32b1.poke32(a, d); break;
va009039 3:5df725af50e0 454 case 0x40: _spi0.poke32(a, d); break;
va009039 2:b8b4f07d4691 455 case 0x44: iocon.poke32(a, d); break;
va009039 2:b8b4f07d4691 456 case 0x48: syscon.poke32(a, d); break;
va009039 3:5df725af50e0 457 case 0x58: _spi1.poke32(a, d); break;
va009039 2:b8b4f07d4691 458 default:
va009039 2:b8b4f07d4691 459 V6M_WARN("P: %08x << %08x", a, d);
va009039 2:b8b4f07d4691 460 break;
va009039 2:b8b4f07d4691 461 }
va009039 2:b8b4f07d4691 462 break;
va009039 2:b8b4f07d4691 463 case EMU111x_AHB_BASE>>24:
va009039 2:b8b4f07d4691 464 switch((a>>16)&0xff) {
va009039 2:b8b4f07d4691 465 case 0: gpio0.poke32(a, d); break;
va009039 2:b8b4f07d4691 466 case 1: gpio1.poke32(a, d); break;
va009039 2:b8b4f07d4691 467 default:
va009039 2:b8b4f07d4691 468 V6M_ERROR("P: %08x << %08x", a, d);
va009039 2:b8b4f07d4691 469 break;
va009039 2:b8b4f07d4691 470 }
va009039 2:b8b4f07d4691 471 break;
va009039 2:b8b4f07d4691 472 case EMU111x_FLASH_BASE>>24:
va009039 2:b8b4f07d4691 473 case EMU111x_ROM_BASE>>24:
va009039 2:b8b4f07d4691 474 V6M_ERROR("P: %08x << %08x", a, d);
va009039 2:b8b4f07d4691 475 V6M_ASSERT(0);
va009039 2:b8b4f07d4691 476 break;
va009039 2:b8b4f07d4691 477 case EMU111x_SCS_BASE>>24:
va009039 2:b8b4f07d4691 478 switch(a&0xffffff) {
va009039 2:b8b4f07d4691 479 case 0x00e100:
va009039 2:b8b4f07d4691 480 nvic.poke32(a, d);
va009039 2:b8b4f07d4691 481 break;
va009039 2:b8b4f07d4691 482 default:
va009039 2:b8b4f07d4691 483 V6M_WARN("P: %08x << %08x", a, d);
va009039 2:b8b4f07d4691 484 break;
va009039 2:b8b4f07d4691 485 }
va009039 2:b8b4f07d4691 486 break;
va009039 2:b8b4f07d4691 487 default:
va009039 2:b8b4f07d4691 488 V6M_WARN("P: %08x << %08x", a, d);
va009039 2:b8b4f07d4691 489 break;
va009039 2:b8b4f07d4691 490 }
va009039 2:b8b4f07d4691 491 }
va009039 2:b8b4f07d4691 492
va009039 2:b8b4f07d4691 493 uint32_t EMU111x::peek32(uint32_t a) {
va009039 2:b8b4f07d4691 494 uint32_t d = 0x00;
va009039 2:b8b4f07d4691 495 switch(a>>24) {
va009039 2:b8b4f07d4691 496 case EMU111x_RAM_BASE>>24:
va009039 2:b8b4f07d4691 497 V6M_ASSERT(a < (EMU111x_RAM_BASE+EMU111x_RAM_SIZE));
va009039 2:b8b4f07d4691 498 d = ram[a - EMU111x_RAM_BASE];
va009039 2:b8b4f07d4691 499 d |= ram[a - EMU111x_RAM_BASE + 1]<<8;
va009039 2:b8b4f07d4691 500 d |= ram[a - EMU111x_RAM_BASE + 2]<<16;
va009039 2:b8b4f07d4691 501 d |= ram[a - EMU111x_RAM_BASE + 3]<<24;
va009039 2:b8b4f07d4691 502 V6M_INFO("R: %08x >> %08x", a, d);
va009039 2:b8b4f07d4691 503 break;
va009039 2:b8b4f07d4691 504 case EMU111x_FLASH_BASE>>24:
va009039 2:b8b4f07d4691 505 V6M_ASSERT(a < (EMU111x_FLASH_BASE+EMU111x_FLASH_SIZE));
va009039 2:b8b4f07d4691 506 d = flash[a - EMU111x_FLASH_BASE];
va009039 2:b8b4f07d4691 507 d |= flash[a - EMU111x_FLASH_BASE + 1]<<8;
va009039 2:b8b4f07d4691 508 d |= flash[a - EMU111x_FLASH_BASE + 2]<<16;
va009039 2:b8b4f07d4691 509 d |= flash[a - EMU111x_FLASH_BASE + 3]<<24;
va009039 2:b8b4f07d4691 510 break;
va009039 2:b8b4f07d4691 511 case EMU111x_ROM_BASE>>24:
va009039 2:b8b4f07d4691 512 V6M_ERROR("P: %08x << %08x", a, d);
va009039 2:b8b4f07d4691 513 V6M_ASSERT(0);
va009039 2:b8b4f07d4691 514 break;
va009039 2:b8b4f07d4691 515 case EMU111x_APB_BASE>>24:
va009039 2:b8b4f07d4691 516 switch((a>>12)&0xff) {
va009039 3:5df725af50e0 517 case 0x00: d = _i2c.peek32(a); break;
va009039 3:5df725af50e0 518 case 0x08: d = _uart.peek32(a); break;
va009039 2:b8b4f07d4691 519 case 0x18: d = tmr32b1.peek32(a); break;
va009039 3:5df725af50e0 520 case 0x40: d = _spi0.peek32(a); break;
va009039 2:b8b4f07d4691 521 case 0x44: d = iocon.peek32(a); break;
va009039 2:b8b4f07d4691 522 case 0x48: d = syscon.peek32(a); break;
va009039 3:5df725af50e0 523 case 0x58: d = _spi1.peek32(a); break;
va009039 2:b8b4f07d4691 524 default:
va009039 2:b8b4f07d4691 525 V6M_WARN("P: %08x >> %08x", a, d);
va009039 2:b8b4f07d4691 526 break;
va009039 2:b8b4f07d4691 527 }
va009039 2:b8b4f07d4691 528 break;
va009039 2:b8b4f07d4691 529 case EMU111x_AHB_BASE>>24:
va009039 2:b8b4f07d4691 530 switch((a>>16)&0xff) {
va009039 2:b8b4f07d4691 531 case 0: d = gpio0.peek32(a); break;
va009039 2:b8b4f07d4691 532 case 1: d = gpio1.peek32(a); break;
va009039 2:b8b4f07d4691 533 default:
va009039 2:b8b4f07d4691 534 V6M_ERROR("P: %08x >> %08x", a, d);
va009039 2:b8b4f07d4691 535 break;
va009039 2:b8b4f07d4691 536 }
va009039 2:b8b4f07d4691 537 break;
va009039 2:b8b4f07d4691 538 default:
va009039 2:b8b4f07d4691 539 V6M_WARN("P: %08x >> %08x", a, d);
va009039 2:b8b4f07d4691 540 break;
va009039 2:b8b4f07d4691 541 }
va009039 2:b8b4f07d4691 542 return d;
va009039 2:b8b4f07d4691 543 }
va009039 2:b8b4f07d4691 544
va009039 2:b8b4f07d4691 545 void EMU111x::poke8(uint32_t a, uint8_t d) {
va009039 2:b8b4f07d4691 546 switch(a>>24) {
va009039 2:b8b4f07d4691 547 case EMU111x_RAM_BASE>>24:
va009039 2:b8b4f07d4691 548 V6M_ASSERT(a < (EMU111x_RAM_BASE+EMU111x_RAM_SIZE));
va009039 2:b8b4f07d4691 549 ram[a - EMU111x_RAM_BASE] = d;
va009039 2:b8b4f07d4691 550 V6M_INFO("W: %08x << %02x", a, d);
va009039 2:b8b4f07d4691 551 break;
va009039 2:b8b4f07d4691 552 default:
va009039 2:b8b4f07d4691 553 V6M_ERROR("P: %08x << %08x", a, d);
va009039 2:b8b4f07d4691 554 V6M_ASSERT(0);
va009039 2:b8b4f07d4691 555 break;
va009039 2:b8b4f07d4691 556 }
va009039 2:b8b4f07d4691 557 }
va009039 2:b8b4f07d4691 558
va009039 2:b8b4f07d4691 559 uint8_t EMU111x::peek8(uint32_t a) {
va009039 2:b8b4f07d4691 560 uint8_t d = 0x00;
va009039 2:b8b4f07d4691 561 switch(a>>24) {
va009039 2:b8b4f07d4691 562 case EMU111x_RAM_BASE>>24:
va009039 2:b8b4f07d4691 563 V6M_ASSERT(a < (EMU111x_RAM_BASE+EMU111x_RAM_SIZE));
va009039 2:b8b4f07d4691 564 d = ram[a - EMU111x_RAM_BASE];
va009039 2:b8b4f07d4691 565 V6M_INFO("R: %08x >> %02x", a, d);
va009039 2:b8b4f07d4691 566 break;
va009039 2:b8b4f07d4691 567 case EMU111x_FLASH_BASE>>24:
va009039 2:b8b4f07d4691 568 V6M_ASSERT(a < (EMU111x_FLASH_BASE+EMU111x_FLASH_SIZE));
va009039 2:b8b4f07d4691 569 d = flash[a - EMU111x_FLASH_BASE];
va009039 2:b8b4f07d4691 570 break;
va009039 2:b8b4f07d4691 571 case EMU111x_ROM_BASE>>24:
va009039 2:b8b4f07d4691 572 V6M_ASSERT(a < (EMU111x_ROM_BASE+EMU111x_ROM_SIZE));
va009039 2:b8b4f07d4691 573 d = flash[a - EMU111x_ROM_BASE];
va009039 2:b8b4f07d4691 574 break;
va009039 2:b8b4f07d4691 575 default:
va009039 2:b8b4f07d4691 576 V6M_ASSERT(0);
va009039 2:b8b4f07d4691 577 break;
va009039 2:b8b4f07d4691 578 }
va009039 2:b8b4f07d4691 579 return d;
va009039 2:b8b4f07d4691 580 }
va009039 2:b8b4f07d4691 581
va009039 2:b8b4f07d4691 582 void EMU111x::clock_in(uint32_t n) {
va009039 2:b8b4f07d4691 583 tmr32b1.clock_in(n);
va009039 2:b8b4f07d4691 584 }
va009039 2:b8b4f07d4691 585
va009039 2:b8b4f07d4691 586 void EMU111x::trace() {
va009039 2:b8b4f07d4691 587 V6M_INFO("S: r0=%08x r1=%08x r2=%08x r3=%08x r4=%08x r5=%08x r6=%08x r7=%08x", R[0],R[1],R[2],R[3],R[4],R[5],R[6],R[7]);
va009039 2:b8b4f07d4691 588 V6M_INFO("S: r8=%08x r9=%08x r10=%08x r11=%08x r12=%08x sp=%08x lr=%08x pc=%08x", R[8],R[9],R[10],R[11],R[12],R[13],R[14],R[15]);
va009039 2:b8b4f07d4691 589 V6M_INFO("S: xPSR=%08x N=%d Z=%d C=%d V=%d", R[16], N(), Z(), C(), V());
va009039 2:b8b4f07d4691 590 V6M_DEBUG("S: cycle=%d code=%02x code2nd=%02x im=%08x d=%d n=%d m=%d", cycle, code, code2nd, R[17], GetRegIndex(Rd), GetRegIndex(Rn), GetRegIndex(Rm));
va009039 2:b8b4f07d4691 591 }
va009039 2:b8b4f07d4691 592