Revision fccd2613
b/hw/nand.c | ||
---|---|---|
212 | 212 |
|
213 | 213 |
static void nand_command(NANDFlashState *s) |
214 | 214 |
{ |
215 |
unsigned int offset; |
|
215 | 216 |
switch (s->cmd) { |
216 | 217 |
case NAND_CMD_READ0: |
217 | 218 |
s->iolen = 0; |
... | ... | |
233 | 234 |
case NAND_CMD_NOSERIALREAD2: |
234 | 235 |
if (!(nand_flash_ids[s->chip_id].options & NAND_SAMSUNG_LP)) |
235 | 236 |
break; |
236 |
|
|
237 |
s->blk_load(s, s->addr, s->addr & ((1 << s->addr_shift) - 1)); |
|
237 |
offset = s->addr & ((1 << s->addr_shift) - 1); |
|
238 |
s->blk_load(s, s->addr, offset); |
|
239 |
if (s->gnd) |
|
240 |
s->iolen = (1 << s->page_shift) - offset; |
|
241 |
else |
|
242 |
s->iolen = (1 << s->page_shift) + (1 << s->oob_shift) - offset; |
|
238 | 243 |
break; |
239 | 244 |
|
240 | 245 |
case NAND_CMD_RESET: |
... | ... | |
380 | 385 |
|
381 | 386 |
if (s->cmd != NAND_CMD_RANDOMREAD2) { |
382 | 387 |
s->addrlen = 0; |
383 |
s->addr = 0; |
|
384 | 388 |
} |
385 | 389 |
} |
386 | 390 |
|
387 | 391 |
if (s->ale) { |
388 |
s->addr |= value << (s->addrlen * 8); |
|
392 |
unsigned int shift = s->addrlen * 8; |
|
393 |
unsigned int mask = ~(0xff << shift); |
|
394 |
unsigned int v = value << shift; |
|
395 |
|
|
396 |
s->addr = (s->addr & mask) | v; |
|
389 | 397 |
s->addrlen ++; |
390 | 398 |
|
391 | 399 |
if (s->addrlen == 1 && s->cmd == NAND_CMD_READID) |
... | ... | |
435 | 443 |
return 0; |
436 | 444 |
|
437 | 445 |
s->iolen --; |
446 |
s->addr++; |
|
438 | 447 |
return *(s->ioaddr ++); |
439 | 448 |
} |
440 | 449 |
|
... | ... | |
633 | 642 |
offset, PAGE_SIZE + OOB_SIZE - offset); |
634 | 643 |
s->ioaddr = s->io; |
635 | 644 |
} |
636 |
|
|
637 |
s->addr &= PAGE_SIZE - 1; |
|
638 |
s->addr += PAGE_SIZE; |
|
639 | 645 |
} |
640 | 646 |
|
641 | 647 |
static void glue(nand_init_, PAGE_SIZE)(NANDFlashState *s) |
Also available in: Unified diff