diff options
-rw-r--r-- | firmware/target/arm/s5l8702/ipod6g/storage_ata-ipod6g.c | 29 |
1 files changed, 24 insertions, 5 deletions
diff --git a/firmware/target/arm/s5l8702/ipod6g/storage_ata-ipod6g.c b/firmware/target/arm/s5l8702/ipod6g/storage_ata-ipod6g.c index 98efa33c84..5b0ab3e22a 100644 --- a/firmware/target/arm/s5l8702/ipod6g/storage_ata-ipod6g.c +++ b/firmware/target/arm/s5l8702/ipod6g/storage_ata-ipod6g.c | |||
@@ -537,6 +537,25 @@ static int ata_set_feature(uint32_t feature, uint32_t param) | |||
537 | return 0; | 537 | return 0; |
538 | } | 538 | } |
539 | 539 | ||
540 | /* | ||
541 | * ATA_UDMA_TIME register is documented on s3c6400 datasheet, information | ||
542 | * included in s5l8700 datasheet is wrong or not valid for s5l8702. | ||
543 | * | ||
544 | * On Classic (boosted): | ||
545 | * HClk = 108 MHz. -> T = ~9.26 ns. | ||
546 | * | ||
547 | * Configured values (in nanoseconds): | ||
548 | * | ||
549 | * UDMA ATA_UDMA_TIME tACK tRP tSS tDVS tDVH Tcyc WR(MB/s) | ||
550 | * 0 0x4071152 27.8 166.7 55.6 74.1 46.3 120.4 16.6 | ||
551 | * 1 0x2050d52 27.8 129.6 55.6 55.6 27.8 83.4 24 | ||
552 | * 2 0x2030a52 27.8 101.8 55.6 37 27.8 64.8 30.9 | ||
553 | * 3 0x1020a52 27.8 101.8 55.6 27.8 18.5 46.3 43.2 | ||
554 | * 4 0x1010a52 27.8 101.8 55.6 18.5 18.5 37 54 | ||
555 | * | ||
556 | * Tcyc = tDVS+tDVH | ||
557 | * WR[bytes/s] = 1/Tcyc[s] * 2[bytes] | ||
558 | */ | ||
540 | static int ata_power_up(void) | 559 | static int ata_power_up(void) |
541 | { | 560 | { |
542 | ata_set_active(); | 561 | ata_set_active(); |
@@ -592,7 +611,7 @@ static int ata_power_up(void) | |||
592 | PASS_RC(ata_identify(ata_identify_data), 3, 3); | 611 | PASS_RC(ata_identify(ata_identify_data), 3, 3); |
593 | uint32_t piotime = 0x11f3; | 612 | uint32_t piotime = 0x11f3; |
594 | uint32_t mdmatime = 0x1c175; | 613 | uint32_t mdmatime = 0x1c175; |
595 | uint32_t udmatime = 0x5071152; | 614 | uint32_t udmatime = 0x4071152; |
596 | uint32_t param = 0; | 615 | uint32_t param = 0; |
597 | ata_dma_flags = 0; | 616 | ata_dma_flags = 0; |
598 | ata_lba48 = ata_identify_data[83] & BIT(10) ? true : false; | 617 | ata_lba48 = ata_identify_data[83] & BIT(10) ? true : false; |
@@ -620,22 +639,22 @@ static int ata_power_up(void) | |||
620 | { | 639 | { |
621 | if (ata_identify_data[88] & BIT(4)) | 640 | if (ata_identify_data[88] & BIT(4)) |
622 | { | 641 | { |
623 | udmatime = 0x2010a52; | 642 | udmatime = 0x1010a52; |
624 | param = 0x44; | 643 | param = 0x44; |
625 | } | 644 | } |
626 | else if (ata_identify_data[88] & BIT(3)) | 645 | else if (ata_identify_data[88] & BIT(3)) |
627 | { | 646 | { |
628 | udmatime = 0x2020a52; | 647 | udmatime = 0x1020a52; |
629 | param = 0x43; | 648 | param = 0x43; |
630 | } | 649 | } |
631 | else if (ata_identify_data[88] & BIT(2)) | 650 | else if (ata_identify_data[88] & BIT(2)) |
632 | { | 651 | { |
633 | udmatime = 0x3030a52; | 652 | udmatime = 0x2030a52; |
634 | param = 0x42; | 653 | param = 0x42; |
635 | } | 654 | } |
636 | else if (ata_identify_data[88] & BIT(1)) | 655 | else if (ata_identify_data[88] & BIT(1)) |
637 | { | 656 | { |
638 | udmatime = 0x3050a52; | 657 | udmatime = 0x2050d52; |
639 | param = 0x41; | 658 | param = 0x41; |
640 | } | 659 | } |
641 | else if (ata_identify_data[88] & BIT(0)) | 660 | else if (ata_identify_data[88] & BIT(0)) |