Subversion Repositories freemyipod

Rev

Rev 88 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 88 Rev 224
Line 373... Line 373...
373
 
373
 
374
uint32_t nand_read_page(uint32_t bank, uint32_t page, void* databuffer,
374
uint32_t nand_read_page(uint32_t bank, uint32_t page, void* databuffer,
375
                        void* sparebuffer, uint32_t doecc,
375
                        void* sparebuffer, uint32_t doecc,
376
                        uint32_t checkempty)
376
                        uint32_t checkempty)
377
{
377
{
-
 
378
#ifdef NAND_TRACE
-
 
379
    DEBUGF("NAND: Read bank %d, page %d", bank, page);
-
 
380
#endif
378
    uint8_t* data = (uint8_t*)databuffer;
381
    uint8_t* data = (uint8_t*)databuffer;
379
    uint8_t* spare = nand_spare;
382
    uint8_t* spare = nand_spare;
380
    if (sparebuffer) spare = (uint8_t*)sparebuffer;
383
    if (sparebuffer) spare = (uint8_t*)sparebuffer;
381
	if ((uint32_t)databuffer & (CACHEALIGN_SIZE - 1))
384
	if ((uint32_t)databuffer & (CACHEALIGN_SIZE - 1))
382
		panicf(PANIC_KILLUSERTHREADS,
385
		panicf(PANIC_KILLUSERTHREADS,
Line 428... Line 431...
428
    {
431
    {
429
        if (eccresult & 1) memset(sparebuffer, 0xFF, 0xC);
432
        if (eccresult & 1) memset(sparebuffer, 0xFF, 0xC);
430
        else memcpy(sparebuffer, nand_ctrl, 0xC);
433
        else memcpy(sparebuffer, nand_ctrl, 0xC);
431
    }
434
    }
432
    if (checkempty) rc |= nand_check_empty(spare) << 1;
435
    if (checkempty) rc |= nand_check_empty(spare) << 1;
-
 
436
#ifdef NAND_DEBUG
-
 
437
    if ((rc & 2) == 0)
-
 
438
    {
-
 
439
        if ((rc & 0x10) != 0)
-
 
440
            DEBUGF("NAND: ECC failed to correct bank %d page %d user data!", bank, page);
-
 
441
        if ((rc & 0xE0) != 0)
-
 
442
            DEBUGF("NAND: ECC corrected %d errors in bank %d page %d user data!", rc >> 5, bank, page);
-
 
443
        if ((rc & 0x100) != 0)
-
 
444
            DEBUGF("NAND: ECC failed to correct bank %d page %d control data!", bank, page);
-
 
445
        if ((rc & 0xE00) != 0)
-
 
446
            DEBUGF("NAND: ECC corrected %d errors in bank %d page %d control data!", (rc >> 9) & 7, bank, page);
-
 
447
    }
-
 
448
#ifdef NAND_TRACE
-
 
449
    else DEBUGF("NAND: Bank %d page %d: Erased page!", bank, page);
-
 
450
#endif
-
 
451
#endif
433
 
452
 
-
 
453
#ifdef NAND_TRACE
-
 
454
    DEBUGF("NAND: Read success, RC=%X", rc);
-
 
455
#endif
434
    return nand_unlock(rc);
456
    return nand_unlock(rc);
435
}
457
}
436
 
458
 
437
static uint32_t nand_write_page_int(uint32_t bank, uint32_t page,
459
static uint32_t nand_write_page_int(uint32_t bank, uint32_t page,
438
                                    void* databuffer, void* sparebuffer,
460
                                    void* databuffer, void* sparebuffer,
439
                                    uint32_t doecc, uint32_t wait)
461
                                    uint32_t doecc, uint32_t wait)
440
{
462
{
-
 
463
#ifdef NAND_TRACE
-
 
464
    DEBUGF("NAND: Write bank %d, page %d", bank, page);
-
 
465
#endif
441
    uint8_t* data = (uint8_t*)databuffer;
466
    uint8_t* data = (uint8_t*)databuffer;
442
    uint8_t* spare = nand_spare;
467
    uint8_t* spare = nand_spare;
443
    if (sparebuffer) spare = (uint8_t*)sparebuffer;
468
    if (sparebuffer) spare = (uint8_t*)sparebuffer;
444
	if ((uint32_t)databuffer & 0xf)
469
	if ((uint32_t)databuffer & 0xf)
445
		panicf(PANIC_KILLUSERTHREADS,
470
		panicf(PANIC_KILLUSERTHREADS,
Line 478... Line 503...
478
    return nand_unlock(0);
503
    return nand_unlock(0);
479
}
504
}
480
 
505
 
481
uint32_t nand_block_erase(uint32_t bank, uint32_t page)
506
uint32_t nand_block_erase(uint32_t bank, uint32_t page)
482
{
507
{
-
 
508
#ifdef NAND_TRACE
-
 
509
    DEBUGF("NAND: Block erase starting at bank %d, page %d", bank, page);
-
 
510
#endif
483
    mutex_lock(&nand_mtx, TIMEOUT_BLOCK);
511
    mutex_lock(&nand_mtx, TIMEOUT_BLOCK);
484
    nand_last_activity_value = USEC_TIMER;
512
    nand_last_activity_value = USEC_TIMER;
485
    if (!nand_powered) nand_power_up();
513
    if (!nand_powered) nand_power_up();
486
    nand_set_fmctrl0(bank, 0);
514
    nand_set_fmctrl0(bank, 0);
487
    if (nand_send_cmd(NAND_CMD_BLOCKERASE)) return nand_unlock(1);
515
    if (nand_send_cmd(NAND_CMD_BLOCKERASE)) return nand_unlock(1);
Line 496... Line 524...
496
 
524
 
497
uint32_t nand_read_page_fast(uint32_t page, void* databuffer,
525
uint32_t nand_read_page_fast(uint32_t page, void* databuffer,
498
                             void* sparebuffer, uint32_t doecc,
526
                             void* sparebuffer, uint32_t doecc,
499
                             uint32_t checkempty)
527
                             uint32_t checkempty)
500
{
528
{
-
 
529
#ifdef NAND_TRACE
-
 
530
    DEBUGF("NAND: Read all banks, page %d", page);
-
 
531
#endif
501
    uint32_t i, rc = 0;
532
    uint32_t i, rc = 0;
502
    if (((uint32_t)databuffer & 0xf) || ((uint32_t)sparebuffer & 0xf)
533
    if (((uint32_t)databuffer & 0xf) || ((uint32_t)sparebuffer & 0xf)
503
     || !databuffer || !sparebuffer || !doecc)
534
     || !databuffer || !sparebuffer || !doecc)
504
    {
535
    {
505
        for (i = 0; i < 4; i++)
536
        for (i = 0; i < 4; i++)
Line 627... Line 658...
627
}
658
}
628
 
659
 
629
uint32_t nand_write_page_start(uint32_t bank, uint32_t page, void* databuffer,
660
uint32_t nand_write_page_start(uint32_t bank, uint32_t page, void* databuffer,
630
                               void* sparebuffer, uint32_t doecc)
661
                               void* sparebuffer, uint32_t doecc)
631
{
662
{
-
 
663
#ifdef NAND_TRACE
-
 
664
    DEBUGF("NAND: Write all banks, page %d", page);
-
 
665
#endif
632
    if (((uint32_t)databuffer & 0xf) || ((uint32_t)sparebuffer & 0xf)
666
    if (((uint32_t)databuffer & 0xf) || ((uint32_t)sparebuffer & 0xf)
633
     || !databuffer || !sparebuffer || !doecc || !nand_interleaved)
667
     || !databuffer || !sparebuffer || !doecc || !nand_interleaved)
634
        return nand_write_page_int(bank, page, databuffer, sparebuffer, doecc, !nand_interleaved);
668
        return nand_write_page_int(bank, page, databuffer, sparebuffer, doecc, !nand_interleaved);
635
 
669
 
636
    mutex_lock(&nand_mtx, TIMEOUT_BLOCK);
670
    mutex_lock(&nand_mtx, TIMEOUT_BLOCK);