4 * Copyright (c) 2005 Samuel Tardieu
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
27 #include "sh7750_regs.h"
28 #include "sh7750_regnames.h"
32 uint8_t length; /* Number of characters in the FIFO */
33 uint8_t write_idx; /* Index of first character to write */
34 uint8_t read_idx; /* Index of first character to read */
39 typedef struct SH7750State {
42 /* Peripheral frequency in Hz */
44 /* SDRAM controller */
46 /* First serial port */
47 CharDriverState *serial1;
54 uint8_t sctsr1_loaded;
57 /* Second serial port */
58 CharDriverState *serial2;
65 fifo serial2_receive_fifo;
66 fifo serial2_transmit_fifo;
78 uint16_t portdira; /* Cached */
79 uint16_t portpullupa; /* Cached */
80 uint16_t portdirb; /* Cached */
81 uint16_t portpullupb; /* Cached */
84 uint16_t periph_pdtra; /* Imposed by the peripherals */
85 uint16_t periph_portdira; /* Direction seen from the peripherals */
86 uint16_t periph_pdtrb; /* Imposed by the peripherals */
87 uint16_t periph_portdirb; /* Direction seen from the peripherals */
88 sh7750_io_device *devices[NB_DEVICES]; /* External peripherals */
93 /**********************************************************************
95 **********************************************************************/
97 /* XXXXX At this time, timer0 works in underflow only mode, that is
98 the value of tcnt0 is read at alarm computation time and cannot
99 be read back by the guest OS */
101 static void start_timer0(SH7750State * s)
103 uint64_t now, next, prescaler;
105 if ((s->tcr0 & 6) == 6) {
106 fprintf(stderr, "rtc clock for timer 0 not supported\n");
110 if ((s->tcr0 & 7) == 5) {
111 fprintf(stderr, "timer 0 configuration not supported\n");
115 if ((s->tcr0 & 4) == 4)
118 prescaler = 4 << (s->tcr0 & 3);
120 now = qemu_get_clock(vm_clock);
123 now + muldiv64(prescaler * s->tcnt0, ticks_per_sec,
127 fprintf(stderr, "now=%016" PRIx64 ", next=%016" PRIx64 "\n", now, next);
128 fprintf(stderr, "timer will underflow in %f seconds\n",
129 (float) (next - now) / (float) ticks_per_sec);
131 qemu_mod_timer(s->timer0, next);
134 static void timer_start_changed(SH7750State * s)
136 if (s->tstr & SH7750_TSTR_STR0) {
139 fprintf(stderr, "timer 0 is stopped\n");
140 qemu_del_timer(s->timer0);
144 static void timer0_cb(void *opaque)
146 SH7750State *s = opaque;
148 s->tcnt0 = (uint32_t) 0; /* XXXXX */
149 if (--s->tcnt0 == (uint32_t) - 1) {
150 fprintf(stderr, "timer 0 underflow\n");
152 s->tcr0 |= SH7750_TCR_UNF;
153 if (s->tcr0 & SH7750_TCR_UNIE) {
155 "interrupt generation for timer 0 not supported\n");
162 static void init_timers(SH7750State * s)
164 s->tcor0 = 0xffffffff;
165 s->tcnt0 = 0xffffffff;
166 s->timer0 = qemu_new_timer(vm_clock, &timer0_cb, s);
169 /**********************************************************************
171 **********************************************************************/
173 static int serial1_can_receive(void *opaque)
175 SH7750State *s = opaque;
177 return s->scscr1 & SH7750_SCSCR_RE;
180 static void serial1_receive_char(SH7750State * s, uint8_t c)
182 if (s->scssr1 & SH7750_SCSSR1_RDRF) {
183 s->scssr1 |= SH7750_SCSSR1_ORER;
188 s->scssr1 |= SH7750_SCSSR1_RDRF;
191 static void serial1_receive(void *opaque, const uint8_t * buf, int size)
193 SH7750State *s = opaque;
196 for (i = 0; i < size; i++) {
197 serial1_receive_char(s, buf[i]);
201 static void serial1_event(void *opaque, int event)
206 static void serial1_maybe_send(SH7750State * s)
210 if (s->scssr1 & SH7750_SCSSR1_TDRE)
213 s->scssr1 |= SH7750_SCSSR1_TDRE | SH7750_SCSSR1_TEND;
214 if (s->scscr1 & SH7750_SCSCR_TIE) {
215 fprintf(stderr, "interrupts for serial port 1 not implemented\n");
218 /* XXXXX Check for errors in write */
219 qemu_chr_write(s->serial1, &c, 1);
222 static void serial1_change_scssr1(SH7750State * s, uint8_t mem_value)
226 /* If transmit disable, TDRE and TEND stays up */
227 if ((s->scscr1 & SH7750_SCSCR_TE) == 0) {
228 mem_value |= SH7750_SCSSR1_TDRE | SH7750_SCSSR1_TEND;
231 /* Only clear bits which have been read before and do not set any bit
233 new_flags = s->scssr1 & ~s->scssr1_read; /* Preserve unread flags */
234 new_flags &= mem_value | ~s->scssr1_read; /* Clear read flags */
236 s->scssr1 = (new_flags & 0xf8) | (mem_value & 1);
237 s->scssr1_read &= mem_value;
239 /* If TDRE has been cleared, TEND will also be cleared */
240 if ((s->scssr1 & SH7750_SCSSR1_TDRE) == 0) {
241 s->scssr1 &= ~SH7750_SCSSR1_TEND;
244 /* Check for transmission to start */
245 serial1_maybe_send(s);
248 static void serial1_update_parameters(SH7750State * s)
250 QEMUSerialSetParams ssp;
252 if (s->scsmr1 & SH7750_SCSMR_CHR_7)
256 if (s->scsmr1 & SH7750_SCSMR_PE) {
257 if (s->scsmr1 & SH7750_SCSMR_PM_ODD)
263 if (s->scsmr1 & SH7750_SCSMR_STOP_2)
267 fprintf(stderr, "SCSMR1=%04x SCBRR1=%02x\n", s->scsmr1, s->scbrr1);
268 ssp.speed = s->periph_freq /
269 (32 * s->scbrr1 * (1 << (2 * (s->scsmr1 & 3)))) - 1;
270 fprintf(stderr, "data bits=%d, stop bits=%d, parity=%c, speed=%d\n",
271 ssp.data_bits, ssp.stop_bits, ssp.parity, ssp.speed);
272 qemu_chr_ioctl(s->serial1, CHR_IOCTL_SERIAL_SET_PARAMS, &ssp);
275 static void scscr1_changed(SH7750State * s)
277 if (s->scscr1 & (SH7750_SCSCR_TE | SH7750_SCSCR_RE)) {
279 fprintf(stderr, "serial port 1 not bound to anything\n");
282 serial1_update_parameters(s);
284 if ((s->scscr1 & SH7750_SCSCR_RE) == 0) {
285 s->scssr1 |= SH7750_SCSSR1_TDRE;
289 static void init_serial1(SH7750State * s, int serial_nb)
291 CharDriverState *chr;
294 chr = serial_hds[serial_nb];
297 "no serial port associated to SH7750 first serial port\n");
302 qemu_chr_add_read_handler(chr, serial1_can_receive,
304 qemu_chr_add_event_handler(chr, serial1_event);
307 /**********************************************************************
309 **********************************************************************/
311 static int serial2_can_receive(void *opaque)
313 SH7750State *s = opaque;
314 static uint8_t max_fifo_size[] = { 15, 1, 4, 6, 8, 10, 12, 14 };
316 return s->serial2_receive_fifo.length <
317 max_fifo_size[(s->scfcr2 >> 9) & 7];
320 static void serial2_adjust_receive_flags(SH7750State * s)
322 static uint8_t max_fifo_size[] = { 1, 4, 8, 14 };
324 /* XXXXX Add interrupt generation */
325 if (s->serial2_receive_fifo.length >=
326 max_fifo_size[(s->scfcr2 >> 7) & 3]) {
327 s->scfsr2 |= SH7750_SCFSR2_RDF;
328 s->scfsr2 &= ~SH7750_SCFSR2_DR;
330 s->scfsr2 &= ~SH7750_SCFSR2_RDF;
331 if (s->serial2_receive_fifo.length > 0)
332 s->scfsr2 |= SH7750_SCFSR2_DR;
334 s->scfsr2 &= ~SH7750_SCFSR2_DR;
338 static void serial2_append_char(SH7750State * s, uint8_t c)
340 if (s->serial2_receive_fifo.length == 16) {
342 s->sclsr2 |= SH7750_SCLSR2_ORER;
346 s->serial2_receive_fifo.data[s->serial2_receive_fifo.write_idx++] = c;
347 s->serial2_receive_fifo.length++;
348 serial2_adjust_receive_flags(s);
351 static void serial2_receive(void *opaque, const uint8_t * buf, int size)
353 SH7750State *s = opaque;
356 for (i = 0; i < size; i++)
357 serial2_append_char(s, buf[i]);
360 static void serial2_event(void *opaque, int event)
366 static void serial2_update_parameters(SH7750State * s)
368 QEMUSerialSetParams ssp;
370 if (s->scsmr2 & SH7750_SCSMR_CHR_7)
374 if (s->scsmr2 & SH7750_SCSMR_PE) {
375 if (s->scsmr2 & SH7750_SCSMR_PM_ODD)
381 if (s->scsmr2 & SH7750_SCSMR_STOP_2)
385 fprintf(stderr, "SCSMR2=%04x SCBRR2=%02x\n", s->scsmr2, s->scbrr2);
386 ssp.speed = s->periph_freq /
387 (32 * s->scbrr2 * (1 << (2 * (s->scsmr2 & 3)))) - 1;
388 fprintf(stderr, "data bits=%d, stop bits=%d, parity=%c, speed=%d\n",
389 ssp.data_bits, ssp.stop_bits, ssp.parity, ssp.speed);
390 qemu_chr_ioctl(s->serial2, CHR_IOCTL_SERIAL_SET_PARAMS, &ssp);
393 static void scscr2_changed(SH7750State * s)
395 if (s->scscr2 & (SH7750_SCSCR_TE | SH7750_SCSCR_RE)) {
397 fprintf(stderr, "serial port 2 not bound to anything\n");
400 serial2_update_parameters(s);
404 static void init_serial2(SH7750State * s, int serial_nb)
406 CharDriverState *chr;
410 chr = serial_hds[serial_nb];
413 "no serial port associated to SH7750 second serial port\n");
418 qemu_chr_add_read_handler(chr, serial2_can_receive,
420 qemu_chr_add_event_handler(chr, serial2_event);
423 static void init_serial_ports(SH7750State * s)
429 /**********************************************************************
431 **********************************************************************/
433 int sh7750_register_io_device(SH7750State * s, sh7750_io_device * device)
437 for (i = 0; i < NB_DEVICES; i++) {
438 if (s->devices[i] == NULL) {
439 s->devices[i] = device;
446 static uint16_t portdir(uint32_t v)
448 #define EVENPORTMASK(n) ((v & (1<<((n)<<1))) >> (n))
450 EVENPORTMASK(15) | EVENPORTMASK(14) | EVENPORTMASK(13) |
451 EVENPORTMASK(12) | EVENPORTMASK(11) | EVENPORTMASK(10) |
452 EVENPORTMASK(9) | EVENPORTMASK(8) | EVENPORTMASK(7) |
453 EVENPORTMASK(6) | EVENPORTMASK(5) | EVENPORTMASK(4) |
454 EVENPORTMASK(3) | EVENPORTMASK(2) | EVENPORTMASK(1) |
458 static uint16_t portpullup(uint32_t v)
460 #define ODDPORTMASK(n) ((v & (1<<(((n)<<1)+1))) >> (n))
462 ODDPORTMASK(15) | ODDPORTMASK(14) | ODDPORTMASK(13) |
463 ODDPORTMASK(12) | ODDPORTMASK(11) | ODDPORTMASK(10) |
464 ODDPORTMASK(9) | ODDPORTMASK(8) | ODDPORTMASK(7) | ODDPORTMASK(6) |
465 ODDPORTMASK(5) | ODDPORTMASK(4) | ODDPORTMASK(3) | ODDPORTMASK(2) |
466 ODDPORTMASK(1) | ODDPORTMASK(0);
469 static uint16_t porta_lines(SH7750State * s)
471 return (s->portdira & s->pdtra) | /* CPU */
472 (s->periph_portdira & s->periph_pdtra) | /* Peripherals */
473 (~(s->portdira | s->periph_portdira) & s->portpullupa); /* Pullups */
476 static uint16_t portb_lines(SH7750State * s)
478 return (s->portdirb & s->pdtrb) | /* CPU */
479 (s->periph_portdirb & s->periph_pdtrb) | /* Peripherals */
480 (~(s->portdirb | s->periph_portdirb) & s->portpullupb); /* Pullups */
483 static void gen_port_interrupts(SH7750State * s)
485 /* XXXXX interrupts not generated */
488 static void porta_changed(SH7750State * s, uint16_t prev)
490 uint16_t currenta, changes;
494 fprintf(stderr, "porta changed from 0x%04x to 0x%04x\n",
495 prev, porta_lines(s));
496 fprintf(stderr, "pdtra=0x%04x, pctra=0x%08x\n", s->pdtra, s->pctra);
498 currenta = porta_lines(s);
499 if (currenta == prev)
501 changes = currenta ^ prev;
503 for (i = 0; i < NB_DEVICES; i++) {
504 if (s->devices[i] && (s->devices[i]->portamask_trigger & changes)) {
505 r |= s->devices[i]->port_change_cb(currenta, portb_lines(s),
509 &s->periph_portdirb);
514 gen_port_interrupts(s);
517 static void portb_changed(SH7750State * s, uint16_t prev)
519 uint16_t currentb, changes;
522 currentb = portb_lines(s);
523 if (currentb == prev)
525 changes = currentb ^ prev;
527 for (i = 0; i < NB_DEVICES; i++) {
528 if (s->devices[i] && (s->devices[i]->portbmask_trigger & changes)) {
529 r |= s->devices[i]->port_change_cb(portb_lines(s), currentb,
533 &s->periph_portdirb);
538 gen_port_interrupts(s);
541 /**********************************************************************
543 **********************************************************************/
545 static void error_access(const char *kind, target_phys_addr_t addr)
547 fprintf(stderr, "%s to %s (0x%08x) not supported\n",
548 kind, regname(addr), addr);
551 static void ignore_access(const char *kind, target_phys_addr_t addr)
553 fprintf(stderr, "%s to %s (0x%08x) ignored\n",
554 kind, regname(addr), addr);
557 static uint32_t sh7750_mem_readb(void *opaque, target_phys_addr_t addr)
559 SH7750State *s = opaque;
563 case SH7750_SCSSR1_A7:
567 case SH7750_SCRDR1_A7:
568 s->scssr1 &= ~SH7750_SCSSR1_RDRF;
571 error_access("byte read", addr);
576 static uint32_t sh7750_mem_readw(void *opaque, target_phys_addr_t addr)
578 SH7750State *s = opaque;
584 "Read access to refresh count register, incrementing\n");
588 case SH7750_SCLSR2_A7:
589 /* Read and clear overflow bit */
593 case SH7750_SCSFR2_A7:
595 case SH7750_PDTRA_A7:
596 return porta_lines(s);
597 case SH7750_PDTRB_A7:
598 return portb_lines(s);
600 error_access("word read", addr);
605 static uint32_t sh7750_mem_readl(void *opaque, target_phys_addr_t addr)
607 SH7750State *s = opaque;
610 case SH7750_MMUCR_A7:
611 return s->cpu->mmucr;
622 case SH7750_EXPEVT_A7:
623 return s->cpu->expevt;
624 case SH7750_INTEVT_A7:
625 return s->cpu->intevt;
628 case 0x1f000030: /* Processor version PVR */
629 return 0x00050000; /* SH7750R */
630 case 0x1f000040: /* Processor version CVR */
631 return 0x00110000; /* Minimum caches */
632 case 0x1f000044: /* Processor version PRR */
633 return 0x00000100; /* SH7750R */
635 error_access("long read", addr);
640 static void sh7750_mem_writeb(void *opaque, target_phys_addr_t addr,
643 SH7750State *s = opaque;
646 /* PRECHARGE ? XXXXX */
647 case SH7750_PRECHARGE0_A7:
648 case SH7750_PRECHARGE1_A7:
649 ignore_access("byte write", addr);
651 case SH7750_SCBRR2_A7:
652 s->scbrr2 = mem_value;
656 timer_start_changed(s);
658 case SH7750_SCSCR1_A7:
659 s->scscr1 = mem_value;
662 case SH7750_SCSMR1_A7:
663 s->scsmr1 = mem_value;
665 case SH7750_SCBRR1_A7:
666 s->scbrr1 = mem_value;
668 case SH7750_SCTDR1_A7:
669 s->scssr1 &= ~SH7750_SCSSR1_TEND;
670 s->sctdr1 = mem_value;
672 case SH7750_SCSSR1_A7:
673 serial1_change_scssr1(s, mem_value);
676 error_access("byte write", addr);
681 static void sh7750_mem_writew(void *opaque, target_phys_addr_t addr,
684 SH7750State *s = opaque;
688 /* SDRAM controller */
689 case SH7750_SCBRR1_A7:
690 case SH7750_SCBRR2_A7:
693 case SH7750_RTCOR_A7:
694 case SH7750_RTCNT_A7:
695 case SH7750_RTCSR_A7:
696 ignore_access("word write", addr);
699 case SH7750_PDTRA_A7:
700 temp = porta_lines(s);
701 s->pdtra = mem_value;
702 porta_changed(s, temp);
704 case SH7750_PDTRB_A7:
705 temp = portb_lines(s);
706 s->pdtrb = mem_value;
707 portb_changed(s, temp);
710 fprintf(stderr, "Write access to refresh count register\n");
713 case SH7750_SCLSR2_A7:
714 s->sclsr2 = mem_value;
716 case SH7750_SCSCR2_A7:
717 s->scscr2 = mem_value;
720 case SH7750_SCFCR2_A7:
721 s->scfcr2 = mem_value;
723 case SH7750_SCSMR2_A7:
724 s->scsmr2 = mem_value;
729 case SH7750_GPIOIC_A7:
730 s->gpioic = mem_value;
731 if (mem_value != 0) {
732 fprintf(stderr, "I/O interrupts not implemented\n");
737 error_access("word write", addr);
742 static void sh7750_mem_writel(void *opaque, target_phys_addr_t addr,
745 SH7750State *s = opaque;
749 /* SDRAM controller */
756 ignore_access("long write", addr);
759 case SH7750_PCTRA_A7:
760 temp = porta_lines(s);
761 s->pctra = mem_value;
762 s->portdira = portdir(mem_value);
763 s->portpullupa = portpullup(mem_value);
764 porta_changed(s, temp);
766 case SH7750_PCTRB_A7:
767 temp = portb_lines(s);
768 s->pctrb = mem_value;
769 s->portdirb = portdir(mem_value);
770 s->portpullupb = portpullup(mem_value);
771 portb_changed(s, temp);
773 case SH7750_TCNT0_A7:
774 s->tcnt0 = mem_value & 0xf;
776 case SH7750_MMUCR_A7:
777 s->cpu->mmucr = mem_value;
780 s->cpu->pteh = mem_value;
783 s->cpu->ptel = mem_value;
786 s->cpu->ttb = mem_value;
789 s->cpu->tea = mem_value;
792 s->cpu->tra = mem_value & 0x000007ff;
794 case SH7750_EXPEVT_A7:
795 s->cpu->expevt = mem_value & 0x000007ff;
797 case SH7750_INTEVT_A7:
798 s->cpu->intevt = mem_value & 0x000007ff;
804 error_access("long write", addr);
809 static CPUReadMemoryFunc *sh7750_mem_read[] = {
815 static CPUWriteMemoryFunc *sh7750_mem_write[] = {
821 SH7750State *sh7750_init(CPUSH4State * cpu)
824 int sh7750_io_memory;
826 s = qemu_mallocz(sizeof(SH7750State));
828 s->periph_freq = 60000000; /* 60MHz */
829 sh7750_io_memory = cpu_register_io_memory(0,
831 sh7750_mem_write, s);
832 cpu_register_physical_memory(0x1c000000, 0x04000000, sh7750_io_memory);
834 init_serial_ports(s);