Commit b6cd0ea1205dd4623ccfe796ee6c1a4da3141d99

Authored by aurel32
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
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 }
@@ -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
@@ -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)