7 static u8 io_space
[0x100];
9 static const char *name_smbsta_bits
[8] = {
10 "master", "unit_busy", "bus_free", "nacked", "sa_rdy", "d_rdy", "d_req", "bus_low",
13 static const char *name_smbctl_bits
[8] = {
14 "sa_en", "isolate", "smb_rst", "bfi_en", "pec_dis", "bli_dis", "bli_edge", "nc_smb",
17 static const char *name_smbpec_bits
[8] = {
18 "pec_vld", "pec_chk", "pec_snd", "rsvd", "rsvd", "rsvd", "rsvd", "rsvd",
21 static const char *name_hdqsta_bits
[8] = {
22 "data_in", "sbit_in", "hdq_drdy", "hdq_drq", "rsvd", "rsvd", "rsvd", "rsvd",
26 static const char *name_hdqout_bits
[8] = {
27 "data_out", "sbit_out", "rsvd", "rsvd", "rsvd", "rsvd", "rsvd", "rsvd",
30 static const char *name_adctl0_bits
[8] = {
31 "chan0", "chan1", "chan2", "chan3", "fast", "adc_on", "vrvdd", "conv",
34 static const char *name_ccctl_bits
[8] = {
35 "cc_cal", "cc_on", "rsvd", "rsvd", "rsvd", "rsvd", "rsvd", "rsvd",
38 static const char *name_clk_bits
[8] = {
39 "pll_en", "osc_en", "osc_ng", "rsvd", "dg0", "dg1", "rsvd", "rsvd",
42 static const char *name_tmrctlw_bits
[8] = {
43 "wdcrst", "wken", "wden", "wdf", "rsvd", "rsvd", "rsvd", "rsvd",
46 static const char *name_tmrctla_bits
[8] = {
47 "tma_ps0", "tma_ps1", "tma_edg", "tma_isrc", "tma_ext", "tma_on", "tm16", "rsvd",
50 static const char *name_tmrctlb_bits
[8] = {
51 "tmb_ps0", "tmb_ps1", "tmb_edg", "tmb_isrc", "tmb_ext", "tmb_on", "pwb0", "pwb1",
54 static const char *name_tmrctlc_bits
[8] = {
55 "cap_ps0", "cap_ps1", "cap_edg", "mode0", "mode1", "mode2", "pwa0", "pwa1",
58 static const char *name_raout_bits
[8] = {
59 "rao0", "rao1/vo", "rao2", "rao3", "rao4", "rao5", "rao6", "rao7",
62 static const char *name_rbout_bits
[8] = {
63 "rbo0", "rbo1", "rbo2", "rbo3", "rbo4", "rbo5", "rbo6", "rbo7",
66 static const char *name_rcout_bits
[8] = {
67 "rco0", "rco1", "rco2", "rco3", "rco4", "rco5", "rco6", "rco7",
70 static const char *name_rain_bits
[8] = {
71 "rai0", "rai1", "rai2", "rai3", "rai4", "rai5", "rai6", "rai7",
74 static const char *name_rbin_bits
[8] = {
75 "rbi0", "rbi1", "rbi2", "rbi3", "rbi4", "rbi5", "rbi6", "rbi7",
78 static const char *name_rcin_bits
[8] = {
79 "rci0", "rci1", "rci2", "rci3", "rci4", "rci5", "rci6", "rci7",
82 static const char *name_raien_bits
[8] = {
83 "raien0", "raien1", "raien2", "raien3", "raien4", "raien5", "raien6", "raien7",
86 static const char *name_rbien_bits
[8] = {
87 "rbien0", "rbien1", "rbien2", "rbien3", "rbien4", "rbien5", "rbien6", "rbien7",
90 static const char *name_rcien_bits
[8] = {
91 "rcien0", "rcien1", "rcien2", "rcien3", "rcien4", "rcien5", "rcien6", "rcien7",
94 static const char *name_ioctl_bits
[8] = {
95 "vouten", "hdqen", "smben", "xinten", "xeven", "pwmben", "pwmaen", "32k_out",
98 static const char *name_rcpup_bits
[8] = {
99 "rcpup0", "rcpup1", "rcpup2", "rcpup3", "rcpup4", "rcpup5", "rcpup6", "rcpup7",
102 static const char *name_pflag_bits
[8] = {
103 "tmbf", "tmaf", "wkf", "timf", "ccf", "adf", "hdqf", "smbf",
106 static const char *name_pie_bits
[8] = {
107 "tmbie", "tmaie", "wkeve", "timie", "ccie", "adie", "hdqie", "smbie",
110 static const char *name_pctl_bits
[8] = {
111 "xev_edg", "xin_edg", "rsvd", "rsvd", "rsvd", "rsvd", "rsvd", "rsvd",
114 void write_io_lowlevel(u8 addr
, u8 val
)
116 io_space
[addr
] = val
;
119 u8
read_io_lowlevel(u8 addr
)
122 val
= io_space
[addr
];
126 void write_io(u8 addr
, u8 val
)
128 u8 old
= io_space
[addr
];
133 log_comment_add("SMBMA (Master Address)\n");
134 log_comment_add(" addr=%02hhx (%s)\n",
135 val
, val
&1?"rd":"wr");
138 log_comment_add("SMBDA (Data)\n");
139 log_comment_add(" data=%02hhx\n", val
);
142 log_comment_add("SMBACK (Ack)\n");
143 log_comment_add(" %s\n",
144 val
&1?"acked":"weird 0");
147 log_comment_add("SMBSTA (Status)\n");
148 log_comment_add(" write %02hhx to readonly!\n", val
);
151 io_space
[addr
] = val
;
152 log_comment_reg_bits("SMBCTL (Control)", name_smbctl_bits
, old
, io_space
[addr
]);
155 io_space
[addr
] = val
& 0x7;
156 log_comment_reg_bits("SMBPEC (Packet Error Check)", name_smbpec_bits
, old
, io_space
[addr
]);
159 log_comment_add("SMBTAR (Target Slave Address)\n");
160 log_comment_add(" addr=%02hhx (%s)\n",
161 val
, val
&1?"rd":"wr"); //probably rd/wr
162 io_space
[addr
] = val
;
165 log_comment_add("SMBBUSLO (Bus Low timeout)\n");
166 if ((val
& 7) == 0) {
167 log_comment_add(" timeout='never'\n");
169 log_comment_add(" timeout=%d ms\n", (val
& 7)*500);
171 io_space
[addr
] = val
& 0x7;
173 //HDQ single pin serial interface region
175 log_comment_add("HDQSTA (Input and Int Control)\n");
176 log_comment_add(" Write to ReadOnly reg (%02hhx)\n", val
);
179 io_space
[addr
] = val
& 0x3;
180 log_comment_reg_bits("HDQOUT (Output Control)", name_hdqout_bits
, old
, io_space
[addr
]);
184 //TODO decode chanX vector?
185 io_space
[addr
] = val
;
186 log_comment_reg_bits("ADCTL0 (Control 0)", name_adctl0_bits
, old
, io_space
[addr
]);
189 log_comment_add("ADCTL1 (Control 1)\n");
190 log_comment_add(" Write to ReadOnly reg (%02hhx)\n", val
);
193 log_comment_add("ADHI (High byte)\n");
194 log_comment_add(" Write to ReadOnly reg (%02hhx)\n", val
);
197 log_comment_add("ADMID (Middle Byte)\n");
198 log_comment_add(" Write to ReadOnly reg (%02hhx)\n", val
);
201 log_comment_add("ADLO (Low Byte)\n");
202 log_comment_add(" Write to ReadOnly reg (%02hhx)\n", val
);
204 //coloumb counter region
206 io_space
[addr
] = val
& 3;
207 log_comment_reg_bits("CCCTL (Control)", name_ccctl_bits
, old
, io_space
[addr
]);
210 log_comment_add("CCHI (High Byte)\n");
211 log_comment_add(" Write to ReadOnly reg (%02hhx)\n", val
);
214 log_comment_add("CCLO (Low Byte)\n");
215 log_comment_add(" Write to ReadOnly reg (%02hhx)\n", val
);
219 io_space
[addr
] = (old
& ~3) | (val
& 3);
220 log_comment_reg_bits("CLK (Clock)", name_clk_bits
, old
& 3, io_space
[addr
]);
223 log_comment_add("OSC_TRIM (Trim)\n");
224 log_comment_add(" Trim=%d\n", val
);
225 io_space
[addr
] = val
;
228 log_comment_add("OSC Unknown!!\n");
229 log_comment_add(" val=%02hhx\n", val
);
230 io_space
[addr
] = val
;
235 io_space
[addr
] = val
& 0x7;
237 io_space
[addr
] = (io_space
[addr
] & 8) | ( val
& 0x7);
239 log_comment_reg_bits("TMRCTLW (Control)", name_tmrctlw_bits
, old
& 0xf, io_space
[addr
]);
242 log_comment_add("TMRPERW (Program)\n");
243 log_comment_add(" Time=%d*3.90625 ms\n", val
);
244 io_space
[addr
] = val
;
247 io_space
[addr
] = val
& 0x7f;
248 log_comment_reg_bits("TMRCTLA (Control A)", name_ccctl_bits
, old
& 0x7f, io_space
[addr
]);
251 io_space
[addr
] = val
;
252 log_comment_reg_bits("TMRCTLB (Control B)", name_smbctl_bits
, old
, io_space
[addr
]);
255 io_space
[addr
] = val
;
256 log_comment_reg_bits("TMRCTLC (Control C, Capture/Compare/PWM)", name_smbctl_bits
, old
, io_space
[addr
]);
259 log_comment_add("TMRPERA (Period A)\n");
260 log_comment_add(" Period=%d\n", val
);
261 io_space
[addr
] = val
;
264 log_comment_add("TMRPERB (Period B)\n");
265 log_comment_add(" Period = %d\n", val
);
266 io_space
[addr
] = val
;
269 log_comment_add("TMRPWA (Pulse Width A)\n");
270 log_comment_add(" Pulse Width = %d\n", val
);
271 io_space
[addr
] = val
;
274 log_comment_add("TMRPWB (Pulse Width B)\n");
275 log_comment_add(" Pulse Width = %d\n", val
);
276 io_space
[addr
] = val
;
279 log_comment_add("TMRPGMA (Program A)\n");
280 log_comment_add(" Init? = %d\n", val
);
281 io_space
[addr
] = val
;
284 log_comment_add("TMRPGMB (Program B)\n");
285 log_comment_add(" Init? = %d\n", val
);
286 io_space
[addr
] = val
;
290 io_space
[addr
] = val
;
291 log_comment_reg_bits("RA_OUT (Output A)", name_raout_bits
, old
, io_space
[addr
]);
294 io_space
[addr
] = val
;
295 log_comment_reg_bits("RB_OUT (Output B)", name_rbout_bits
, old
, io_space
[addr
]);
298 io_space
[addr
] = val
;
299 log_comment_reg_bits("RC_OUT (Output C)", name_rcout_bits
, old
, io_space
[addr
]);
302 log_comment_add("RA_IN (Input A)\n");
303 log_comment_add(" Write to ReadOnly reg (%02hhx)\n", val
);
306 log_comment_add("RB_IN (Input B)\n");
307 log_comment_add(" Write to ReadOnly reg (%02hhx)\n", val
);
310 log_comment_add("RC_IN (Input C)\n");
311 log_comment_add(" Write to ReadOnly reg (%02hhx)\n", val
);
314 io_space
[addr
] = val
;
315 log_comment_reg_bits("RA_IEN (Input Enable A)", name_raien_bits
, old
, io_space
[addr
]);
318 io_space
[addr
] = val
;
319 log_comment_reg_bits("RB_IEN (Input Enable B)", name_rbien_bits
, old
, io_space
[addr
]);
322 io_space
[addr
] = val
;
323 log_comment_reg_bits("RC_IEN (Input Enable C)", name_rcien_bits
, old
, io_space
[addr
]);
326 io_space
[addr
] = val
;
327 log_comment_reg_bits("IOCTL (I/O Control)", name_ioctl_bits
, old
, io_space
[addr
]);
330 io_space
[addr
] = val
;
331 log_comment_reg_bits("RC_PUP (Pullup C)", name_rcpup_bits
, old
, io_space
[addr
]);
333 //interrupt controller
335 //TODO special masking, zero only unset bits
336 io_space
[addr
] = old
& val
;
337 log_comment_reg_bits("PFLAG (Periph irq flags)", name_pflag_bits
, old
, io_space
[addr
]);
340 io_space
[addr
] = val
;
341 log_comment_reg_bits("PIE (Periph irq en)", name_pie_bits
, old
, io_space
[addr
]);
342 sim_breakpoint_set(SIM_BREAKPOINT_DATA
);
345 io_space
[addr
] = val
& 3;
346 log_comment_reg_bits("PCTL (Periph Ext irq ctrl)", name_pctl_bits
, old
& 3, io_space
[addr
]);
350 log_comment_add("VTRIM (Reference voltage trim)\n");
351 log_comment_add(" %d*1.4 mV (probably)\n", val
& 0x3f);
352 io_space
[addr
] = val
& 0x3f;
354 //TODO flash interface
356 log_comment_add("Unknown flash TODO\n");
357 log_comment_add(" %02hhx\n", val
);
358 io_space
[addr
] = val
;
361 log_comment_add("Unknown IO write TODO!!\n");
362 log_comment_add(" Assuming RW register = %02hhx\n", val
);
363 io_space
[addr
] = val
;
364 sim_breakpoint_set(SIM_BREAKPOINT_DATA
);
368 //TODO watch special adresses?
378 log_comment_add("SMBMA (Master Address)\n");
379 log_comment_add(" Read of WriteOnly reg\n");
383 log_comment_add("SMBDA (Data)\n");
384 val
= io_space
[addr
];
385 log_comment_add(" data=%02hhx\n", val
);
388 log_comment_add("SMBACK (Ack)\n");
389 log_comment_add(" Read of WriteOnly reg\n");
393 val
= io_space
[addr
];
394 log_comment_reg_bits("SMBSTA (Stat)", name_smbsta_bits
, val
, val
);
397 val
= io_space
[addr
];
398 log_comment_reg_bits("SMBCTL (Ctrl)", name_smbctl_bits
, val
, val
);
401 val
= io_space
[addr
] & 7;
402 log_comment_reg_bits("SMBPEC (Packet Error Check)", name_smbpec_bits
, val
, val
);
405 val
= io_space
[addr
];
406 log_comment_add("SMBTAR (Target Slave Addr)\n");
407 log_comment_add(" addr=%02hhx (%s)\n",
408 val
, val
&1?"rd":"wr"); //probably rd/wr
411 val
= io_space
[addr
];
412 log_comment_add("SMBBUSLO (Bus Low timeout)\n");
413 if ((val
& 7) == 0) {
414 log_comment_add(" timeout='never'\n");
416 log_comment_add(" timeout=%d ms\n", (val
& 7)*500);
419 //HDQ single pin serial interface region
421 val
= io_space
[addr
] & 0xf;
422 log_comment_reg_bits("HDQSTA (Input and irq ctrl)", name_hdqsta_bits
, val
, val
);
425 val
= io_space
[addr
] & 0x3;
426 log_comment_reg_bits("HDQOUT (Output ctrl)", name_hdqout_bits
, val
, val
);
430 //TODO decode chanX vector?
431 val
= io_space
[addr
];
432 log_comment_reg_bits("ADCTL0 (ctrl 0)", name_adctl0_bits
, val
, val
);
435 val
= io_space
[addr
] & 1;
436 log_comment_add("ADCTL1 (Control 1)\n");
437 log_comment_add(" ready = %02hhx\n", val
);
440 val
= io_space
[addr
] | 0x80;
441 log_comment_add("ADHI (High byte)\n");
442 log_comment_add(" ADC measurement = %d\n",
443 (io_space
[0x32] << 16) |
444 (io_space
[0x33] << 8) |
448 val
= io_space
[addr
];
449 log_comment_add("ADMID (Middle Byte)\n");
450 log_comment_add(" ADC measurement = %d\n",
451 (io_space
[0x32] << 16) |
452 (io_space
[0x33] << 8) |
456 val
= io_space
[addr
];
457 log_comment_add("ADLO (Low Byte)\n");
458 log_comment_add(" ADC measurement = %d\n",
459 (io_space
[0x32] << 16) |
460 (io_space
[0x33] << 8) |
463 //coloumb counter region
465 val
= io_space
[addr
] & 3;
466 log_comment_reg_bits("CCCTL (Coulomb Ctrl)", name_ccctl_bits
, val
, val
);
469 val
= io_space
[addr
];
470 log_comment_add("CCHI (High Byte)\n");
471 log_comment_add(" Coulomb measurement = %hd\n",
472 (io_space
[0x41] << 8) |
476 val
= io_space
[addr
];
477 log_comment_add("CCLO (Low Byte)\n");
478 log_comment_add(" Coulomb measurement = %hd\n",
479 (io_space
[0x41] << 8) |
484 val
= io_space
[addr
];
485 log_comment_reg_bits("CLK (Clock)", name_clk_bits
, val
, val
);
488 val
= io_space
[addr
];
489 log_comment_add("OSC_TRIM (Trim)\n");
490 log_comment_add(" Trim=%d\n", val
);
493 //NOTICE sim writes 0x6b, IRL read out 0x0b
494 val
= io_space
[addr
] & 0x0f;
495 log_comment_add("OSC Unknown!!\n");
496 log_comment_add(" val=%02hhx\n", val
);
500 val
= io_space
[addr
] & 0xf;
501 log_comment_reg_bits("TMRCTLW (Ctrl)", name_tmrctlw_bits
, val
, val
);
504 val
= io_space
[addr
];
505 log_comment_add("TMRPERW (Program)\n");
506 log_comment_add(" Time=%d*3.90625 ms\n", val
);
509 val
= io_space
[addr
] & 0x7f;
510 log_comment_reg_bits("TMRCTLA (Ctrl A)", name_tmrctla_bits
, val
, val
);
513 val
= io_space
[addr
];
514 log_comment_reg_bits("TMRCTLB (Ctrl B)", name_tmrctlb_bits
, val
, val
);
517 val
= io_space
[addr
];
518 log_comment_reg_bits("TMRCTLC (Ctrl C, Capture/Compare/PWM)", name_tmrctlc_bits
, val
, val
);
521 val
= io_space
[addr
];
522 log_comment_add("TMRPERA (Period A)\n");
523 log_comment_add(" Period=%d\n", val
);
526 val
= io_space
[addr
];
527 log_comment_add("TMRPERB (Period B)\n");
528 log_comment_add(" Period = %d\n", val
);
531 val
= io_space
[addr
];
532 log_comment_add("TMRPWA (Pulse Width A)\n");
533 log_comment_add(" Pulse Width = %d\n", val
);
536 val
= io_space
[addr
];
537 log_comment_add("TMRPWB (Pulse Width B)\n");
538 log_comment_add(" Pulse Width = %d\n", val
);
541 val
= io_space
[addr
];
542 log_comment_add("TMRPGMA (Program A)\n");
543 log_comment_add(" Init? = %d\n", val
);
546 val
= io_space
[addr
];
547 log_comment_add("TMRPGMB (Program B)\n");
548 log_comment_add(" Init? = %d\n", val
);
552 val
= io_space
[addr
];
553 log_comment_reg_bits("RA_OUT (Output A)", name_raout_bits
, val
, val
);
556 val
= io_space
[addr
];
557 log_comment_reg_bits("RB_OUT (Output B)", name_rbout_bits
, val
, val
);
560 val
= io_space
[addr
];
561 log_comment_reg_bits("RC_OUT (Output C)", name_rcout_bits
, val
, val
);
564 val
= io_space
[addr
];
565 log_comment_reg_bits("RA_IN (Input A)", name_rain_bits
, val
, val
);
566 // sim_breakpoint_set(SIM_BREAKPOINT_DATA);
569 val
= io_space
[addr
];
570 log_comment_reg_bits("RB_IN (Input B)", name_rbin_bits
, val
, val
);
571 // sim_breakpoint_set(SIM_BREAKPOINT_DATA);
574 val
= io_space
[addr
];
575 log_comment_reg_bits("RC_IN (Input C)", name_rcin_bits
, val
, val
);
576 // sim_breakpoint_set(SIM_BREAKPOINT_DATA);
579 val
= io_space
[addr
];
580 log_comment_reg_bits("RA_IEN (Input Enable A)", name_raien_bits
, val
, val
);
583 val
= io_space
[addr
];
584 log_comment_reg_bits("RB_IEN (Input Enable B)", name_rbien_bits
, val
, val
);
587 val
= io_space
[addr
];
588 log_comment_reg_bits("RC_IEN (Input Enable C)", name_rcien_bits
, val
, val
);
591 val
= io_space
[addr
];
592 log_comment_reg_bits("IOCTL (I/O Ctrl)", name_ioctl_bits
, val
, val
);
595 val
= io_space
[addr
];
596 log_comment_reg_bits("RC_PUP (Pullup C)", name_rcpup_bits
, val
, val
);
598 //interrupt controller
600 val
= io_space
[addr
];
601 log_comment_reg_bits("PFLAG (Periph irq flags)", name_pflag_bits
, val
, val
);
604 val
= io_space
[addr
];
605 log_comment_reg_bits("PIE (Periph irq enable)", name_pie_bits
, val
, val
);
608 val
= io_space
[addr
] & 3;
609 log_comment_reg_bits("PCTL (Periph Ext irq ctrl)", name_pctl_bits
, val
, val
);
613 val
= io_space
[addr
] & 0x3f;
614 log_comment_add("VTRIM (Reference voltage trim)\n");
615 log_comment_add(" %d*1.4 mV (probably)\n", val
);
617 //TODO flash interface
619 val
= io_space
[addr
];
620 log_comment_add("Unknown flash TODO\n");
621 log_comment_add(" %02hhx\n", val
);
624 val
= io_space
[addr
];
625 log_comment_add("!!Unknown IO write TODO!!\n");
626 log_comment_add(" Assuming RW register = %02hhx\n", val
);
630 //TODO watch special adresses?
634 void init_ioregs(char * filename
)
636 memset(io_space
, 0, sizeof(io_space
));
640 fp
= fopen(filename
, "r");
642 perror("IO dump opening");
645 fread(io_space
, 0x100, 1, fp
);
650 io_space
[0x13] = 0x4;
651 //SMBBUSLO, BUSLO2=1 during reset
652 io_space
[0x17] = 0x4;
654 io_space
[0x31] = 0x80;
656 io_space
[0x32] = 0x80;
657 //CLK OSC_EN=1, PLL_EN=1
658 io_space
[0x50] = 0x3;
660 io_space
[0x60] = 0x1;
662 io_space
[0x61] = 0xff;
664 io_space
[0x65] = 0xff;
666 io_space
[0x66] = 0xff;
668 io_space
[0x67] = 0xff;
670 io_space
[0x68] = 0xff;
672 io_space
[0x70] = 0xff;
674 io_space
[0x71] = 0xff;
676 io_space
[0x72] = 0xff;
679 // io_space[0x90] |= 0x08;