Commit c2432a42fe13c3c6774f5443ac8f6f7261fe91d1
1 parent
68af3f24
SH7750/51: add register BCR3, BCR4, PCR, RTCOR, RTCNT, RTCSR, SDMR2, SDMR3 and fix BCR2 support
Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6548 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
5 changed files
with
58 additions
and
14 deletions
hw/sh7750.c
... | ... | @@ -42,8 +42,12 @@ typedef struct SH7750State { |
42 | 42 | uint32_t periph_freq; |
43 | 43 | /* SDRAM controller */ |
44 | 44 | uint32_t bcr1; |
45 | - uint32_t bcr2; | |
45 | + uint16_t bcr2; | |
46 | + uint16_t bcr3; | |
47 | + uint32_t bcr4; | |
46 | 48 | uint16_t rfcr; |
49 | + /* PCMCIA controller */ | |
50 | + uint16_t pcr; | |
47 | 51 | /* IO ports */ |
48 | 52 | uint16_t gpioic; |
49 | 53 | uint32_t pctra; |
... | ... | @@ -66,7 +70,10 @@ typedef struct SH7750State { |
66 | 70 | struct intc_desc intc; |
67 | 71 | } SH7750State; |
68 | 72 | |
69 | - | |
73 | +static int inline has_bcr3_and_bcr4(SH7750State * s) | |
74 | +{ | |
75 | + return (s->cpu->features & SH_FEATURE_BCR3_AND_BCR4); | |
76 | +} | |
70 | 77 | /********************************************************************** |
71 | 78 | I/O ports |
72 | 79 | **********************************************************************/ |
... | ... | @@ -211,8 +218,14 @@ static uint32_t sh7750_mem_readw(void *opaque, target_phys_addr_t addr) |
211 | 218 | switch (addr) { |
212 | 219 | case SH7750_BCR2_A7: |
213 | 220 | return s->bcr2; |
221 | + case SH7750_BCR3_A7: | |
222 | + if(!has_bcr3_and_bcr4(s)) | |
223 | + error_access("word read", addr); | |
224 | + return s->bcr3; | |
214 | 225 | case SH7750_FRQCR_A7: |
215 | 226 | return 0; |
227 | + case SH7750_PCR_A7: | |
228 | + return s->pcr; | |
216 | 229 | case SH7750_RFCR_A7: |
217 | 230 | fprintf(stderr, |
218 | 231 | "Read access to refresh count register, incrementing\n"); |
... | ... | @@ -221,6 +234,11 @@ static uint32_t sh7750_mem_readw(void *opaque, target_phys_addr_t addr) |
221 | 234 | return porta_lines(s); |
222 | 235 | case SH7750_PDTRB_A7: |
223 | 236 | return portb_lines(s); |
237 | + case SH7750_RTCOR_A7: | |
238 | + case SH7750_RTCNT_A7: | |
239 | + case SH7750_RTCSR_A7: | |
240 | + ignore_access("word read", addr); | |
241 | + return 0; | |
224 | 242 | default: |
225 | 243 | error_access("word read", addr); |
226 | 244 | assert(0); |
... | ... | @@ -235,6 +253,9 @@ static uint32_t sh7750_mem_readl(void *opaque, target_phys_addr_t addr) |
235 | 253 | case SH7750_BCR1_A7: |
236 | 254 | return s->bcr1; |
237 | 255 | case SH7750_BCR4_A7: |
256 | + if(!has_bcr3_and_bcr4(s)) | |
257 | + error_access("long read", addr); | |
258 | + return s->bcr4; | |
238 | 259 | case SH7750_WCR1_A7: |
239 | 260 | case SH7750_WCR2_A7: |
240 | 261 | case SH7750_WCR3_A7: |
... | ... | @@ -271,19 +292,19 @@ static uint32_t sh7750_mem_readl(void *opaque, target_phys_addr_t addr) |
271 | 292 | } |
272 | 293 | } |
273 | 294 | |
295 | +#define is_in_sdrmx(a, x) (a >= SH7750_SDMR ## x ## _A7 \ | |
296 | + && a <= (SH7750_SDMR ## x ## _A7 + SH7750_SDMR ## x ## _REGNB)) | |
274 | 297 | static void sh7750_mem_writeb(void *opaque, target_phys_addr_t addr, |
275 | 298 | uint32_t mem_value) |
276 | 299 | { |
277 | - switch (addr) { | |
278 | - /* PRECHARGE ? XXXXX */ | |
279 | - case SH7750_PRECHARGE0_A7: | |
280 | - case SH7750_PRECHARGE1_A7: | |
300 | + | |
301 | + if (is_in_sdrmx(addr, 2) || is_in_sdrmx(addr, 3)) { | |
281 | 302 | ignore_access("byte write", addr); |
282 | 303 | return; |
283 | - default: | |
284 | - error_access("byte write", addr); | |
285 | - assert(0); | |
286 | 304 | } |
305 | + | |
306 | + error_access("byte write", addr); | |
307 | + assert(0); | |
287 | 308 | } |
288 | 309 | |
289 | 310 | static void sh7750_mem_writew(void *opaque, target_phys_addr_t addr, |
... | ... | @@ -298,8 +319,15 @@ static void sh7750_mem_writew(void *opaque, target_phys_addr_t addr, |
298 | 319 | s->bcr2 = mem_value; |
299 | 320 | return; |
300 | 321 | case SH7750_BCR3_A7: |
301 | - case SH7750_RTCOR_A7: | |
322 | + if(!has_bcr3_and_bcr4(s)) | |
323 | + error_access("word write", addr); | |
324 | + s->bcr3 = mem_value; | |
325 | + return; | |
326 | + case SH7750_PCR_A7: | |
327 | + s->pcr = mem_value; | |
328 | + return; | |
302 | 329 | case SH7750_RTCNT_A7: |
330 | + case SH7750_RTCOR_A7: | |
303 | 331 | case SH7750_RTCSR_A7: |
304 | 332 | ignore_access("word write", addr); |
305 | 333 | return; |
... | ... | @@ -343,6 +371,10 @@ static void sh7750_mem_writel(void *opaque, target_phys_addr_t addr, |
343 | 371 | s->bcr1 = mem_value; |
344 | 372 | return; |
345 | 373 | case SH7750_BCR4_A7: |
374 | + if(!has_bcr3_and_bcr4(s)) | |
375 | + error_access("long write", addr); | |
376 | + s->bcr4 = mem_value; | |
377 | + return; | |
346 | 378 | case SH7750_WCR1_A7: |
347 | 379 | case SH7750_WCR2_A7: |
348 | 380 | case SH7750_WCR3_A7: | ... | ... |
hw/sh7750_regnames.c
... | ... | @@ -80,8 +80,8 @@ static regname_t regnames[] = { |
80 | 80 | REGNAME(SH7750_ICR_A7) |
81 | 81 | REGNAME(SH7750_BCR3_A7) |
82 | 82 | REGNAME(SH7750_BCR4_A7) |
83 | - REGNAME(SH7750_PRECHARGE0_A7) | |
84 | - REGNAME(SH7750_PRECHARGE1_A7) {(uint32_t) - 1, 0} | |
83 | + REGNAME(SH7750_SDMR2_A7) | |
84 | + REGNAME(SH7750_SDMR3_A7) {(uint32_t) - 1, 0} | |
85 | 85 | }; |
86 | 86 | |
87 | 87 | const char *regname(uint32_t addr) | ... | ... |
hw/sh7750_regs.h
... | ... | @@ -979,6 +979,17 @@ |
979 | 979 | |
980 | 980 | #define SH7750_RFCR_KEY 0xA400 /* RFCR write key */ |
981 | 981 | |
982 | +/* Synchronous DRAM mode registers - SDMR */ | |
983 | +#define SH7750_SDMR2_REGOFS 0x900000 /* base offset */ | |
984 | +#define SH7750_SDMR2_REGNB 0x0FFC /* nb of register */ | |
985 | +#define SH7750_SDMR2 SH7750_P4_REG32(SH7750_SDMR2_REGOFS) | |
986 | +#define SH7750_SDMR2_A7 SH7750_A7_REG32(SH7750_SDMR2_REGOFS) | |
987 | + | |
988 | +#define SH7750_SDMR3_REGOFS 0x940000 /* offset */ | |
989 | +#define SH7750_SDMR3_REGNB 0x0FFC /* nb of register */ | |
990 | +#define SH7750_SDMR3 SH7750_P4_REG32(SH7750_SDMR3_REGOFS) | |
991 | +#define SH7750_SDMR3_A7 SH7750_A7_REG32(SH7750_SDMR3_REGOFS) | |
992 | + | |
982 | 993 | /* |
983 | 994 | * Direct Memory Access Controller (DMAC) |
984 | 995 | */ |
... | ... | @@ -1262,7 +1273,5 @@ |
1262 | 1273 | */ |
1263 | 1274 | #define SH7750_BCR3_A7 0x1f800050 |
1264 | 1275 | #define SH7750_BCR4_A7 0x1e0a00f0 |
1265 | -#define SH7750_PRECHARGE0_A7 0x1f900088 | |
1266 | -#define SH7750_PRECHARGE1_A7 0x1f940088 | |
1267 | 1276 | |
1268 | 1277 | #endif | ... | ... |
target-sh4/cpu.h
target-sh4/translate.c
... | ... | @@ -222,12 +222,14 @@ static sh4_def_t sh4_defs[] = { |
222 | 222 | .pvr = 0x00050000, |
223 | 223 | .prr = 0x00000100, |
224 | 224 | .cvr = 0x00110000, |
225 | + .features = SH_FEATURE_BCR3_AND_BCR4, | |
225 | 226 | }, { |
226 | 227 | .name = "SH7751R", |
227 | 228 | .id = SH_CPU_SH7751R, |
228 | 229 | .pvr = 0x04050005, |
229 | 230 | .prr = 0x00000113, |
230 | 231 | .cvr = 0x00110000, /* Neutered caches, should be 0x20480000 */ |
232 | + .features = SH_FEATURE_BCR3_AND_BCR4, | |
231 | 233 | }, { |
232 | 234 | .name = "SH7785", |
233 | 235 | .id = SH_CPU_SH7785, | ... | ... |