Commit 75554a3ca10a7ad295d2a3d2e14ee6ba90f94c8b
1 parent
b031ebc5
Allow attaching devices to OMAP UARTs.
Also avoid two signedness warnings in hw/omap2.c. The API to attach new devices to serials is fine, bu the implementation is a hack. git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5263 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
3 changed files
with
17 additions
and
4 deletions
hw/omap.h
@@ -660,6 +660,7 @@ struct omap_uart_s *omap2_uart_init(struct omap_target_agent_s *ta, | @@ -660,6 +660,7 @@ struct omap_uart_s *omap2_uart_init(struct omap_target_agent_s *ta, | ||
660 | qemu_irq irq, omap_clk fclk, omap_clk iclk, | 660 | qemu_irq irq, omap_clk fclk, omap_clk iclk, |
661 | qemu_irq txdma, qemu_irq rxdma, CharDriverState *chr); | 661 | qemu_irq txdma, qemu_irq rxdma, CharDriverState *chr); |
662 | void omap_uart_reset(struct omap_uart_s *s); | 662 | void omap_uart_reset(struct omap_uart_s *s); |
663 | +void omap_uart_attach(struct omap_uart_s *s, CharDriverState *chr); | ||
663 | 664 | ||
664 | struct omap_mpuio_s; | 665 | struct omap_mpuio_s; |
665 | struct omap_mpuio_s *omap_mpuio_init(target_phys_addr_t base, | 666 | struct omap_mpuio_s *omap_mpuio_init(target_phys_addr_t base, |
hw/omap1.c
@@ -1983,6 +1983,8 @@ struct omap_uart_s { | @@ -1983,6 +1983,8 @@ struct omap_uart_s { | ||
1983 | SerialState *serial; /* TODO */ | 1983 | SerialState *serial; /* TODO */ |
1984 | struct omap_target_agent_s *ta; | 1984 | struct omap_target_agent_s *ta; |
1985 | target_phys_addr_t base; | 1985 | target_phys_addr_t base; |
1986 | + omap_clk fclk; | ||
1987 | + qemu_irq irq; | ||
1986 | 1988 | ||
1987 | uint8_t eblr; | 1989 | uint8_t eblr; |
1988 | uint8_t syscontrol; | 1990 | uint8_t syscontrol; |
@@ -2007,6 +2009,9 @@ struct omap_uart_s *omap_uart_init(target_phys_addr_t base, | @@ -2007,6 +2009,9 @@ struct omap_uart_s *omap_uart_init(target_phys_addr_t base, | ||
2007 | struct omap_uart_s *s = (struct omap_uart_s *) | 2009 | struct omap_uart_s *s = (struct omap_uart_s *) |
2008 | qemu_mallocz(sizeof(struct omap_uart_s)); | 2010 | qemu_mallocz(sizeof(struct omap_uart_s)); |
2009 | 2011 | ||
2012 | + s->base = base; | ||
2013 | + s->fclk = fclk; | ||
2014 | + s->irq = irq; | ||
2010 | s->serial = serial_mm_init(base, 2, irq, omap_clk_getrate(fclk)/16, | 2015 | s->serial = serial_mm_init(base, 2, irq, omap_clk_getrate(fclk)/16, |
2011 | chr ?: qemu_chr_open("null"), 1); | 2016 | chr ?: qemu_chr_open("null"), 1); |
2012 | 2017 | ||
@@ -2108,13 +2113,20 @@ struct omap_uart_s *omap2_uart_init(struct omap_target_agent_s *ta, | @@ -2108,13 +2113,20 @@ struct omap_uart_s *omap2_uart_init(struct omap_target_agent_s *ta, | ||
2108 | omap_uart_writefn, s); | 2113 | omap_uart_writefn, s); |
2109 | 2114 | ||
2110 | s->ta = ta; | 2115 | s->ta = ta; |
2111 | - s->base = base; | ||
2112 | 2116 | ||
2113 | cpu_register_physical_memory(s->base + 0x20, 0x100, iomemtype); | 2117 | cpu_register_physical_memory(s->base + 0x20, 0x100, iomemtype); |
2114 | 2118 | ||
2115 | return s; | 2119 | return s; |
2116 | } | 2120 | } |
2117 | 2121 | ||
2122 | +void omap_uart_attach(struct omap_uart_s *s, CharDriverState *chr) | ||
2123 | +{ | ||
2124 | + /* TODO: Should reuse or destroy current s->serial */ | ||
2125 | + s->serial = serial_mm_init(s->base, 2, s->irq, | ||
2126 | + omap_clk_getrate(s->fclk) / 16, | ||
2127 | + chr ?: qemu_chr_open("null"), 1); | ||
2128 | +} | ||
2129 | + | ||
2118 | /* MPU Clock/Reset/Power Mode Control */ | 2130 | /* MPU Clock/Reset/Power Mode Control */ |
2119 | static uint32_t omap_clkm_read(void *opaque, target_phys_addr_t addr) | 2131 | static uint32_t omap_clkm_read(void *opaque, target_phys_addr_t addr) |
2120 | { | 2132 | { |
hw/omap2.c
@@ -156,7 +156,7 @@ static inline void omap_gp_timer_trigger(struct omap_gp_timer_s *timer) | @@ -156,7 +156,7 @@ static inline void omap_gp_timer_trigger(struct omap_gp_timer_s *timer) | ||
156 | { | 156 | { |
157 | if (timer->pt) | 157 | if (timer->pt) |
158 | /* TODO in overflow-and-match mode if the first event to | 158 | /* TODO in overflow-and-match mode if the first event to |
159 | - * occurs is the match, don't toggle. */ | 159 | + * occur is the match, don't toggle. */ |
160 | omap_gp_timer_out(timer, !timer->out_val); | 160 | omap_gp_timer_out(timer, !timer->out_val); |
161 | else | 161 | else |
162 | /* TODO inverted pulse on timer->out_val == 1? */ | 162 | /* TODO inverted pulse on timer->out_val == 1? */ |
@@ -2151,12 +2151,12 @@ static void omap_sti_fifo_write(void *opaque, target_phys_addr_t addr, | @@ -2151,12 +2151,12 @@ static void omap_sti_fifo_write(void *opaque, target_phys_addr_t addr, | ||
2151 | 2151 | ||
2152 | if (ch == STI_TRACE_CONTROL_CHANNEL) { | 2152 | if (ch == STI_TRACE_CONTROL_CHANNEL) { |
2153 | /* Flush channel <i>value</i>. */ | 2153 | /* Flush channel <i>value</i>. */ |
2154 | - qemu_chr_write(s->chr, "\r", 1); | 2154 | + qemu_chr_write(s->chr, (const uint8_t *) "\r", 1); |
2155 | } else if (ch == STI_TRACE_CONSOLE_CHANNEL || 1) { | 2155 | } else if (ch == STI_TRACE_CONSOLE_CHANNEL || 1) { |
2156 | if (value == 0xc0 || value == 0xc3) { | 2156 | if (value == 0xc0 || value == 0xc3) { |
2157 | /* Open channel <i>ch</i>. */ | 2157 | /* Open channel <i>ch</i>. */ |
2158 | } else if (value == 0x00) | 2158 | } else if (value == 0x00) |
2159 | - qemu_chr_write(s->chr, "\n", 1); | 2159 | + qemu_chr_write(s->chr, (const uint8_t *) "\n", 1); |
2160 | else | 2160 | else |
2161 | qemu_chr_write(s->chr, &byte, 1); | 2161 | qemu_chr_write(s->chr, &byte, 1); |
2162 | } | 2162 | } |