Commit b6cd0ea1205dd4623ccfe796ee6c1a4da3141d99
1 parent
6936bfe5
8250: Customized base baudrate
(Jan Kiszka) git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4336 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
14 changed files
with
36 additions
and
25 deletions
hw/mips_jazz.c
@@ -234,9 +234,9 @@ void mips_jazz_init (ram_addr_t ram_size, int vga_ram_size, | @@ -234,9 +234,9 @@ void mips_jazz_init (ram_addr_t ram_size, int vga_ram_size, | ||
234 | 234 | ||
235 | /* Serial ports */ | 235 | /* Serial ports */ |
236 | if (serial_hds[0]) | 236 | if (serial_hds[0]) |
237 | - serial_mm_init(0x80006000, 0, rc4030[8], serial_hds[0], 1); | 237 | + serial_mm_init(0x80006000, 0, rc4030[8], 8000000/16, serial_hds[0], 1); |
238 | if (serial_hds[1]) | 238 | if (serial_hds[1]) |
239 | - serial_mm_init(0x80007000, 0, rc4030[9], serial_hds[1], 1); | 239 | + serial_mm_init(0x80007000, 0, rc4030[9], 8000000/16, serial_hds[1], 1); |
240 | 240 | ||
241 | /* Parallel port */ | 241 | /* Parallel port */ |
242 | if (parallel_hds[0]) | 242 | if (parallel_hds[0]) |
hw/mips_malta.c
@@ -449,7 +449,8 @@ static MaltaFPGAState *malta_fpga_init(target_phys_addr_t base, CPUState *env) | @@ -449,7 +449,8 @@ static MaltaFPGAState *malta_fpga_init(target_phys_addr_t base, CPUState *env) | ||
449 | 449 | ||
450 | uart_chr = qemu_chr_open("vc:80Cx24C"); | 450 | uart_chr = qemu_chr_open("vc:80Cx24C"); |
451 | qemu_chr_printf(uart_chr, "CBUS UART\r\n"); | 451 | qemu_chr_printf(uart_chr, "CBUS UART\r\n"); |
452 | - s->uart = serial_mm_init(base + 0x900, 3, env->irq[2], uart_chr, 1); | 452 | + s->uart = |
453 | + serial_mm_init(base + 0x900, 3, env->irq[2], 230400, uart_chr, 1); | ||
453 | 454 | ||
454 | malta_fpga_reset(s); | 455 | malta_fpga_reset(s); |
455 | qemu_register_reset(malta_fpga_reset, s); | 456 | qemu_register_reset(malta_fpga_reset, s); |
@@ -918,9 +919,9 @@ void mips_malta_init (ram_addr_t ram_size, int vga_ram_size, | @@ -918,9 +919,9 @@ void mips_malta_init (ram_addr_t ram_size, int vga_ram_size, | ||
918 | i8042_init(i8259[1], i8259[12], 0x60); | 919 | i8042_init(i8259[1], i8259[12], 0x60); |
919 | rtc_state = rtc_init(0x70, i8259[8]); | 920 | rtc_state = rtc_init(0x70, i8259[8]); |
920 | if (serial_hds[0]) | 921 | if (serial_hds[0]) |
921 | - serial_init(0x3f8, i8259[4], serial_hds[0]); | 922 | + serial_init(0x3f8, i8259[4], 115200, serial_hds[0]); |
922 | if (serial_hds[1]) | 923 | if (serial_hds[1]) |
923 | - serial_init(0x2f8, i8259[3], serial_hds[1]); | 924 | + serial_init(0x2f8, i8259[3], 115200, serial_hds[1]); |
924 | if (parallel_hds[0]) | 925 | if (parallel_hds[0]) |
925 | parallel_init(0x378, i8259[7], parallel_hds[0]); | 926 | parallel_init(0x378, i8259[7], parallel_hds[0]); |
926 | for(i = 0; i < MAX_FD; i++) { | 927 | for(i = 0; i < MAX_FD; i++) { |
hw/mips_mipssim.c
@@ -174,7 +174,7 @@ mips_mipssim_init (ram_addr_t ram_size, int vga_ram_size, | @@ -174,7 +174,7 @@ mips_mipssim_init (ram_addr_t ram_size, int vga_ram_size, | ||
174 | /* A single 16450 sits at offset 0x3f8. It is attached to | 174 | /* A single 16450 sits at offset 0x3f8. It is attached to |
175 | MIPS CPU INT2, which is interrupt 4. */ | 175 | MIPS CPU INT2, which is interrupt 4. */ |
176 | if (serial_hds[0]) | 176 | if (serial_hds[0]) |
177 | - serial_init(0x3f8, env->irq[4], serial_hds[0]); | 177 | + serial_init(0x3f8, env->irq[4], 115200, serial_hds[0]); |
178 | 178 | ||
179 | if (nd_table[0].vlan) { | 179 | if (nd_table[0].vlan) { |
180 | if (nd_table[0].model == NULL | 180 | if (nd_table[0].model == NULL |
hw/mips_r4k.c
@@ -241,7 +241,8 @@ void mips_r4k_init (ram_addr_t ram_size, int vga_ram_size, | @@ -241,7 +241,8 @@ void mips_r4k_init (ram_addr_t ram_size, int vga_ram_size, | ||
241 | 241 | ||
242 | for(i = 0; i < MAX_SERIAL_PORTS; i++) { | 242 | for(i = 0; i < MAX_SERIAL_PORTS; i++) { |
243 | if (serial_hds[i]) { | 243 | if (serial_hds[i]) { |
244 | - serial_init(serial_io[i], i8259[serial_irq[i]], serial_hds[i]); | 244 | + serial_init(serial_io[i], i8259[serial_irq[i]], 115200, |
245 | + serial_hds[i]); | ||
245 | } | 246 | } |
246 | } | 247 | } |
247 | 248 |
hw/musicpal.c
@@ -1448,10 +1448,10 @@ static void musicpal_init(ram_addr_t ram_size, int vga_ram_size, | @@ -1448,10 +1448,10 @@ static void musicpal_init(ram_addr_t ram_size, int vga_ram_size, | ||
1448 | mv88w8618_pit_init(MP_PIT_BASE, pic, MP_TIMER1_IRQ); | 1448 | mv88w8618_pit_init(MP_PIT_BASE, pic, MP_TIMER1_IRQ); |
1449 | 1449 | ||
1450 | if (serial_hds[0]) | 1450 | if (serial_hds[0]) |
1451 | - serial_mm_init(MP_UART1_BASE, 2, pic[MP_UART1_IRQ], /*1825000,*/ | 1451 | + serial_mm_init(MP_UART1_BASE, 2, pic[MP_UART1_IRQ], 1825000, |
1452 | serial_hds[0], 1); | 1452 | serial_hds[0], 1); |
1453 | if (serial_hds[1]) | 1453 | if (serial_hds[1]) |
1454 | - serial_mm_init(MP_UART2_BASE, 2, pic[MP_UART2_IRQ], /*1825000,*/ | 1454 | + serial_mm_init(MP_UART2_BASE, 2, pic[MP_UART2_IRQ], 1825000, |
1455 | serial_hds[1], 1); | 1455 | serial_hds[1], 1); |
1456 | 1456 | ||
1457 | /* Register flash */ | 1457 | /* Register flash */ |
hw/omap1.c
@@ -2006,7 +2006,8 @@ struct omap_uart_s *omap_uart_init(target_phys_addr_t base, | @@ -2006,7 +2006,8 @@ struct omap_uart_s *omap_uart_init(target_phys_addr_t base, | ||
2006 | struct omap_uart_s *s = (struct omap_uart_s *) | 2006 | struct omap_uart_s *s = (struct omap_uart_s *) |
2007 | qemu_mallocz(sizeof(struct omap_uart_s)); | 2007 | qemu_mallocz(sizeof(struct omap_uart_s)); |
2008 | 2008 | ||
2009 | - s->serial = serial_mm_init(base, 2, irq, chr ?: qemu_chr_open("null"), 1); | 2009 | + s->serial = serial_mm_init(base, 2, irq, omap_clk_getrate(fclk)/16, |
2010 | + chr ?: qemu_chr_open("null"), 1); | ||
2010 | 2011 | ||
2011 | return s; | 2012 | return s; |
2012 | } | 2013 | } |
hw/pc.c
@@ -930,7 +930,8 @@ static void pc_init1(ram_addr_t ram_size, int vga_ram_size, | @@ -930,7 +930,8 @@ static void pc_init1(ram_addr_t ram_size, int vga_ram_size, | ||
930 | 930 | ||
931 | for(i = 0; i < MAX_SERIAL_PORTS; i++) { | 931 | for(i = 0; i < MAX_SERIAL_PORTS; i++) { |
932 | if (serial_hds[i]) { | 932 | if (serial_hds[i]) { |
933 | - serial_init(serial_io[i], i8259[serial_irq[i]], serial_hds[i]); | 933 | + serial_init(serial_io[i], i8259[serial_irq[i]], 115200, |
934 | + serial_hds[i]); | ||
934 | } | 935 | } |
935 | } | 936 | } |
936 | 937 |
hw/pc.h
@@ -4,10 +4,11 @@ | @@ -4,10 +4,11 @@ | ||
4 | 4 | ||
5 | /* serial.c */ | 5 | /* serial.c */ |
6 | 6 | ||
7 | -SerialState *serial_init(int base, qemu_irq irq, CharDriverState *chr); | 7 | +SerialState *serial_init(int base, qemu_irq irq, int baudbase, |
8 | + CharDriverState *chr); | ||
8 | SerialState *serial_mm_init (target_phys_addr_t base, int it_shift, | 9 | SerialState *serial_mm_init (target_phys_addr_t base, int it_shift, |
9 | - qemu_irq irq, CharDriverState *chr, | ||
10 | - int ioregister); | 10 | + qemu_irq irq, int baudbase, |
11 | + CharDriverState *chr, int ioregister); | ||
11 | uint32_t serial_mm_readb (void *opaque, target_phys_addr_t addr); | 12 | uint32_t serial_mm_readb (void *opaque, target_phys_addr_t addr); |
12 | void serial_mm_writeb (void *opaque, target_phys_addr_t addr, uint32_t value); | 13 | void serial_mm_writeb (void *opaque, target_phys_addr_t addr, uint32_t value); |
13 | uint32_t serial_mm_readw (void *opaque, target_phys_addr_t addr); | 14 | uint32_t serial_mm_readw (void *opaque, target_phys_addr_t addr); |
hw/ppc405_uc.c
@@ -1223,7 +1223,7 @@ void ppc405_serial_init (CPUState *env, ppc4xx_mmio_t *mmio, | @@ -1223,7 +1223,7 @@ void ppc405_serial_init (CPUState *env, ppc4xx_mmio_t *mmio, | ||
1223 | #ifdef DEBUG_SERIAL | 1223 | #ifdef DEBUG_SERIAL |
1224 | printf("%s: offset " PADDRX "\n", __func__, offset); | 1224 | printf("%s: offset " PADDRX "\n", __func__, offset); |
1225 | #endif | 1225 | #endif |
1226 | - serial = serial_mm_init(offset, 0, irq, chr, 0); | 1226 | + serial = serial_mm_init(offset, 0, irq, 399193, chr, 0); |
1227 | ppc4xx_mmio_register(env, mmio, offset, 0x008, | 1227 | ppc4xx_mmio_register(env, mmio, offset, 0x008, |
1228 | serial_mm_read, serial_mm_write, serial); | 1228 | serial_mm_read, serial_mm_write, serial); |
1229 | } | 1229 | } |
hw/ppc_chrp.c
@@ -264,7 +264,7 @@ static void ppc_core99_init (ram_addr_t ram_size, int vga_ram_size, | @@ -264,7 +264,7 @@ static void ppc_core99_init (ram_addr_t ram_size, int vga_ram_size, | ||
264 | dummy_irq = i8259_init(NULL); | 264 | dummy_irq = i8259_init(NULL); |
265 | 265 | ||
266 | /* XXX: use Mac Serial port */ | 266 | /* XXX: use Mac Serial port */ |
267 | - serial_init(0x3f8, dummy_irq[4], serial_hds[0]); | 267 | + serial_init(0x3f8, dummy_irq[4], 115200, serial_hds[0]); |
268 | for(i = 0; i < nb_nics; i++) { | 268 | for(i = 0; i < nb_nics; i++) { |
269 | if (!nd_table[i].model) | 269 | if (!nd_table[i].model) |
270 | nd_table[i].model = "ne2k_pci"; | 270 | nd_table[i].model = "ne2k_pci"; |
hw/ppc_oldworld.c
@@ -287,7 +287,7 @@ static void ppc_heathrow_init (ram_addr_t ram_size, int vga_ram_size, | @@ -287,7 +287,7 @@ static void ppc_heathrow_init (ram_addr_t ram_size, int vga_ram_size, | ||
287 | dummy_irq = i8259_init(NULL); | 287 | dummy_irq = i8259_init(NULL); |
288 | 288 | ||
289 | /* XXX: use Mac Serial port */ | 289 | /* XXX: use Mac Serial port */ |
290 | - serial_init(0x3f8, dummy_irq[4], serial_hds[0]); | 290 | + serial_init(0x3f8, dummy_irq[4], 115200, serial_hds[0]); |
291 | 291 | ||
292 | for(i = 0; i < nb_nics; i++) { | 292 | for(i = 0; i < nb_nics; i++) { |
293 | if (!nd_table[i].model) | 293 | if (!nd_table[i].model) |
hw/ppc_prep.c
@@ -667,7 +667,7 @@ static void ppc_prep_init (ram_addr_t ram_size, int vga_ram_size, | @@ -667,7 +667,7 @@ static void ppc_prep_init (ram_addr_t ram_size, int vga_ram_size, | ||
667 | // pit = pit_init(0x40, i8259[0]); | 667 | // pit = pit_init(0x40, i8259[0]); |
668 | rtc_init(0x70, i8259[8]); | 668 | rtc_init(0x70, i8259[8]); |
669 | 669 | ||
670 | - serial_init(0x3f8, i8259[4], serial_hds[0]); | 670 | + serial_init(0x3f8, i8259[4], 115200, serial_hds[0]); |
671 | nb_nics1 = nb_nics; | 671 | nb_nics1 = nb_nics; |
672 | if (nb_nics1 > NE2000_NB_MAX) | 672 | if (nb_nics1 > NE2000_NB_MAX) |
673 | nb_nics1 = NE2000_NB_MAX; | 673 | nb_nics1 = NE2000_NB_MAX; |
hw/pxa2xx.c
@@ -2077,7 +2077,8 @@ struct pxa2xx_state_s *pxa270_init(unsigned int sdram_size, | @@ -2077,7 +2077,8 @@ struct pxa2xx_state_s *pxa270_init(unsigned int sdram_size, | ||
2077 | for (i = 0; pxa270_serial[i].io_base; i ++) | 2077 | for (i = 0; pxa270_serial[i].io_base; i ++) |
2078 | if (serial_hds[i]) | 2078 | if (serial_hds[i]) |
2079 | serial_mm_init(pxa270_serial[i].io_base, 2, | 2079 | serial_mm_init(pxa270_serial[i].io_base, 2, |
2080 | - s->pic[pxa270_serial[i].irqn], serial_hds[i], 1); | 2080 | + s->pic[pxa270_serial[i].irqn], 14857000/16, |
2081 | + serial_hds[i], 1); | ||
2081 | else | 2082 | else |
2082 | break; | 2083 | break; |
2083 | if (serial_hds[i]) | 2084 | if (serial_hds[i]) |
@@ -2202,7 +2203,8 @@ struct pxa2xx_state_s *pxa255_init(unsigned int sdram_size, | @@ -2202,7 +2203,8 @@ struct pxa2xx_state_s *pxa255_init(unsigned int sdram_size, | ||
2202 | for (i = 0; pxa255_serial[i].io_base; i ++) | 2203 | for (i = 0; pxa255_serial[i].io_base; i ++) |
2203 | if (serial_hds[i]) | 2204 | if (serial_hds[i]) |
2204 | serial_mm_init(pxa255_serial[i].io_base, 2, | 2205 | serial_mm_init(pxa255_serial[i].io_base, 2, |
2205 | - s->pic[pxa255_serial[i].irqn], serial_hds[i], 1); | 2206 | + s->pic[pxa255_serial[i].irqn], 14745600/16, |
2207 | + serial_hds[i], 1); | ||
2206 | else | 2208 | else |
2207 | break; | 2209 | break; |
2208 | if (serial_hds[i]) | 2210 | if (serial_hds[i]) |
hw/serial.c
@@ -99,6 +99,7 @@ struct SerialState { | @@ -99,6 +99,7 @@ struct SerialState { | ||
99 | int last_break_enable; | 99 | int last_break_enable; |
100 | target_phys_addr_t base; | 100 | target_phys_addr_t base; |
101 | int it_shift; | 101 | int it_shift; |
102 | + int baudbase; | ||
102 | QEMUTimer *tx_timer; | 103 | QEMUTimer *tx_timer; |
103 | int tx_burst; | 104 | int tx_burst; |
104 | }; | 105 | }; |
@@ -135,7 +136,7 @@ static void serial_tx_done(void *opaque) | @@ -135,7 +136,7 @@ static void serial_tx_done(void *opaque) | ||
135 | 136 | ||
136 | /* We assume 10 bits/char, OK for this purpose. */ | 137 | /* We assume 10 bits/char, OK for this purpose. */ |
137 | s->tx_burst = THROTTLE_TX_INTERVAL * 1000 / | 138 | s->tx_burst = THROTTLE_TX_INTERVAL * 1000 / |
138 | - (1000000 * 10 / (115200 / divider)); | 139 | + (1000000 * 10 / (s->baudbase / divider)); |
139 | } | 140 | } |
140 | s->thr_ipending = 1; | 141 | s->thr_ipending = 1; |
141 | s->lsr |= UART_LSR_THRE; | 142 | s->lsr |= UART_LSR_THRE; |
@@ -163,7 +164,7 @@ static void serial_update_parameters(SerialState *s) | @@ -163,7 +164,7 @@ static void serial_update_parameters(SerialState *s) | ||
163 | data_bits = (s->lcr & 0x03) + 5; | 164 | data_bits = (s->lcr & 0x03) + 5; |
164 | if (s->divider == 0) | 165 | if (s->divider == 0) |
165 | return; | 166 | return; |
166 | - speed = 115200 / s->divider; | 167 | + speed = s->baudbase / s->divider; |
167 | ssp.speed = speed; | 168 | ssp.speed = speed; |
168 | ssp.parity = parity; | 169 | ssp.parity = parity; |
169 | ssp.data_bits = data_bits; | 170 | ssp.data_bits = data_bits; |
@@ -413,7 +414,8 @@ static void serial_reset(void *opaque) | @@ -413,7 +414,8 @@ static void serial_reset(void *opaque) | ||
413 | } | 414 | } |
414 | 415 | ||
415 | /* If fd is zero, it means that the serial device uses the console */ | 416 | /* If fd is zero, it means that the serial device uses the console */ |
416 | -SerialState *serial_init(int base, qemu_irq irq, CharDriverState *chr) | 417 | +SerialState *serial_init(int base, qemu_irq irq, int baudbase, |
418 | + CharDriverState *chr) | ||
417 | { | 419 | { |
418 | SerialState *s; | 420 | SerialState *s; |
419 | 421 | ||
@@ -421,6 +423,7 @@ SerialState *serial_init(int base, qemu_irq irq, CharDriverState *chr) | @@ -421,6 +423,7 @@ SerialState *serial_init(int base, qemu_irq irq, CharDriverState *chr) | ||
421 | if (!s) | 423 | if (!s) |
422 | return NULL; | 424 | return NULL; |
423 | s->irq = irq; | 425 | s->irq = irq; |
426 | + s->baudbase = baudbase; | ||
424 | 427 | ||
425 | s->tx_timer = qemu_new_timer(vm_clock, serial_tx_done, s); | 428 | s->tx_timer = qemu_new_timer(vm_clock, serial_tx_done, s); |
426 | if (!s->tx_timer) | 429 | if (!s->tx_timer) |
@@ -512,8 +515,8 @@ static CPUWriteMemoryFunc *serial_mm_write[] = { | @@ -512,8 +515,8 @@ static CPUWriteMemoryFunc *serial_mm_write[] = { | ||
512 | }; | 515 | }; |
513 | 516 | ||
514 | SerialState *serial_mm_init (target_phys_addr_t base, int it_shift, | 517 | SerialState *serial_mm_init (target_phys_addr_t base, int it_shift, |
515 | - qemu_irq irq, CharDriverState *chr, | ||
516 | - int ioregister) | 518 | + qemu_irq irq, int baudbase, |
519 | + CharDriverState *chr, int ioregister) | ||
517 | { | 520 | { |
518 | SerialState *s; | 521 | SerialState *s; |
519 | int s_io_memory; | 522 | int s_io_memory; |
@@ -524,6 +527,7 @@ SerialState *serial_mm_init (target_phys_addr_t base, int it_shift, | @@ -524,6 +527,7 @@ SerialState *serial_mm_init (target_phys_addr_t base, int it_shift, | ||
524 | s->irq = irq; | 527 | s->irq = irq; |
525 | s->base = base; | 528 | s->base = base; |
526 | s->it_shift = it_shift; | 529 | s->it_shift = it_shift; |
530 | + s->baudbase= baudbase; | ||
527 | 531 | ||
528 | s->tx_timer = qemu_new_timer(vm_clock, serial_tx_done, s); | 532 | s->tx_timer = qemu_new_timer(vm_clock, serial_tx_done, s); |
529 | if (!s->tx_timer) | 533 | if (!s->tx_timer) |