Revision 8da3ff18 hw/mcf5208.c
b/hw/mcf5208.c | ||
---|---|---|
40 | 40 |
qemu_irq_lower(s->irq); |
41 | 41 |
} |
42 | 42 |
|
43 |
static void m5208_timer_write(m5208_timer_state *s, int offset,
|
|
43 |
static void m5208_timer_write(void *opaque, target_phys_addr_t offset,
|
|
44 | 44 |
uint32_t value) |
45 | 45 |
{ |
46 |
m5208_timer_state *s = (m5208_timer_state *)opaque; |
|
46 | 47 |
int prescale; |
47 | 48 |
int limit; |
48 | 49 |
switch (offset) { |
... | ... | |
88 | 89 |
case 4: |
89 | 90 |
break; |
90 | 91 |
default: |
91 |
/* Should never happen. */ |
|
92 |
abort(); |
|
92 |
cpu_abort(cpu_single_env, "m5208_timer_write: Bad offset 0x%x\n", |
|
93 |
(int)offset); |
|
94 |
break; |
|
93 | 95 |
} |
94 | 96 |
m5208_timer_update(s); |
95 | 97 |
} |
... | ... | |
101 | 103 |
m5208_timer_update(s); |
102 | 104 |
} |
103 | 105 |
|
104 |
typedef struct { |
|
105 |
m5208_timer_state timer[2]; |
|
106 |
} m5208_sys_state; |
|
106 |
static uint32_t m5208_timer_read(void *opaque, target_phys_addr_t addr) |
|
107 |
{ |
|
108 |
m5208_timer_state *s = (m5208_timer_state *)opaque; |
|
109 |
switch (addr) { |
|
110 |
case 0: |
|
111 |
return s->pcsr; |
|
112 |
case 2: |
|
113 |
return s->pmr; |
|
114 |
case 4: |
|
115 |
return ptimer_get_count(s->timer); |
|
116 |
default: |
|
117 |
cpu_abort(cpu_single_env, "m5208_timer_read: Bad offset 0x%x\n", |
|
118 |
(int)addr); |
|
119 |
return 0; |
|
120 |
} |
|
121 |
} |
|
122 |
|
|
123 |
static CPUReadMemoryFunc *m5208_timer_readfn[] = { |
|
124 |
m5208_timer_read, |
|
125 |
m5208_timer_read, |
|
126 |
m5208_timer_read |
|
127 |
}; |
|
128 |
|
|
129 |
static CPUWriteMemoryFunc *m5208_timer_writefn[] = { |
|
130 |
m5208_timer_write, |
|
131 |
m5208_timer_write, |
|
132 |
m5208_timer_write |
|
133 |
}; |
|
107 | 134 |
|
108 | 135 |
static uint32_t m5208_sys_read(void *opaque, target_phys_addr_t addr) |
109 | 136 |
{ |
110 |
m5208_sys_state *s = (m5208_sys_state *)opaque; |
|
111 | 137 |
switch (addr) { |
112 |
/* PIT0 */ |
|
113 |
case 0xfc080000: |
|
114 |
return s->timer[0].pcsr; |
|
115 |
case 0xfc080002: |
|
116 |
return s->timer[0].pmr; |
|
117 |
case 0xfc080004: |
|
118 |
return ptimer_get_count(s->timer[0].timer); |
|
119 |
/* PIT1 */ |
|
120 |
case 0xfc084000: |
|
121 |
return s->timer[1].pcsr; |
|
122 |
case 0xfc084002: |
|
123 |
return s->timer[1].pmr; |
|
124 |
case 0xfc084004: |
|
125 |
return ptimer_get_count(s->timer[1].timer); |
|
126 |
|
|
127 |
/* SDRAM Controller. */ |
|
128 |
case 0xfc0a8110: /* SDCS0 */ |
|
138 |
case 0x110: /* SDCS0 */ |
|
129 | 139 |
{ |
130 | 140 |
int n; |
131 | 141 |
for (n = 0; n < 32; n++) { |
... | ... | |
134 | 144 |
} |
135 | 145 |
return (n - 1) | 0x40000000; |
136 | 146 |
} |
137 |
case 0xfc0a8114: /* SDCS1 */
|
|
147 |
case 0x114: /* SDCS1 */ |
|
138 | 148 |
return 0; |
139 | 149 |
|
140 | 150 |
default: |
... | ... | |
147 | 157 |
static void m5208_sys_write(void *opaque, target_phys_addr_t addr, |
148 | 158 |
uint32_t value) |
149 | 159 |
{ |
150 |
m5208_sys_state *s = (m5208_sys_state *)opaque; |
|
151 |
switch (addr) { |
|
152 |
/* PIT0 */ |
|
153 |
case 0xfc080000: |
|
154 |
case 0xfc080002: |
|
155 |
case 0xfc080004: |
|
156 |
m5208_timer_write(&s->timer[0], addr & 0xf, value); |
|
157 |
return; |
|
158 |
/* PIT1 */ |
|
159 |
case 0xfc084000: |
|
160 |
case 0xfc084002: |
|
161 |
case 0xfc084004: |
|
162 |
m5208_timer_write(&s->timer[1], addr & 0xf, value); |
|
163 |
return; |
|
164 |
default: |
|
165 |
cpu_abort(cpu_single_env, "m5208_sys_write: Bad offset 0x%x\n", |
|
166 |
(int)addr); |
|
167 |
break; |
|
168 |
} |
|
160 |
cpu_abort(cpu_single_env, "m5208_sys_write: Bad offset 0x%x\n", |
|
161 |
(int)addr); |
|
169 | 162 |
} |
170 | 163 |
|
171 | 164 |
static CPUReadMemoryFunc *m5208_sys_readfn[] = { |
... | ... | |
183 | 176 |
static void mcf5208_sys_init(qemu_irq *pic) |
184 | 177 |
{ |
185 | 178 |
int iomemtype; |
186 |
m5208_sys_state *s;
|
|
179 |
m5208_timer_state *s;
|
|
187 | 180 |
QEMUBH *bh; |
188 | 181 |
int i; |
189 | 182 |
|
190 |
s = (m5208_sys_state *)qemu_mallocz(sizeof(m5208_sys_state)); |
|
191 | 183 |
iomemtype = cpu_register_io_memory(0, m5208_sys_readfn, |
192 |
m5208_sys_writefn, s);
|
|
184 |
m5208_sys_writefn, NULL);
|
|
193 | 185 |
/* SDRAMC. */ |
194 | 186 |
cpu_register_physical_memory(0xfc0a8000, 0x00004000, iomemtype); |
195 | 187 |
/* Timers. */ |
196 | 188 |
for (i = 0; i < 2; i++) { |
197 |
bh = qemu_bh_new(m5208_timer_trigger, &s->timer[i]); |
|
198 |
s->timer[i].timer = ptimer_init(bh); |
|
189 |
s = (m5208_timer_state *)qemu_mallocz(sizeof(m5208_timer_state)); |
|
190 |
bh = qemu_bh_new(m5208_timer_trigger, s); |
|
191 |
s->timer = ptimer_init(bh); |
|
192 |
iomemtype = cpu_register_io_memory(0, m5208_timer_readfn, |
|
193 |
m5208_timer_writefn, s); |
|
199 | 194 |
cpu_register_physical_memory(0xfc080000 + 0x4000 * i, 0x00004000, |
200 | 195 |
iomemtype); |
201 |
s->timer[i].irq = pic[4 + i];
|
|
196 |
s->irq = pic[4 + i]; |
|
202 | 197 |
} |
203 | 198 |
} |
204 | 199 |
|
Also available in: Unified diff