| Index: emcore/trunk/target/ipodnano3g/s5l8702.h |
| — | — | @@ -572,6 +572,190 @@ |
| 573 | 573 | #define ATA_DMA_ADDR (*((void* volatile*)(0x38700088))) |
| 574 | 574 | |
| 575 | 575 | |
| | 576 | +/////SDCI///// |
| | 577 | +#define SDCI_CTRL (*((uint32_t volatile*)(0x38b00000)))
|
| | 578 | +#define SDCI_DCTRL (*((uint32_t volatile*)(0x38b00004)))
|
| | 579 | +#define SDCI_CMD (*((uint32_t volatile*)(0x38b00008)))
|
| | 580 | +#define SDCI_ARGU (*((uint32_t volatile*)(0x38b0000c)))
|
| | 581 | +#define SDCI_STATE (*((uint32_t volatile*)(0x38b00010)))
|
| | 582 | +#define SDCI_STAC (*((uint32_t volatile*)(0x38b00014)))
|
| | 583 | +#define SDCI_DSTA (*((uint32_t volatile*)(0x38b00018)))
|
| | 584 | +#define SDCI_FSTA (*((uint32_t volatile*)(0x38b0001c)))
|
| | 585 | +#define SDCI_RESP0 (*((uint32_t volatile*)(0x38b00020)))
|
| | 586 | +#define SDCI_RESP1 (*((uint32_t volatile*)(0x38b00024)))
|
| | 587 | +#define SDCI_RESP2 (*((uint32_t volatile*)(0x38b00028)))
|
| | 588 | +#define SDCI_RESP3 (*((uint32_t volatile*)(0x38b0002c)))
|
| | 589 | +#define SDCI_CDIV (*((uint32_t volatile*)(0x38b00030)))
|
| | 590 | +#define SDCI_SDIO_CSR (*((uint32_t volatile*)(0x38b00034)))
|
| | 591 | +#define SDCI_IRQ (*((uint32_t volatile*)(0x38b00038)))
|
| | 592 | +#define SDCI_IRQ_MASK (*((uint32_t volatile*)(0x38b0003c)))
|
| | 593 | +#define SDCI_DATA (*((uint32_t volatile*)(0x38b00040)))
|
| | 594 | +#define SDCI_DMAADDR (*((void* volatile*)(0x38b00044)))
|
| | 595 | +#define SDCI_DMASIZE (*((uint32_t volatile*)(0x38b00048)))
|
| | 596 | +#define SDCI_DMACOUNT (*((uint32_t volatile*)(0x38b0004c)))
|
| | 597 | +#define SDCI_RESET (*((uint32_t volatile*)(0x38b0006c)))
|
| | 598 | + |
| | 599 | +#define SDCI_CTRL_SDCIEN BIT(0)
|
| | 600 | +#define SDCI_CTRL_CARD_TYPE_MASK BIT(1)
|
| | 601 | +#define SDCI_CTRL_CARD_TYPE_SD 0
|
| | 602 | +#define SDCI_CTRL_CARD_TYPE_MMC BIT(1)
|
| | 603 | +#define SDCI_CTRL_BUS_WIDTH_MASK BITRANGE(2, 3)
|
| | 604 | +#define SDCI_CTRL_BUS_WIDTH_1BIT 0
|
| | 605 | +#define SDCI_CTRL_BUS_WIDTH_4BIT BIT(2)
|
| | 606 | +#define SDCI_CTRL_BUS_WIDTH_8BIT BIT(3)
|
| | 607 | +#define SDCI_CTRL_DMA_EN BIT(4)
|
| | 608 | +#define SDCI_CTRL_L_ENDIAN BIT(5)
|
| | 609 | +#define SDCI_CTRL_DMA_REQ_CON_MASK BIT(6)
|
| | 610 | +#define SDCI_CTRL_DMA_REQ_CON_NEMPTY 0
|
| | 611 | +#define SDCI_CTRL_DMA_REQ_CON_FULL BIT(6)
|
| | 612 | +#define SDCI_CTRL_CLK_SEL_MASK BIT(7)
|
| | 613 | +#define SDCI_CTRL_CLK_SEL_PCLK 0
|
| | 614 | +#define SDCI_CTRL_CLK_SEL_SDCLK BIT(7)
|
| | 615 | +#define SDCI_CTRL_BIT_8 BIT(8)
|
| | 616 | +#define SDCI_CTRL_BIT_14 BIT(14)
|
| | 617 | +
|
| | 618 | +#define SDCI_DCTRL_TXFIFORST BIT(0)
|
| | 619 | +#define SDCI_DCTRL_RXFIFORST BIT(1)
|
| | 620 | +#define SDCI_DCTRL_TRCONT_MASK BITRANGE(4, 5)
|
| | 621 | +#define SDCI_DCTRL_TRCONT_TX BIT(4)
|
| | 622 | +#define SDCI_DCTRL_BUS_TEST_MASK BITRANGE(6, 7)
|
| | 623 | +#define SDCI_DCTRL_BUS_TEST_TX BIT(6)
|
| | 624 | +#define SDCI_DCTRL_BUS_TEST_RX BIT(7)
|
| | 625 | +
|
| | 626 | +#define SDCI_CDIV_CLKDIV_MASK BITRANGE(0, 7)
|
| | 627 | +#define SDCI_CDIV_CLKDIV(x) ((x) >> 1)
|
| | 628 | +#define SDCI_CDIV_CLKDIV_2 BIT(0)
|
| | 629 | +#define SDCI_CDIV_CLKDIV_4 BIT(1)
|
| | 630 | +#define SDCI_CDIV_CLKDIV_8 BIT(2)
|
| | 631 | +#define SDCI_CDIV_CLKDIV_16 BIT(3)
|
| | 632 | +#define SDCI_CDIV_CLKDIV_32 BIT(4)
|
| | 633 | +#define SDCI_CDIV_CLKDIV_64 BIT(5)
|
| | 634 | +#define SDCI_CDIV_CLKDIV_128 BIT(6)
|
| | 635 | +#define SDCI_CDIV_CLKDIV_256 BIT(7)
|
| | 636 | +
|
| | 637 | +#define SDCI_CMD_CMD_NUM_MASK BITRANGE(0, 5)
|
| | 638 | +#define SDCI_CMD_CMD_NUM_SHIFT 0
|
| | 639 | +#define SDCI_CMD_CMD_NUM(x) (x)
|
| | 640 | +#define SDCI_CMD_CMD_TYPE_MASK BITRANGE(6, 7)
|
| | 641 | +#define SDCI_CMD_CMD_TYPE_BC 0
|
| | 642 | +#define SDCI_CMD_CMD_TYPE_BCR BIT(6)
|
| | 643 | +#define SDCI_CMD_CMD_TYPE_AC BIT(7)
|
| | 644 | +#define SDCI_CMD_CMD_TYPE_ADTC (BIT(6) | BIT(7))
|
| | 645 | +#define SDCI_CMD_CMD_RD_WR BIT(8)
|
| | 646 | +#define SDCI_CMD_RES_TYPE_MASK BITRANGE(16, 18)
|
| | 647 | +#define SDCI_CMD_RES_TYPE_NONE 0
|
| | 648 | +#define SDCI_CMD_RES_TYPE_R1 BIT(16)
|
| | 649 | +#define SDCI_CMD_RES_TYPE_R2 BIT(17)
|
| | 650 | +#define SDCI_CMD_RES_TYPE_R3 (BIT(16) | BIT(17))
|
| | 651 | +#define SDCI_CMD_RES_TYPE_R4 BIT(18)
|
| | 652 | +#define SDCI_CMD_RES_TYPE_R5 (BIT(16) | BIT(18))
|
| | 653 | +#define SDCI_CMD_RES_TYPE_R6 (BIT(17) | BIT(18))
|
| | 654 | +#define SDCI_CMD_RES_BUSY BIT(19)
|
| | 655 | +#define SDCI_CMD_RES_SIZE_MASK BIT(20)
|
| | 656 | +#define SDCI_CMD_RES_SIZE_48 0
|
| | 657 | +#define SDCI_CMD_RES_SIZE_136 BIT(20)
|
| | 658 | +#define SDCI_CMD_NCR_NID_MASK BIT(21)
|
| | 659 | +#define SDCI_CMD_NCR_NID_NCR 0
|
| | 660 | +#define SDCI_CMD_NCR_NID_NID BIT(21)
|
| | 661 | +#define SDCI_CMD_CMDSTR BIT(31)
|
| | 662 | +
|
| | 663 | +#define SDCI_STATE_DAT_STATE_MASK BITRANGE(0, 3)
|
| | 664 | +#define SDCI_STATE_DAT_STATE_IDLE 0
|
| | 665 | +#define SDCI_STATE_DAT_STATE_DAT_RCV BIT(0)
|
| | 666 | +#define SDCI_STATE_DAT_STATE_CRC_RCV BIT(1)
|
| | 667 | +#define SDCI_STATE_DAT_STATE_DAT_END (BIT(0) | BIT(1))
|
| | 668 | +#define SDCI_STATE_DAT_STATE_DAT_SET BIT(2)
|
| | 669 | +#define SDCI_STATE_DAT_STATE_DAT_OUT (BIT(0) | BIT(2))
|
| | 670 | +#define SDCI_STATE_DAT_STATE_CRC_TIME (BIT(1) | BIT(2))
|
| | 671 | +#define SDCI_STATE_DAT_STATE_CRC_OUT (BIT(0) | BIT(1) | BIT(2))
|
| | 672 | +#define SDCI_STATE_DAT_STATE_ENDB_OUT BIT(3)
|
| | 673 | +#define SDCI_STATE_DAT_STATE_ENDB_STOD (BIT(0) | BIT(3))
|
| | 674 | +#define SDCI_STATE_DAT_STATE_DAT_CRCR (BIT(1) | BIT(3))
|
| | 675 | +#define SDCI_STATE_DAT_STATE_CARD_PRG (BIT(0) | BIT(1) | BIT(3))
|
| | 676 | +#define SDCI_STATE_DAT_STATE_DAT_BUSY (BIT(2) | BIT(3))
|
| | 677 | +#define SDCI_STATE_CMD_STATE_MASK (BIT(4) | BIT(5) | BIT(6))
|
| | 678 | +#define SDCI_STATE_CMD_STATE_CMD_IDLE 0
|
| | 679 | +#define SDCI_STATE_CMD_STATE_CMD_CMDO BIT(4)
|
| | 680 | +#define SDCI_STATE_CMD_STATE_CMD_CRCO BIT(5)
|
| | 681 | +#define SDCI_STATE_CMD_STATE_CMD_TOUT (BIT(4) | BIT(5))
|
| | 682 | +#define SDCI_STATE_CMD_STATE_CMD_RESR BIT(6)
|
| | 683 | +#define SDCI_STATE_CMD_STATE_CMD_INTV (BIT(4) | BIT(6))
|
| | 684 | +
|
| | 685 | +#define SDCI_STAC_CLR_CMDEND BIT(2)
|
| | 686 | +#define SDCI_STAC_CLR_BIT_3 BIT(3)
|
| | 687 | +#define SDCI_STAC_CLR_RESEND BIT(4)
|
| | 688 | +#define SDCI_STAC_CLR_DATEND BIT(6)
|
| | 689 | +#define SDCI_STAC_CLR_DAT_CRCEND BIT(7)
|
| | 690 | +#define SDCI_STAC_CLR_CRC_STAEND BIT(8)
|
| | 691 | +#define SDCI_STAC_CLR_RESTOUTE BIT(15)
|
| | 692 | +#define SDCI_STAC_CLR_RESENDE BIT(16)
|
| | 693 | +#define SDCI_STAC_CLR_RESINDE BIT(17)
|
| | 694 | +#define SDCI_STAC_CLR_RESCRCE BIT(18)
|
| | 695 | +#define SDCI_STAC_CLR_WR_DATCRCE BIT(22)
|
| | 696 | +#define SDCI_STAC_CLR_RD_DATCRCE BIT(23)
|
| | 697 | +#define SDCI_STAC_CLR_RD_DATENDE0 BIT(24)
|
| | 698 | +#define SDCI_STAC_CLR_RD_DATENDE1 BIT(25)
|
| | 699 | +#define SDCI_STAC_CLR_RD_DATENDE2 BIT(26)
|
| | 700 | +#define SDCI_STAC_CLR_RD_DATENDE3 BIT(27)
|
| | 701 | +#define SDCI_STAC_CLR_RD_DATENDE4 BIT(28)
|
| | 702 | +#define SDCI_STAC_CLR_RD_DATENDE5 BIT(29)
|
| | 703 | +#define SDCI_STAC_CLR_RD_DATENDE6 BIT(30)
|
| | 704 | +#define SDCI_STAC_CLR_RD_DATENDE7 BIT(31)
|
| | 705 | +
|
| | 706 | +#define SDCI_DSTA_CMDRDY BIT(0)
|
| | 707 | +#define SDCI_DSTA_CMDPRO BIT(1)
|
| | 708 | +#define SDCI_DSTA_CMDEND BIT(2)
|
| | 709 | +#define SDCI_DSTA_RESPRO BIT(3)
|
| | 710 | +#define SDCI_DSTA_RESEND BIT(4)
|
| | 711 | +#define SDCI_DSTA_DATPRO BIT(5)
|
| | 712 | +#define SDCI_DSTA_DATEND BIT(6)
|
| | 713 | +#define SDCI_DSTA_DAT_CRCEND BIT(7)
|
| | 714 | +#define SDCI_DSTA_CRC_STAEND BIT(8)
|
| | 715 | +#define SDCI_DSTA_DAT_BUSY BIT(9)
|
| | 716 | +#define SDCI_DSTA_SDCLK_HOLD BIT(12)
|
| | 717 | +#define SDCI_DSTA_DAT0_STATUS BIT(13)
|
| | 718 | +#define SDCI_DSTA_WP_DECT_INPUT BIT(14)
|
| | 719 | +#define SDCI_DSTA_RESTOUTE BIT(15)
|
| | 720 | +#define SDCI_DSTA_RESENDE BIT(16)
|
| | 721 | +#define SDCI_DSTA_RESINDE BIT(17)
|
| | 722 | +#define SDCI_DSTA_RESCRCE BIT(18)
|
| | 723 | +#define SDCI_DSTA_WR_CRC_STATUS_MASK BITRANGE(19, 21)
|
| | 724 | +#define SDCI_DSTA_WR_CRC_STATUS_OK BIT(20)
|
| | 725 | +#define SDCI_DSTA_WR_CRC_STATUS_TXERR (BIT(19) | BIT(21))
|
| | 726 | +#define SDCI_DSTA_WR_CRC_STATUS_CARDERR (BIT(19) | BIT(20) | BIT(21))
|
| | 727 | +#define SDCI_DSTA_WR_DATCRCE BIT(22)
|
| | 728 | +#define SDCI_DSTA_RD_DATCRCE BIT(23)
|
| | 729 | +#define SDCI_DSTA_RD_DATENDE0 BIT(24)
|
| | 730 | +#define SDCI_DSTA_RD_DATENDE1 BIT(25)
|
| | 731 | +#define SDCI_DSTA_RD_DATENDE2 BIT(26)
|
| | 732 | +#define SDCI_DSTA_RD_DATENDE3 BIT(27)
|
| | 733 | +#define SDCI_DSTA_RD_DATENDE4 BIT(28)
|
| | 734 | +#define SDCI_DSTA_RD_DATENDE5 BIT(29)
|
| | 735 | +#define SDCI_DSTA_RD_DATENDE6 BIT(30)
|
| | 736 | +#define SDCI_DSTA_RD_DATENDE7 BIT(31)
|
| | 737 | +
|
| | 738 | +#define SDCI_FSTA_RX_FIFO_EMPTY BIT(0)
|
| | 739 | +#define SDCI_FSTA_RX_FIFO_FULL BIT(1)
|
| | 740 | +#define SDCI_FSTA_TX_FIFO_EMPTY BIT(2)
|
| | 741 | +#define SDCI_FSTA_TX_FIFO_FULL BIT(3)
|
| | 742 | +
|
| | 743 | +#define SDCI_SDIO_CSR_SDIO_RW_EN BIT(0)
|
| | 744 | +#define SDCI_SDIO_CSR_SDIO_INT_EN BIT(1)
|
| | 745 | +#define SDCI_SDIO_CSR_SDIO_RW_REQ BIT(2)
|
| | 746 | +#define SDCI_SDIO_CSR_SDIO_RW_STOP BIT(3)
|
| | 747 | +#define SDCI_SDIO_CSR_SDIO_INT_PERIOD_MASK BIT(4)
|
| | 748 | +#define SDCI_SDIO_CSR_SDIO_INT_PERIOD_MORE 0
|
| | 749 | +#define SDCI_SDIO_CSR_SDIO_INT_PERIOD_XACT BIT(4)
|
| | 750 | +
|
| | 751 | +#define SDCI_IRQ_DAT_DONE_INT BIT(0)
|
| | 752 | +#define SDCI_IRQ_IOCARD_IRQ_INT BIT(1)
|
| | 753 | +#define SDCI_IRQ_READ_WAIT_INT BIT(2)
|
| | 754 | +
|
| | 755 | +#define SDCI_IRQ_MASK_MASK_DAT_DONE_INT BIT(0)
|
| | 756 | +#define SDCI_IRQ_MASK_MASK_IOCARD_IRQ_INT BIT(1)
|
| | 757 | +#define SDCI_IRQ_MASK_MASK_READ_WAIT_INT BIT(2)
|
| | 758 | +
|
| | 759 | + |
| 576 | 760 | /////CLICKWHEEL///// |
| 577 | 761 | #define WHEEL00 (*((uint32_t volatile*)(0x3C200000))) |
| 578 | 762 | #define WHEEL04 (*((uint32_t volatile*)(0x3C200004))) |
| — | — | @@ -605,6 +789,7 @@ |
| 606 | 790 | #define IRQ_DMAC1 17 |
| 607 | 791 | #define IRQ_WHEEL 23 |
| 608 | 792 | #define IRQ_ATA 29 |
| | 793 | +#define IRQ_MMC 44 |
| 609 | 794 | |
| 610 | 795 | |
| 611 | 796 | #endif |
| Index: emcore/trunk/target/ipodnano3g/interrupt.c |
| — | — | @@ -94,7 +94,7 @@ |
| 95 | 95 | default_interrupt(INT_IRQ41);
|
| 96 | 96 | default_interrupt(INT_IRQ42);
|
| 97 | 97 | default_interrupt(INT_IRQ43);
|
| 98 | | -default_interrupt(INT_IRQ44);
|
| | 98 | +default_interrupt(INT_MMC);
|
| 99 | 99 | default_interrupt(INT_IRQ45);
|
| 100 | 100 | default_interrupt(INT_IRQ46);
|
| 101 | 101 | default_interrupt(INT_IRQ47);
|
| — | — | @@ -186,7 +186,7 @@ |
| 187 | 187 | INT_DMAC0,INT_DMAC1,INT_IRQ18,INT_USB_FUNC,INT_IRQ20,INT_IRQ21,INT_IRQ22,INT_WHEEL,
|
| 188 | 188 | INT_IRQ24,INT_IRQ25,INT_IRQ26,INT_IRQ27,INT_IRQ28,INT_ATA,INT_IRQ30,INT_IRQ31,
|
| 189 | 189 | INT_IRQ32,INT_IRQ33,INT_IRQ34,INT_IRQ35,INT_IRQ36,INT_IRQ37,INT_IRQ38,INT_IRQ39,
|
| 190 | | - INT_IRQ40,INT_IRQ41,INT_IRQ42,INT_IRQ43,INT_IRQ55,INT_IRQ56,INT_IRQ57,INT_IRQ58,
|
| | 190 | + INT_IRQ40,INT_IRQ41,INT_IRQ42,INT_IRQ43,INT_MMC,INT_IRQ45,INT_IRQ46,INT_IRQ47,
|
| 191 | 191 | INT_IRQ48,INT_IRQ49,INT_IRQ50,INT_IRQ51,INT_IRQ52,INT_IRQ53,INT_IRQ54,INT_IRQ55,
|
| 192 | 192 | INT_IRQ56,INT_IRQ57,INT_IRQ58,INT_IRQ59,INT_IRQ60,INT_IRQ61,INT_IRQ62,INT_IRQ63
|
| 193 | 193 | };
|
| — | — | @@ -238,6 +238,7 @@ |
| 239 | 239 | VIC0INTENABLE = 1 << IRQ_DMAC1;
|
| 240 | 240 | #ifdef TARGET_ipodclassic
|
| 241 | 241 | VIC0INTENABLE = 1 << IRQ_ATA;
|
| | 242 | + VIC1INTENABLE = 1 << (IRQ_MMC - 32);
|
| 242 | 243 | #endif
|
| 243 | 244 | }
|
| 244 | 245 |
|
| Index: emcore/trunk/target/ipodclassic/storage_ata.c |
| — | — | @@ -24,6 +24,7 @@ |
| 25 | 25 | #include "storage.h"
|
| 26 | 26 | #include "storage_ata-target.h"
|
| 27 | 27 | #include "timer.h"
|
| | 28 | +#include "constants/mmc.h"
|
| 28 | 29 | #include "../ipodnano3g/s5l8702.h"
|
| 29 | 30 |
|
| 30 | 31 |
|
| — | — | @@ -32,8 +33,16 @@ |
| 33 | 34 | #endif
|
| 34 | 35 |
|
| 35 | 36 |
|
| | 37 | +#define CEATA_POWERUP_TIMEOUT 30000000
|
| | 38 | +#define CEATA_COMMAND_TIMEOUT 1000000
|
| | 39 | +#define CEATA_DAT_NONBUSY_TIMEOUT 5000000
|
| | 40 | +#define CEATA_MMC_RCA 1
|
| | 41 | +
|
| | 42 | +
|
| 36 | 43 | /** static, private data **/
|
| | 44 | +static uint8_t ceata_taskfile[16] __attribute__((aligned(16)));
|
| 37 | 45 | uint16_t ata_identify_data[0x100];
|
| | 46 | +bool ceata;
|
| 38 | 47 | bool ata_lba48;
|
| 39 | 48 | bool ata_dma;
|
| 40 | 49 | uint64_t ata_total_sectors;
|
| — | — | @@ -47,7 +56,10 @@ |
| 48 | 57 | static bool ata_powered;
|
| 49 | 58 | static int ata_retries = ATA_RETRIES;
|
| 50 | 59 | static bool ata_error_srst = true;
|
| | 60 | +static struct wakeup mmc_wakeup;
|
| | 61 | +static struct wakeup mmc_comp_wakeup;
|
| 51 | 62 |
|
| | 63 | +
|
| 52 | 64 | #ifdef ATA_HAVE_BBT
|
| 53 | 65 | #include "panic.h"
|
| 54 | 66 | uint16_t (*ata_bbt)[0x20];
|
| — | — | @@ -150,18 +162,382 @@ |
| 151 | 163 | RET_ERR(2);
|
| 152 | 164 | }
|
| 153 | 165 |
|
| | 166 | +int mmc_dsta_check_command_success(bool disable_crc)
|
| | 167 | +{
|
| | 168 | + int rc = 0;
|
| | 169 | + uint32_t dsta = SDCI_DSTA;
|
| | 170 | + if (dsta & SDCI_DSTA_RESTOUTE) rc |= 1;
|
| | 171 | + if (dsta & SDCI_DSTA_RESENDE) rc |= 2;
|
| | 172 | + if (dsta & SDCI_DSTA_RESINDE) rc |= 4;
|
| | 173 | + if (!disable_crc)
|
| | 174 | + if (dsta & SDCI_DSTA_RESCRCE)
|
| | 175 | + rc |= 8;
|
| | 176 | + if (rc) RET_ERR(rc);
|
| | 177 | + return 0;
|
| | 178 | +}
|
| | 179 | +
|
| | 180 | +bool mmc_send_command(uint32_t cmd, uint32_t arg, uint32_t* result, int timeout)
|
| | 181 | +{
|
| | 182 | + long starttime = USEC_TIMER;
|
| | 183 | + while ((SDCI_STATE & SDCI_STATE_CMD_STATE_MASK) != SDCI_STATE_CMD_STATE_CMD_IDLE)
|
| | 184 | + {
|
| | 185 | + if (TIMEOUT_EXPIRED(starttime, timeout)) RET_ERR(0);
|
| | 186 | + yield();
|
| | 187 | + }
|
| | 188 | + SDCI_STAC = SDCI_STAC_CLR_CMDEND | SDCI_STAC_CLR_BIT_3
|
| | 189 | + | SDCI_STAC_CLR_RESEND | SDCI_STAC_CLR_DATEND
|
| | 190 | + | SDCI_STAC_CLR_DAT_CRCEND | SDCI_STAC_CLR_CRC_STAEND
|
| | 191 | + | SDCI_STAC_CLR_RESTOUTE | SDCI_STAC_CLR_RESENDE
|
| | 192 | + | SDCI_STAC_CLR_RESINDE | SDCI_STAC_CLR_RESCRCE
|
| | 193 | + | SDCI_STAC_CLR_WR_DATCRCE | SDCI_STAC_CLR_RD_DATCRCE
|
| | 194 | + | SDCI_STAC_CLR_RD_DATENDE0 | SDCI_STAC_CLR_RD_DATENDE1
|
| | 195 | + | SDCI_STAC_CLR_RD_DATENDE2 | SDCI_STAC_CLR_RD_DATENDE3
|
| | 196 | + | SDCI_STAC_CLR_RD_DATENDE4 | SDCI_STAC_CLR_RD_DATENDE5
|
| | 197 | + | SDCI_STAC_CLR_RD_DATENDE6 | SDCI_STAC_CLR_RD_DATENDE7;
|
| | 198 | + SDCI_ARGU = arg;
|
| | 199 | + SDCI_CMD = cmd;
|
| | 200 | + if (!(SDCI_DSTA & SDCI_DSTA_CMDRDY)) RET_ERR(1);
|
| | 201 | + SDCI_CMD = cmd | SDCI_CMD_CMDSTR;
|
| | 202 | + sleep(1000);
|
| | 203 | + while (!(SDCI_DSTA & SDCI_DSTA_CMDEND))
|
| | 204 | + {
|
| | 205 | + if (TIMEOUT_EXPIRED(starttime, timeout)) RET_ERR(2);
|
| | 206 | + yield();
|
| | 207 | + }
|
| | 208 | + if ((cmd & SDCI_CMD_RES_TYPE_MASK) != SDCI_CMD_RES_TYPE_NONE)
|
| | 209 | + {
|
| | 210 | + while (!(SDCI_DSTA & SDCI_DSTA_RESEND))
|
| | 211 | + {
|
| | 212 | + if (TIMEOUT_EXPIRED(starttime, timeout)) RET_ERR(3);
|
| | 213 | + yield();
|
| | 214 | + }
|
| | 215 | + if (cmd & SDCI_CMD_RES_BUSY)
|
| | 216 | + while (SDCI_DSTA & SDCI_DSTA_DAT_BUSY)
|
| | 217 | + {
|
| | 218 | + if (TIMEOUT_EXPIRED(starttime, CEATA_DAT_NONBUSY_TIMEOUT)) RET_ERR(4);
|
| | 219 | + yield();
|
| | 220 | + }
|
| | 221 | + }
|
| | 222 | + bool nocrc = (cmd & SDCI_CMD_RES_SIZE_MASK) == SDCI_CMD_RES_SIZE_136;
|
| | 223 | + PASS_RC(mmc_dsta_check_command_success(nocrc), 3, 5);
|
| | 224 | + if (result) *result = SDCI_RESP0;
|
| | 225 | + return 0;
|
| | 226 | +}
|
| | 227 | +
|
| | 228 | +int mmc_get_card_status(uint32_t* result)
|
| | 229 | +{
|
| | 230 | + return mmc_send_command(SDCI_CMD_CMD_NUM(MMC_CMD_SEND_STATUS)
|
| | 231 | + | SDCI_CMD_CMD_TYPE_AC | SDCI_CMD_RES_TYPE_R1
|
| | 232 | + | SDCI_CMD_RES_SIZE_48 | SDCI_CMD_NCR_NID_NCR,
|
| | 233 | + MMC_CMD_SEND_STATUS_RCA(CEATA_MMC_RCA), result, CEATA_COMMAND_TIMEOUT);
|
| | 234 | +}
|
| | 235 | +
|
| | 236 | +int mmc_init()
|
| | 237 | +{
|
| | 238 | + sleep(100000);
|
| | 239 | + PASS_RC(mmc_send_command(SDCI_CMD_CMD_NUM(MMC_CMD_GO_IDLE_STATE)
|
| | 240 | + | SDCI_CMD_CMD_TYPE_BC | SDCI_CMD_RES_TYPE_NONE
|
| | 241 | + | SDCI_CMD_RES_SIZE_48 | SDCI_CMD_NCR_NID_NID,
|
| | 242 | + 0, NULL, CEATA_COMMAND_TIMEOUT), 3, 0);
|
| | 243 | + long startusec = USEC_TIMER;
|
| | 244 | + uint32_t result;
|
| | 245 | + do
|
| | 246 | + {
|
| | 247 | + if (TIMEOUT_EXPIRED(startusec, CEATA_POWERUP_TIMEOUT)) RET_ERR(1);
|
| | 248 | + sleep(1000);
|
| | 249 | + PASS_RC(mmc_send_command(SDCI_CMD_CMD_NUM(MMC_CMD_SEND_OP_COND)
|
| | 250 | + | SDCI_CMD_CMD_TYPE_BCR | SDCI_CMD_RES_TYPE_R3
|
| | 251 | + | SDCI_CMD_RES_SIZE_48 | SDCI_CMD_NCR_NID_NID,
|
| | 252 | + MMC_CMD_SEND_OP_COND_OCR(MMC_OCR_270_360),
|
| | 253 | + NULL, CEATA_COMMAND_TIMEOUT), 3, 2);
|
| | 254 | + result = SDCI_RESP0;
|
| | 255 | + }
|
| | 256 | + while (!(result & MMC_OCR_POWER_UP_DONE));
|
| | 257 | + PASS_RC(mmc_send_command(SDCI_CMD_CMD_NUM(MMC_CMD_ALL_SEND_CID)
|
| | 258 | + | SDCI_CMD_CMD_TYPE_BCR | SDCI_CMD_RES_TYPE_R2
|
| | 259 | + | SDCI_CMD_RES_SIZE_136 | SDCI_CMD_NCR_NID_NID,
|
| | 260 | + 0, NULL, CEATA_COMMAND_TIMEOUT), 3, 3);
|
| | 261 | + PASS_RC(mmc_send_command(SDCI_CMD_CMD_NUM(MMC_CMD_SET_RELATIVE_ADDR)
|
| | 262 | + | SDCI_CMD_CMD_TYPE_BCR | SDCI_CMD_RES_TYPE_R1
|
| | 263 | + | SDCI_CMD_RES_SIZE_48 | SDCI_CMD_NCR_NID_NCR,
|
| | 264 | + MMC_CMD_SET_RELATIVE_ADDR_RCA(CEATA_MMC_RCA),
|
| | 265 | + NULL, CEATA_COMMAND_TIMEOUT), 3, 4);
|
| | 266 | + PASS_RC(mmc_send_command(SDCI_CMD_CMD_NUM(MMC_CMD_SELECT_CARD)
|
| | 267 | + | SDCI_CMD_CMD_TYPE_AC | SDCI_CMD_RES_TYPE_R1
|
| | 268 | + | SDCI_CMD_RES_SIZE_48 | SDCI_CMD_NCR_NID_NCR,
|
| | 269 | + MMC_CMD_SELECT_CARD_RCA(CEATA_MMC_RCA),
|
| | 270 | + NULL, CEATA_COMMAND_TIMEOUT), 3, 5);
|
| | 271 | + PASS_RC(mmc_get_card_status(&result), 3, 6);
|
| | 272 | + if ((result & MMC_STATUS_CURRENT_STATE_MASK) != MMC_STATUS_CURRENT_STATE_TRAN) RET_ERR(7);
|
| | 273 | + return 0;
|
| | 274 | +}
|
| | 275 | +
|
| | 276 | +int mmc_fastio_write(uint32_t addr, uint32_t data)
|
| | 277 | +{
|
| | 278 | + return mmc_send_command(SDCI_CMD_CMD_NUM(MMC_CMD_FAST_IO)
|
| | 279 | + | SDCI_CMD_CMD_TYPE_AC | SDCI_CMD_RES_TYPE_R4
|
| | 280 | + | SDCI_CMD_RES_SIZE_48 | SDCI_CMD_NCR_NID_NCR,
|
| | 281 | + MMC_CMD_FAST_IO_RCA(CEATA_MMC_RCA) | MMC_CMD_FAST_IO_DIRECTION_WRITE
|
| | 282 | + | MMC_CMD_FAST_IO_ADDRESS(addr) | MMC_CMD_FAST_IO_DATA(data),
|
| | 283 | + NULL, CEATA_COMMAND_TIMEOUT);
|
| | 284 | +}
|
| | 285 | +
|
| | 286 | +int mmc_fastio_read(uint32_t addr, uint32_t* data)
|
| | 287 | +{
|
| | 288 | + return mmc_send_command(SDCI_CMD_CMD_NUM(MMC_CMD_FAST_IO)
|
| | 289 | + | SDCI_CMD_CMD_TYPE_AC | SDCI_CMD_RES_TYPE_R4
|
| | 290 | + | SDCI_CMD_RES_SIZE_48 | SDCI_CMD_NCR_NID_NCR,
|
| | 291 | + MMC_CMD_FAST_IO_RCA(CEATA_MMC_RCA) | MMC_CMD_FAST_IO_DIRECTION_READ
|
| | 292 | + | MMC_CMD_FAST_IO_ADDRESS(addr), data, CEATA_COMMAND_TIMEOUT);
|
| | 293 | +}
|
| | 294 | +
|
| | 295 | +int ceata_soft_reset()
|
| | 296 | +{
|
| | 297 | + PASS_RC(mmc_fastio_write(6, 4), 2, 0);
|
| | 298 | + sleep(1000);
|
| | 299 | + PASS_RC(mmc_fastio_write(6, 0), 2, 1);
|
| | 300 | + sleep(10000);
|
| | 301 | + long startusec = USEC_TIMER;
|
| | 302 | + uint32_t status;
|
| | 303 | + do
|
| | 304 | + {
|
| | 305 | + PASS_RC(mmc_fastio_read(0xf, &status), 2, 2);
|
| | 306 | + if (TIMEOUT_EXPIRED(startusec, CEATA_POWERUP_TIMEOUT)) RET_ERR(3);
|
| | 307 | + sleep(1000);
|
| | 308 | + }
|
| | 309 | + while (status & 0x80);
|
| | 310 | + return 0;
|
| | 311 | +}
|
| | 312 | +
|
| | 313 | +int mmc_dsta_check_data_success()
|
| | 314 | +{
|
| | 315 | + int rc = 0;
|
| | 316 | + uint32_t dsta = SDCI_DSTA;
|
| | 317 | + if (dsta & (SDCI_DSTA_WR_DATCRCE | SDCI_DSTA_RD_DATCRCE))
|
| | 318 | + {
|
| | 319 | + if (dsta & SDCI_DSTA_WR_DATCRCE) rc |= 1;
|
| | 320 | + if (dsta & SDCI_DSTA_RD_DATCRCE) rc |= 2;
|
| | 321 | + if ((dsta & SDCI_DSTA_WR_CRC_STATUS_MASK) == SDCI_DSTA_WR_CRC_STATUS_TXERR) rc |= 4;
|
| | 322 | + else if ((dsta & SDCI_DSTA_WR_CRC_STATUS_MASK) == SDCI_DSTA_WR_CRC_STATUS_CARDERR) rc |= 8;
|
| | 323 | + }
|
| | 324 | + if (dsta & (SDCI_DSTA_RD_DATENDE0 | SDCI_DSTA_RD_DATENDE1 | SDCI_DSTA_RD_DATENDE2
|
| | 325 | + | SDCI_DSTA_RD_DATENDE3 | SDCI_DSTA_RD_DATENDE4 | SDCI_DSTA_RD_DATENDE5
|
| | 326 | + | SDCI_DSTA_RD_DATENDE6 | SDCI_DSTA_RD_DATENDE7))
|
| | 327 | + rc |= 16;
|
| | 328 | + if (rc) RET_ERR(rc);
|
| | 329 | + return 0;
|
| | 330 | +}
|
| | 331 | +
|
| | 332 | +void mmc_discard_irq()
|
| | 333 | +{
|
| | 334 | + SDCI_IRQ = SDCI_IRQ_DAT_DONE_INT | SDCI_IRQ_MASK_MASK_IOCARD_IRQ_INT
|
| | 335 | + | SDCI_IRQ_MASK_MASK_READ_WAIT_INT;
|
| | 336 | + wakeup_wait(&mmc_wakeup, TIMEOUT_NONE);
|
| | 337 | +}
|
| | 338 | +
|
| | 339 | +int ceata_read_multiple_register(uint32_t addr, void* dest, uint32_t size)
|
| | 340 | +{
|
| | 341 | + if (size > 0x10) RET_ERR(0);
|
| | 342 | + mmc_discard_irq();
|
| | 343 | + SDCI_DMASIZE = size;
|
| | 344 | + SDCI_DMACOUNT = 1;
|
| | 345 | + SDCI_DMAADDR = dest;
|
| | 346 | + SDCI_DCTRL = SDCI_DCTRL_TXFIFORST | SDCI_DCTRL_RXFIFORST;
|
| | 347 | + PASS_RC(mmc_send_command(SDCI_CMD_CMD_NUM(MMC_CMD_CEATA_RW_MULTIPLE_REG)
|
| | 348 | + | SDCI_CMD_CMD_TYPE_ADTC | SDCI_CMD_RES_TYPE_R1
|
| | 349 | + | SDCI_CMD_RES_SIZE_48 | SDCI_CMD_NCR_NID_NCR,
|
| | 350 | + MMC_CMD_CEATA_RW_MULTIPLE_REG_DIRECTION_READ
|
| | 351 | + | MMC_CMD_CEATA_RW_MULTIPLE_REG_ADDRESS(addr & 0xfc)
|
| | 352 | + | MMC_CMD_CEATA_RW_MULTIPLE_REG_COUNT(size & 0xfc),
|
| | 353 | + NULL, CEATA_COMMAND_TIMEOUT), 2, 1);
|
| | 354 | + long startusec = USEC_TIMER;
|
| | 355 | + if (wakeup_wait(&mmc_wakeup, CEATA_COMMAND_TIMEOUT) == THREAD_TIMEOUT) RET_ERR(2);
|
| | 356 | + invalidate_dcache();
|
| | 357 | + PASS_RC(mmc_dsta_check_data_success(), 2, 3);
|
| | 358 | + return 0;
|
| | 359 | +}
|
| | 360 | +
|
| | 361 | +int ceata_write_multiple_register(uint32_t addr, void* dest, uint32_t size)
|
| | 362 | +{
|
| | 363 | + int i;
|
| | 364 | + if (size > 0x10) RET_ERR(0);
|
| | 365 | + mmc_discard_irq();
|
| | 366 | + SDCI_DMASIZE = size;
|
| | 367 | + SDCI_DMACOUNT = 0;
|
| | 368 | + SDCI_DCTRL = SDCI_DCTRL_TXFIFORST | SDCI_DCTRL_RXFIFORST;
|
| | 369 | + PASS_RC(mmc_send_command(SDCI_CMD_CMD_NUM(MMC_CMD_CEATA_RW_MULTIPLE_REG)
|
| | 370 | + | SDCI_CMD_CMD_TYPE_ADTC | SDCI_CMD_CMD_RD_WR
|
| | 371 | + | SDCI_CMD_RES_BUSY | SDCI_CMD_RES_TYPE_R1
|
| | 372 | + | SDCI_CMD_RES_SIZE_48 | SDCI_CMD_NCR_NID_NCR,
|
| | 373 | + MMC_CMD_CEATA_RW_MULTIPLE_REG_DIRECTION_WRITE
|
| | 374 | + | MMC_CMD_CEATA_RW_MULTIPLE_REG_ADDRESS(addr & 0xfc)
|
| | 375 | + | MMC_CMD_CEATA_RW_MULTIPLE_REG_COUNT(size & 0xfc),
|
| | 376 | + NULL, CEATA_COMMAND_TIMEOUT), 3, 1);
|
| | 377 | + SDCI_DCTRL = SDCI_DCTRL_TRCONT_TX;
|
| | 378 | + for (i = 0; i < size / 4; i++) SDCI_DATA = ((uint32_t*)dest)[i];
|
| | 379 | + long startusec = USEC_TIMER;
|
| | 380 | + if (wakeup_wait(&mmc_wakeup, CEATA_COMMAND_TIMEOUT) == THREAD_TIMEOUT) RET_ERR(2);
|
| | 381 | + while ((SDCI_STATE & SDCI_STATE_DAT_STATE_MASK) != SDCI_STATE_DAT_STATE_IDLE)
|
| | 382 | + {
|
| | 383 | + if (TIMEOUT_EXPIRED(startusec, CEATA_COMMAND_TIMEOUT)) RET_ERR(3);
|
| | 384 | + yield();
|
| | 385 | + }
|
| | 386 | + PASS_RC(mmc_dsta_check_data_success(), 3, 4);
|
| | 387 | + return 0;
|
| | 388 | +}
|
| | 389 | +
|
| | 390 | +int ceata_init(int buswidth)
|
| | 391 | +{
|
| | 392 | + uint32_t result;
|
| | 393 | + PASS_RC(mmc_send_command(SDCI_CMD_CMD_NUM(MMC_CMD_SWITCH) | SDCI_CMD_RES_BUSY
|
| | 394 | + | SDCI_CMD_CMD_TYPE_AC | SDCI_CMD_RES_TYPE_R1
|
| | 395 | + | SDCI_CMD_RES_SIZE_48 | SDCI_CMD_NCR_NID_NCR,
|
| | 396 | + MMC_CMD_SWITCH_ACCESS_WRITE_BYTE
|
| | 397 | + | MMC_CMD_SWITCH_INDEX(MMC_CMD_SWITCH_FIELD_HS_TIMING)
|
| | 398 | + | MMC_CMD_SWITCH_VALUE(MMC_CMD_SWITCH_FIELD_HS_TIMING_HIGH_SPEED),
|
| | 399 | + &result, CEATA_COMMAND_TIMEOUT), 3, 0);
|
| | 400 | + if (result & MMC_STATUS_SWITCH_ERROR) RET_ERR(1);
|
| | 401 | + if (buswidth > 1)
|
| | 402 | + {
|
| | 403 | + int setting;
|
| | 404 | + if (buswidth == 4) setting = MMC_CMD_SWITCH_FIELD_BUS_WIDTH_4BIT;
|
| | 405 | + else if (buswidth == 8) setting = MMC_CMD_SWITCH_FIELD_BUS_WIDTH_8BIT;
|
| | 406 | + else setting = MMC_CMD_SWITCH_FIELD_BUS_WIDTH_1BIT;
|
| | 407 | + PASS_RC(mmc_send_command(SDCI_CMD_CMD_NUM(MMC_CMD_SWITCH) | SDCI_CMD_RES_BUSY
|
| | 408 | + | SDCI_CMD_CMD_TYPE_AC | SDCI_CMD_RES_TYPE_R1
|
| | 409 | + | SDCI_CMD_RES_SIZE_48 | SDCI_CMD_NCR_NID_NCR,
|
| | 410 | + MMC_CMD_SWITCH_ACCESS_WRITE_BYTE
|
| | 411 | + | MMC_CMD_SWITCH_INDEX(MMC_CMD_SWITCH_FIELD_BUS_WIDTH)
|
| | 412 | + | MMC_CMD_SWITCH_VALUE(setting),
|
| | 413 | + &result, CEATA_COMMAND_TIMEOUT), 3, 2);
|
| | 414 | + if (result & MMC_STATUS_SWITCH_ERROR) RET_ERR(3);
|
| | 415 | + if (buswidth == 4)
|
| | 416 | + SDCI_CTRL = (SDCI_CTRL & ~SDCI_CTRL_BUS_WIDTH_MASK) | SDCI_CTRL_BUS_WIDTH_4BIT;
|
| | 417 | + else if (buswidth == 8)
|
| | 418 | + SDCI_CTRL = (SDCI_CTRL & ~SDCI_CTRL_BUS_WIDTH_MASK) | SDCI_CTRL_BUS_WIDTH_8BIT;
|
| | 419 | + }
|
| | 420 | + PASS_RC(ceata_soft_reset(), 3, 4);
|
| | 421 | + PASS_RC(ceata_read_multiple_register(0, ceata_taskfile, 0x10), 3, 5);
|
| | 422 | + if (ceata_taskfile[0xc] != 0xce || ceata_taskfile[0xd] != 0xaa) RET_ERR(6);
|
| | 423 | + PASS_RC(mmc_fastio_write(6, 0), 3, 7);
|
| | 424 | + return 0;
|
| | 425 | +}
|
| | 426 | +
|
| | 427 | +int ceata_check_error()
|
| | 428 | +{
|
| | 429 | + uint32_t status, error;
|
| | 430 | + PASS_RC(mmc_fastio_read(0xf, &status), 2, 0);
|
| | 431 | + if (status & 1)
|
| | 432 | + {
|
| | 433 | + PASS_RC(mmc_fastio_read(0x9, &error), 2, 1);
|
| | 434 | + RET_ERR((error << 2) | 2);
|
| | 435 | + }
|
| | 436 | + return 0;
|
| | 437 | +}
|
| | 438 | +
|
| | 439 | +int ceata_wait_idle()
|
| | 440 | +{
|
| | 441 | + long startusec = USEC_TIMER;
|
| | 442 | + while (true)
|
| | 443 | + {
|
| | 444 | + uint32_t status;
|
| | 445 | + PASS_RC(mmc_fastio_read(0xf, &status), 1, 0);
|
| | 446 | + if (!(status & 0x88)) return 0;
|
| | 447 | + if (TIMEOUT_EXPIRED(startusec, CEATA_DAT_NONBUSY_TIMEOUT)) RET_ERR(1);
|
| | 448 | + sleep(50000);
|
| | 449 | + }
|
| | 450 | +}
|
| | 451 | +
|
| | 452 | +int ceata_cancel_command()
|
| | 453 | +{
|
| | 454 | + *((uint32_t volatile*)0x3cf00200) = 0x9000e;
|
| | 455 | + sleep(1);
|
| | 456 | + *((uint32_t volatile*)0x3cf00200) = 0x9000f;
|
| | 457 | + sleep(1);
|
| | 458 | + *((uint32_t volatile*)0x3cf00200) = 0x90003;
|
| | 459 | + sleep(1);
|
| | 460 | + PASS_RC(mmc_send_command(SDCI_CMD_CMD_NUM(MMC_CMD_STOP_TRANSMISSION)
|
| | 461 | + | SDCI_CMD_CMD_TYPE_AC | SDCI_CMD_RES_TYPE_R1 | SDCI_CMD_RES_BUSY
|
| | 462 | + | SDCI_CMD_RES_SIZE_48 | SDCI_CMD_NCR_NID_NCR,
|
| | 463 | + 0, NULL, CEATA_COMMAND_TIMEOUT), 1, 0);
|
| | 464 | + PASS_RC(ceata_wait_idle(), 1, 1);
|
| | 465 | + return 0;
|
| | 466 | +}
|
| | 467 | +
|
| | 468 | +int ceata_rw_multiple_block(bool write, void* buf, uint32_t count, long timeout)
|
| | 469 | +{
|
| | 470 | + mmc_discard_irq();
|
| | 471 | + uint32_t responsetype;
|
| | 472 | + uint32_t cmdtype;
|
| | 473 | + uint32_t direction;
|
| | 474 | + if (write)
|
| | 475 | + {
|
| | 476 | + clean_dcache();
|
| | 477 | + cmdtype = SDCI_CMD_CMD_TYPE_ADTC | SDCI_CMD_CMD_RD_WR;
|
| | 478 | + responsetype = SDCI_CMD_RES_TYPE_R1 | SDCI_CMD_RES_BUSY;
|
| | 479 | + direction = MMC_CMD_CEATA_RW_MULTIPLE_BLOCK_DIRECTION_WRITE;
|
| | 480 | + }
|
| | 481 | + else
|
| | 482 | + {
|
| | 483 | + cmdtype = SDCI_CMD_CMD_TYPE_ADTC;
|
| | 484 | + responsetype = SDCI_CMD_RES_TYPE_R1;
|
| | 485 | + direction = MMC_CMD_CEATA_RW_MULTIPLE_BLOCK_DIRECTION_READ;
|
| | 486 | + }
|
| | 487 | + SDCI_DMASIZE = 0x200;
|
| | 488 | + SDCI_DMAADDR = buf;
|
| | 489 | + SDCI_DMACOUNT = count;
|
| | 490 | + SDCI_DCTRL = SDCI_DCTRL_TXFIFORST | SDCI_DCTRL_RXFIFORST;
|
| | 491 | + PASS_RC(mmc_send_command(SDCI_CMD_CMD_NUM(MMC_CMD_CEATA_RW_MULTIPLE_BLOCK)
|
| | 492 | + | SDCI_CMD_CMD_TYPE_ADTC | cmdtype | responsetype
|
| | 493 | + | SDCI_CMD_RES_SIZE_48 | SDCI_CMD_NCR_NID_NCR,
|
| | 494 | + direction | MMC_CMD_CEATA_RW_MULTIPLE_BLOCK_COUNT(count),
|
| | 495 | + NULL, CEATA_COMMAND_TIMEOUT), 4, 0);
|
| | 496 | + if (write) SDCI_DCTRL = SDCI_DCTRL_TRCONT_TX;
|
| | 497 | + if (wakeup_wait(&mmc_wakeup, timeout) == THREAD_TIMEOUT)
|
| | 498 | + {
|
| | 499 | + PASS_RC(ceata_cancel_command(), 4, 1);
|
| | 500 | + RET_ERR(2);
|
| | 501 | + }
|
| | 502 | + if (!write) invalidate_dcache();
|
| | 503 | + PASS_RC(mmc_dsta_check_data_success(), 4, 3);
|
| | 504 | + if (wakeup_wait(&mmc_comp_wakeup, timeout) == THREAD_TIMEOUT)
|
| | 505 | + {
|
| | 506 | + PASS_RC(ceata_cancel_command(), 4, 4);
|
| | 507 | + RET_ERR(4);
|
| | 508 | + }
|
| | 509 | + PASS_RC(ceata_check_error(), 4, 5);
|
| | 510 | + return 0;
|
| | 511 | +}
|
| | 512 | +
|
| 154 | 513 | int ata_identify(uint16_t* buf)
|
| 155 | 514 | {
|
| 156 | 515 | int i;
|
| 157 | | - PASS_RC(ata_wait_for_not_bsy(10000000), 1, 0);
|
| 158 | | - ata_write_cbr(&ATA_PIO_DVR, 0);
|
| 159 | | - ata_write_cbr(&ATA_PIO_CSD, 0xec);
|
| 160 | | - PASS_RC(ata_wait_for_start_of_transfer(10000000), 1, 1);
|
| 161 | | - for (i = 0; i < 0x100; i++)
|
| | 516 | + if (ceata)
|
| 162 | 517 | {
|
| 163 | | - uint16_t word = ata_read_cbr(&ATA_PIO_DTR);
|
| 164 | | - buf[i] = (word >> 8) | (word << 8);
|
| | 518 | + memset(ceata_taskfile, 0, 16);
|
| | 519 | + ceata_taskfile[0xf] = 0xec;
|
| | 520 | + PASS_RC(ceata_wait_idle(), 2, 0);
|
| | 521 | + PASS_RC(ceata_write_multiple_register(0, ceata_taskfile, 16), 2, 1);
|
| | 522 | + PASS_RC(ceata_rw_multiple_block(false, buf, 1, CEATA_COMMAND_TIMEOUT), 2, 2);
|
| | 523 | + for (i = 0; i < 0x100; i++)
|
| | 524 | + {
|
| | 525 | + uint16_t word = buf[i];
|
| | 526 | + buf[i] = (word >> 8) | (word << 8);
|
| | 527 | + }
|
| 165 | 528 | }
|
| | 529 | + else
|
| | 530 | + {
|
| | 531 | + PASS_RC(ata_wait_for_not_bsy(10000000), 1, 0);
|
| | 532 | + ata_write_cbr(&ATA_PIO_DVR, 0);
|
| | 533 | + ata_write_cbr(&ATA_PIO_CSD, 0xec);
|
| | 534 | + PASS_RC(ata_wait_for_start_of_transfer(10000000), 1, 1);
|
| | 535 | + for (i = 0; i < 0x100; i++)
|
| | 536 | + {
|
| | 537 | + uint16_t word = ata_read_cbr(&ATA_PIO_DTR);
|
| | 538 | + buf[i] = (word >> 8) | (word << 8);
|
| | 539 | + }
|
| | 540 | + }
|
| | 541 | + return 0;
|
| 166 | 542 | }
|
| 167 | 543 |
|
| 168 | 544 | void ata_set_active(void)
|
| — | — | @@ -195,89 +571,110 @@ |
| 196 | 572 | ata_set_active();
|
| 197 | 573 | if (ata_powered) return 0;
|
| 198 | 574 | i2c_sendbyte(0, 0xe6, 0x1b, 1);
|
| 199 | | - clockgate_enable(5, true);
|
| 200 | | - ATA_CFG = BIT(0);
|
| 201 | | - sleep(1000);
|
| 202 | | - ATA_CFG = 0;
|
| 203 | | - sleep(6000);
|
| 204 | | - ATA_SWRST = BIT(0);
|
| 205 | | - sleep(500);
|
| 206 | | - ATA_SWRST = 0;
|
| 207 | | - sleep(90000);
|
| 208 | | - ATA_CONTROL = BIT(0);
|
| 209 | | - sleep(200000);
|
| 210 | | - ATA_PIO_TIME = 0x191f7;
|
| 211 | | - ATA_PIO_LHR = 0;
|
| 212 | | - while (!(ATA_PIO_READY & BIT(1))) sleep(100);
|
| 213 | | - PASS_RC(ata_identify(ata_identify_data), 2, 0);
|
| 214 | | - uint32_t piotime = 0x11f3;
|
| 215 | | - uint32_t mdmatime = 0x1c175;
|
| 216 | | - uint32_t udmatime = 0x5071152;
|
| 217 | | - uint32_t param = 0;
|
| 218 | | - ata_dma_flags = 0;
|
| 219 | | - ata_lba48 = ata_identify_data[83] & BIT(10) ? true : false;
|
| 220 | | - if (ata_lba48)
|
| 221 | | - ata_total_sectors = ata_identify_data[100]
|
| 222 | | - | (((uint64_t)ata_identify_data[101]) << 16)
|
| 223 | | - | (((uint64_t)ata_identify_data[102]) << 32)
|
| 224 | | - | (((uint64_t)ata_identify_data[103]) << 48);
|
| 225 | | - else ata_total_sectors = ata_identify_data[60] | (((uint32_t)ata_identify_data[61]) << 16);
|
| 226 | | - ata_total_sectors >>= 3;
|
| 227 | | - if (ata_identify_data[53] & BIT(1))
|
| | 575 | + if (ceata)
|
| 228 | 576 | {
|
| 229 | | - if (ata_identify_data[64] & BIT(1)) piotime = 0x2072;
|
| 230 | | - else if (ata_identify_data[64] & BIT(0)) piotime = 0x7083;
|
| | 577 | + clockgate_enable(9, true);
|
| | 578 | + SDCI_RESET = 0xa5;
|
| | 579 | + sleep(1000);
|
| | 580 | + *((uint32_t volatile*)0x3cf00380) = 0;
|
| | 581 | + *((uint32_t volatile*)0x3cf0010c) = 0xff;
|
| | 582 | + SDCI_CTRL = SDCI_CTRL_SDCIEN | SDCI_CTRL_CLK_SEL_SDCLK
|
| | 583 | + | SDCI_CTRL_BIT_8 | SDCI_CTRL_BIT_14;
|
| | 584 | + SDCI_CDIV = SDCI_CDIV_CLKDIV(260);
|
| | 585 | + *((uint32_t volatile*)0x3cf00200) = 0xb000f;
|
| | 586 | + SDCI_IRQ_MASK = SDCI_IRQ_MASK_MASK_DAT_DONE_INT | SDCI_IRQ_MASK_MASK_IOCARD_IRQ_INT;
|
| | 587 | + PASS_RC(mmc_init(), 2, 0);
|
| | 588 | + SDCI_CDIV = SDCI_CDIV_CLKDIV(4);
|
| | 589 | + sleep(10000);
|
| | 590 | + PASS_RC(ceata_init(8), 2, 1);
|
| | 591 | + PASS_RC(ata_identify(ata_identify_data), 2, 2);
|
| 231 | 592 | }
|
| 232 | | - if (ata_identify_data[63] & BIT(2))
|
| | 593 | + else
|
| 233 | 594 | {
|
| 234 | | - mdmatime = 0x5072;
|
| 235 | | - param = 0x22;
|
| 236 | | - }
|
| 237 | | - else if (ata_identify_data[63] & BIT(1))
|
| 238 | | - {
|
| 239 | | - mdmatime = 0x7083;
|
| 240 | | - param = 0x21;
|
| 241 | | - }
|
| 242 | | - if (ata_identify_data[63] & BITRANGE(0, 2))
|
| 243 | | - {
|
| 244 | | - ata_dma_flags = BIT(3) | BIT(10);
|
| 245 | | - param |= 0x20;
|
| 246 | | - }
|
| 247 | | - if (ata_identify_data[53] & BIT(2))
|
| 248 | | - {
|
| 249 | | - if (ata_identify_data[88] & BIT(4))
|
| | 595 | + clockgate_enable(5, true);
|
| | 596 | + ATA_CFG = BIT(0);
|
| | 597 | + sleep(1000);
|
| | 598 | + ATA_CFG = 0;
|
| | 599 | + sleep(6000);
|
| | 600 | + ATA_SWRST = BIT(0);
|
| | 601 | + sleep(500);
|
| | 602 | + ATA_SWRST = 0;
|
| | 603 | + sleep(90000);
|
| | 604 | + ATA_CONTROL = BIT(0);
|
| | 605 | + sleep(200000);
|
| | 606 | + ATA_PIO_TIME = 0x191f7;
|
| | 607 | + ATA_PIO_LHR = 0;
|
| | 608 | + while (!(ATA_PIO_READY & BIT(1))) sleep(100);
|
| | 609 | + PASS_RC(ata_identify(ata_identify_data), 2, 0);
|
| | 610 | + uint32_t piotime = 0x11f3;
|
| | 611 | + uint32_t mdmatime = 0x1c175;
|
| | 612 | + uint32_t udmatime = 0x5071152;
|
| | 613 | + uint32_t param = 0;
|
| | 614 | + ata_dma_flags = 0;
|
| | 615 | + ata_lba48 = ata_identify_data[83] & BIT(10) ? true : false;
|
| | 616 | + if (ata_identify_data[53] & BIT(1))
|
| 250 | 617 | {
|
| 251 | | - udmatime = 0x2010a52;
|
| 252 | | - param = 0x44;
|
| | 618 | + if (ata_identify_data[64] & BIT(1)) piotime = 0x2072;
|
| | 619 | + else if (ata_identify_data[64] & BIT(0)) piotime = 0x7083;
|
| 253 | 620 | }
|
| 254 | | - else if (ata_identify_data[88] & BIT(3))
|
| | 621 | + if (ata_identify_data[63] & BIT(2))
|
| 255 | 622 | {
|
| 256 | | - udmatime = 0x2020a52;
|
| 257 | | - param = 0x43;
|
| | 623 | + mdmatime = 0x5072;
|
| | 624 | + param = 0x22;
|
| 258 | 625 | }
|
| 259 | | - else if (ata_identify_data[88] & BIT(2))
|
| | 626 | + else if (ata_identify_data[63] & BIT(1))
|
| 260 | 627 | {
|
| 261 | | - udmatime = 0x3030a52;
|
| 262 | | - param = 0x42;
|
| | 628 | + mdmatime = 0x7083;
|
| | 629 | + param = 0x21;
|
| 263 | 630 | }
|
| 264 | | - else if (ata_identify_data[88] & BIT(1))
|
| | 631 | + if (ata_identify_data[63] & BITRANGE(0, 2))
|
| 265 | 632 | {
|
| 266 | | - udmatime = 0x3050a52;
|
| 267 | | - param = 0x41;
|
| | 633 | + ata_dma_flags = BIT(3) | BIT(10);
|
| | 634 | + param |= 0x20;
|
| 268 | 635 | }
|
| 269 | | - if (ata_identify_data[88] & BITRANGE(0, 4))
|
| | 636 | + if (ata_identify_data[53] & BIT(2))
|
| 270 | 637 | {
|
| 271 | | - ata_dma_flags = BIT(2) | BIT(3) | BIT(9) | BIT(10);
|
| 272 | | - param |= 0x40;
|
| | 638 | + if (ata_identify_data[88] & BIT(4))
|
| | 639 | + {
|
| | 640 | + udmatime = 0x2010a52;
|
| | 641 | + param = 0x44;
|
| | 642 | + }
|
| | 643 | + else if (ata_identify_data[88] & BIT(3))
|
| | 644 | + {
|
| | 645 | + udmatime = 0x2020a52;
|
| | 646 | + param = 0x43;
|
| | 647 | + }
|
| | 648 | + else if (ata_identify_data[88] & BIT(2))
|
| | 649 | + {
|
| | 650 | + udmatime = 0x3030a52;
|
| | 651 | + param = 0x42;
|
| | 652 | + }
|
| | 653 | + else if (ata_identify_data[88] & BIT(1))
|
| | 654 | + {
|
| | 655 | + udmatime = 0x3050a52;
|
| | 656 | + param = 0x41;
|
| | 657 | + }
|
| | 658 | + if (ata_identify_data[88] & BITRANGE(0, 4))
|
| | 659 | + {
|
| | 660 | + ata_dma_flags = BIT(2) | BIT(3) | BIT(9) | BIT(10);
|
| | 661 | + param |= 0x40;
|
| | 662 | + }
|
| 273 | 663 | }
|
| | 664 | + ata_dma = param ? true : false;
|
| | 665 | + PASS_RC(ata_set_feature(0xef, param), 2, 1);
|
| | 666 | + if (ata_identify_data[82] & BIT(5)) PASS_RC(ata_set_feature(0x02, 0), 2, 2);
|
| | 667 | + if (ata_identify_data[82] & BIT(6)) PASS_RC(ata_set_feature(0x55, 0), 2, 3);
|
| | 668 | + ATA_PIO_TIME = piotime;
|
| | 669 | + ATA_MDMA_TIME = mdmatime;
|
| | 670 | + ATA_UDMA_TIME = udmatime;
|
| 274 | 671 | }
|
| 275 | | - ata_dma = param ? true : false;
|
| 276 | | - PASS_RC(ata_set_feature(0xef, param), 2, 1);
|
| 277 | | - if (ata_identify_data[82] & BIT(5)) PASS_RC(ata_set_feature(0x02, 0), 2, 2);
|
| 278 | | - if (ata_identify_data[82] & BIT(6)) PASS_RC(ata_set_feature(0x55, 0), 2, 3);
|
| 279 | | - ATA_PIO_TIME = piotime;
|
| 280 | | - ATA_MDMA_TIME = mdmatime;
|
| 281 | | - ATA_UDMA_TIME = udmatime;
|
| | 672 | + if (ata_lba48)
|
| | 673 | + ata_total_sectors = ata_identify_data[100]
|
| | 674 | + | (((uint64_t)ata_identify_data[101]) << 16)
|
| | 675 | + | (((uint64_t)ata_identify_data[102]) << 32)
|
| | 676 | + | (((uint64_t)ata_identify_data[103]) << 48);
|
| | 677 | + else ata_total_sectors = ata_identify_data[60] | (((uint32_t)ata_identify_data[61]) << 16);
|
| | 678 | + ata_total_sectors >>= 3;
|
| 282 | 679 | ata_powered = true;
|
| 283 | 680 | ata_set_active();
|
| 284 | 681 | return 0;
|
| — | — | @@ -287,93 +684,125 @@ |
| 288 | 685 | {
|
| 289 | 686 | if (!ata_powered) return;
|
| 290 | 687 | ata_powered = false;
|
| 291 | | - ata_wait_for_rdy(1000000);
|
| 292 | | - ata_write_cbr(&ATA_PIO_DVR, 0);
|
| 293 | | - ata_write_cbr(&ATA_PIO_CSD, 0xe0);
|
| 294 | | - ata_wait_for_rdy(1000000);
|
| 295 | | - sleep(30000);
|
| 296 | | - ATA_CONTROL = 0;
|
| 297 | | - while (!(ATA_CONTROL & BIT(1))) yield();
|
| 298 | | - clockgate_enable(5, false);
|
| | 688 | + if (ceata)
|
| | 689 | + {
|
| | 690 | + memset(ceata_taskfile, 0, 16);
|
| | 691 | + ceata_taskfile[0xf] = 0xe0;
|
| | 692 | + ceata_wait_idle();
|
| | 693 | + ceata_write_multiple_register(0, ceata_taskfile, 16);
|
| | 694 | + wakeup_wait(&mmc_comp_wakeup, CEATA_COMMAND_TIMEOUT);
|
| | 695 | + sleep(30000);
|
| | 696 | + clockgate_enable(9, false);
|
| | 697 | + }
|
| | 698 | + else
|
| | 699 | + {
|
| | 700 | + ata_wait_for_rdy(1000000);
|
| | 701 | + ata_write_cbr(&ATA_PIO_DVR, 0);
|
| | 702 | + ata_write_cbr(&ATA_PIO_CSD, 0xe0);
|
| | 703 | + ata_wait_for_rdy(1000000);
|
| | 704 | + sleep(30000);
|
| | 705 | + ATA_CONTROL = 0;
|
| | 706 | + while (!(ATA_CONTROL & BIT(1))) yield();
|
| | 707 | + clockgate_enable(5, false);
|
| | 708 | + }
|
| 299 | 709 | i2c_sendbyte(0, 0xe6, 0x1b, 0);
|
| 300 | 710 | }
|
| 301 | 711 |
|
| 302 | 712 | int ata_rw_chunk(uint64_t sector, uint32_t cnt, void* buffer, bool write)
|
| 303 | 713 | {
|
| 304 | | - PASS_RC(ata_wait_for_rdy(100000), 2, 0);
|
| 305 | | - ata_write_cbr(&ATA_PIO_DVR, 0);
|
| 306 | | - if (ata_lba48)
|
| | 714 | + if (ceata)
|
| 307 | 715 | {
|
| 308 | | - ata_write_cbr(&ATA_PIO_SCR, cnt >> 5);
|
| 309 | | - ata_write_cbr(&ATA_PIO_SCR, (cnt << 3) & 0xff);
|
| 310 | | - ata_write_cbr(&ATA_PIO_LHR, (sector >> 37) & 0xff);
|
| 311 | | - ata_write_cbr(&ATA_PIO_LMR, (sector >> 29) & 0xff);
|
| 312 | | - ata_write_cbr(&ATA_PIO_LLR, (sector >> 21) & 0xff);
|
| 313 | | - ata_write_cbr(&ATA_PIO_LHR, (sector >> 13) & 0xff);
|
| 314 | | - ata_write_cbr(&ATA_PIO_LMR, (sector >> 5) & 0xff);
|
| 315 | | - ata_write_cbr(&ATA_PIO_LLR, (sector << 3) & 0xff);
|
| 316 | | - ata_write_cbr(&ATA_PIO_DVR, BIT(6));
|
| 317 | | - if (write) ata_write_cbr(&ATA_PIO_CSD, ata_dma ? 0x35 : 0x39);
|
| 318 | | - else ata_write_cbr(&ATA_PIO_CSD, ata_dma ? 0x25 : 0x29);
|
| | 716 | + memset(ceata_taskfile, 0, 16);
|
| | 717 | + ceata_taskfile[0x2] = cnt >> 5;
|
| | 718 | + ceata_taskfile[0x3] = sector >> 21;
|
| | 719 | + ceata_taskfile[0x4] = sector >> 29;
|
| | 720 | + ceata_taskfile[0x5] = sector >> 37;
|
| | 721 | + ceata_taskfile[0xa] = cnt << 3;
|
| | 722 | + ceata_taskfile[0xb] = sector << 3;
|
| | 723 | + ceata_taskfile[0xc] = sector >> 5;
|
| | 724 | + ceata_taskfile[0xd] = sector >> 13;
|
| | 725 | + ceata_taskfile[0xf] = write ? 0x35 : 0x25;
|
| | 726 | + PASS_RC(ceata_wait_idle(), 2, 0);
|
| | 727 | + PASS_RC(ceata_write_multiple_register(0, ceata_taskfile, 16), 2, 1);
|
| | 728 | + PASS_RC(ceata_rw_multiple_block(write, buffer, cnt, CEATA_COMMAND_TIMEOUT), 2, 2);
|
| 319 | 729 | }
|
| 320 | 730 | else
|
| 321 | 731 | {
|
| 322 | | - ata_write_cbr(&ATA_PIO_SCR, (cnt << 3) & 0xff);
|
| 323 | | - ata_write_cbr(&ATA_PIO_LHR, (sector >> 13) & 0xff);
|
| 324 | | - ata_write_cbr(&ATA_PIO_LMR, (sector >> 5) & 0xff);
|
| 325 | | - ata_write_cbr(&ATA_PIO_LLR, (sector << 3) & 0xff);
|
| 326 | | - ata_write_cbr(&ATA_PIO_DVR, BIT(6) | ((sector >> 21) & 0xf));
|
| 327 | | - if (write) ata_write_cbr(&ATA_PIO_CSD, ata_dma ? 0xca : 0x30);
|
| 328 | | - else ata_write_cbr(&ATA_PIO_CSD, ata_dma ? 0xc8 : 0xc4);
|
| 329 | | - }
|
| 330 | | - if (ata_dma)
|
| 331 | | - {
|
| 332 | | - PASS_RC(ata_wait_for_start_of_transfer(500000), 2, 1);
|
| 333 | | - if (write)
|
| | 732 | + PASS_RC(ata_wait_for_rdy(100000), 2, 0);
|
| | 733 | + ata_write_cbr(&ATA_PIO_DVR, 0);
|
| | 734 | + if (ata_lba48)
|
| 334 | 735 | {
|
| 335 | | - ATA_SBUF_START = buffer;
|
| 336 | | - ATA_SBUF_SIZE = SECTOR_SIZE * cnt;
|
| 337 | | - ATA_CFG |= BIT(4);
|
| | 736 | + ata_write_cbr(&ATA_PIO_SCR, cnt >> 5);
|
| | 737 | + ata_write_cbr(&ATA_PIO_SCR, (cnt << 3) & 0xff);
|
| | 738 | + ata_write_cbr(&ATA_PIO_LHR, (sector >> 37) & 0xff);
|
| | 739 | + ata_write_cbr(&ATA_PIO_LMR, (sector >> 29) & 0xff);
|
| | 740 | + ata_write_cbr(&ATA_PIO_LLR, (sector >> 21) & 0xff);
|
| | 741 | + ata_write_cbr(&ATA_PIO_LHR, (sector >> 13) & 0xff);
|
| | 742 | + ata_write_cbr(&ATA_PIO_LMR, (sector >> 5) & 0xff);
|
| | 743 | + ata_write_cbr(&ATA_PIO_LLR, (sector << 3) & 0xff);
|
| | 744 | + ata_write_cbr(&ATA_PIO_DVR, BIT(6));
|
| | 745 | + if (write) ata_write_cbr(&ATA_PIO_CSD, ata_dma ? 0x35 : 0x39);
|
| | 746 | + else ata_write_cbr(&ATA_PIO_CSD, ata_dma ? 0x25 : 0x29);
|
| 338 | 747 | }
|
| 339 | 748 | else
|
| 340 | 749 | {
|
| 341 | | - ATA_TBUF_START = buffer;
|
| 342 | | - ATA_TBUF_SIZE = SECTOR_SIZE * cnt;
|
| 343 | | - ATA_CFG &= ~BIT(4);
|
| | 750 | + ata_write_cbr(&ATA_PIO_SCR, (cnt << 3) & 0xff);
|
| | 751 | + ata_write_cbr(&ATA_PIO_LHR, (sector >> 13) & 0xff);
|
| | 752 | + ata_write_cbr(&ATA_PIO_LMR, (sector >> 5) & 0xff);
|
| | 753 | + ata_write_cbr(&ATA_PIO_LLR, (sector << 3) & 0xff);
|
| | 754 | + ata_write_cbr(&ATA_PIO_DVR, BIT(6) | ((sector >> 21) & 0xf));
|
| | 755 | + if (write) ata_write_cbr(&ATA_PIO_CSD, ata_dma ? 0xca : 0x30);
|
| | 756 | + else ata_write_cbr(&ATA_PIO_CSD, ata_dma ? 0xc8 : 0xc4);
|
| 344 | 757 | }
|
| 345 | | - ATA_XFR_NUM = SECTOR_SIZE * cnt - 1;
|
| 346 | | - ATA_CFG |= ata_dma_flags;
|
| 347 | | - ATA_CFG &= ~(BIT(7) | BIT(8));
|
| 348 | | - wakeup_wait(&ata_wakeup, TIMEOUT_NONE);
|
| 349 | | - ATA_IRQ = BITRANGE(0, 4);
|
| 350 | | - ATA_IRQ_MASK = BIT(0);
|
| 351 | | - ATA_COMMAND = BIT(0);
|
| 352 | | - if (wakeup_wait(&ata_wakeup, 500000) == THREAD_TIMEOUT)
|
| | 758 | + if (ata_dma)
|
| 353 | 759 | {
|
| | 760 | + PASS_RC(ata_wait_for_start_of_transfer(500000), 2, 1);
|
| | 761 | + if (write)
|
| | 762 | + {
|
| | 763 | + ATA_SBUF_START = buffer;
|
| | 764 | + ATA_SBUF_SIZE = SECTOR_SIZE * cnt;
|
| | 765 | + ATA_CFG |= BIT(4);
|
| | 766 | + }
|
| | 767 | + else
|
| | 768 | + {
|
| | 769 | + ATA_TBUF_START = buffer;
|
| | 770 | + ATA_TBUF_SIZE = SECTOR_SIZE * cnt;
|
| | 771 | + ATA_CFG &= ~BIT(4);
|
| | 772 | + }
|
| | 773 | + ATA_XFR_NUM = SECTOR_SIZE * cnt - 1;
|
| | 774 | + ATA_CFG |= ata_dma_flags;
|
| | 775 | + ATA_CFG &= ~(BIT(7) | BIT(8));
|
| | 776 | + wakeup_wait(&ata_wakeup, TIMEOUT_NONE);
|
| | 777 | + ATA_IRQ = BITRANGE(0, 4);
|
| | 778 | + ATA_IRQ_MASK = BIT(0);
|
| | 779 | + ATA_COMMAND = BIT(0);
|
| | 780 | + if (wakeup_wait(&ata_wakeup, 500000) == THREAD_TIMEOUT)
|
| | 781 | + {
|
| | 782 | + ATA_COMMAND = BIT(1);
|
| | 783 | + ATA_CFG &= ~(BITRANGE(2, 3) | BIT(12));
|
| | 784 | + RET_ERR(2);
|
| | 785 | + }
|
| 354 | 786 | ATA_COMMAND = BIT(1);
|
| 355 | 787 | ATA_CFG &= ~(BITRANGE(2, 3) | BIT(12));
|
| 356 | | - RET_ERR(2);
|
| 357 | 788 | }
|
| 358 | | - ATA_COMMAND = BIT(1);
|
| 359 | | - ATA_CFG &= ~(BITRANGE(2, 3) | BIT(12));
|
| 360 | | - }
|
| 361 | | - else
|
| 362 | | - {
|
| 363 | | - cnt *= SECTOR_SIZE / 512;
|
| 364 | | - while (cnt--)
|
| | 789 | + else
|
| 365 | 790 | {
|
| 366 | | - int i;
|
| 367 | | - PASS_RC(ata_wait_for_start_of_transfer(500000), 2, 1);
|
| 368 | | - if (write)
|
| 369 | | - for (i = 0; i < 256; i++)
|
| 370 | | - ata_write_cbr(&ATA_PIO_DTR, ((uint16_t*)buffer)[i]);
|
| 371 | | - else
|
| 372 | | - for (i = 0; i < 256; i++)
|
| 373 | | - ((uint16_t*)buffer)[i] = ata_read_cbr(&ATA_PIO_DTR);
|
| 374 | | - buffer += 512;
|
| | 791 | + cnt *= SECTOR_SIZE / 512;
|
| | 792 | + while (cnt--)
|
| | 793 | + {
|
| | 794 | + int i;
|
| | 795 | + PASS_RC(ata_wait_for_start_of_transfer(500000), 2, 1);
|
| | 796 | + if (write)
|
| | 797 | + for (i = 0; i < 256; i++)
|
| | 798 | + ata_write_cbr(&ATA_PIO_DTR, ((uint16_t*)buffer)[i]);
|
| | 799 | + else
|
| | 800 | + for (i = 0; i < 256; i++)
|
| | 801 | + ((uint16_t*)buffer)[i] = ata_read_cbr(&ATA_PIO_DTR);
|
| | 802 | + buffer += 512;
|
| | 803 | + }
|
| 375 | 804 | }
|
| | 805 | + PASS_RC(ata_wait_for_end_of_transfer(100000), 2, 3);
|
| 376 | 806 | }
|
| 377 | | - PASS_RC(ata_wait_for_end_of_transfer(100000), 2, 3);
|
| 378 | 807 | return 0;
|
| 379 | 808 | }
|
| 380 | 809 |
|
| — | — | @@ -465,7 +894,7 @@ |
| 466 | 895 | ata_set_active();
|
| 467 | 896 | if (ata_dma && write) clean_dcache();
|
| 468 | 897 | else if (ata_dma) invalidate_dcache();
|
| 469 | | - ATA_COMMAND = BIT(1);
|
| | 898 | + if (!ceata) ATA_COMMAND = BIT(1);
|
| 470 | 899 | while (count)
|
| 471 | 900 | {
|
| 472 | 901 | uint32_t cnt = MIN(ata_lba48 ? 8192 : 32, count);
|
| — | — | @@ -513,13 +942,18 @@ |
| 514 | 943 | /* API Functions */
|
| 515 | 944 | int ata_soft_reset()
|
| 516 | 945 | {
|
| | 946 | + int rc;
|
| 517 | 947 | mutex_lock(&ata_mutex, TIMEOUT_BLOCK);
|
| 518 | 948 | if (!ata_powered) ata_power_up();
|
| 519 | 949 | ata_set_active();
|
| 520 | | - ata_write_cbr(&ATA_PIO_DAD, BIT(1) | BIT(2));
|
| 521 | | - sleep(10);
|
| 522 | | - ata_write_cbr(&ATA_PIO_DAD, 0);
|
| 523 | | - int rc = ata_wait_for_rdy(20000000);
|
| | 950 | + if (ceata) rc = ceata_soft_reset();
|
| | 951 | + else
|
| | 952 | + {
|
| | 953 | + ata_write_cbr(&ATA_PIO_DAD, BIT(1) | BIT(2));
|
| | 954 | + sleep(10);
|
| | 955 | + ata_write_cbr(&ATA_PIO_DAD, 0);
|
| | 956 | + rc = ata_wait_for_rdy(20000000);
|
| | 957 | + }
|
| 524 | 958 | if (IS_ERR(rc))
|
| 525 | 959 | {
|
| 526 | 960 | ata_power_down();
|
| — | — | @@ -658,10 +1092,26 @@ |
| 659 | 1093 | {
|
| 660 | 1094 | mutex_init(&ata_mutex);
|
| 661 | 1095 | wakeup_init(&ata_wakeup);
|
| 662 | | - PCON(7) = 0x44444444;
|
| 663 | | - PCON(8) = 0x44444444;
|
| 664 | | - PCON(9) = 0x44444444;
|
| 665 | | - PCON(10) = (PCON(10) & ~0xffff) | 0x4444;
|
| | 1096 | + wakeup_init(&mmc_wakeup);
|
| | 1097 | + wakeup_init(&mmc_comp_wakeup);
|
| | 1098 | + ceata = PDAT(11) & BIT(1);
|
| | 1099 | + if (ceata)
|
| | 1100 | + {
|
| | 1101 | + ata_lba48 = true;
|
| | 1102 | + ata_dma = true;
|
| | 1103 | + PCON(8) = 0x33333333;
|
| | 1104 | + PCON(9) = (PCON(9) & ~0xff) | 0x33;
|
| | 1105 | + PCON(11) |= 0xf;
|
| | 1106 | + *((uint32_t volatile*)0x38a00000) = 0;
|
| | 1107 | + *((uint32_t volatile*)0x38700000) = 0;
|
| | 1108 | + }
|
| | 1109 | + else
|
| | 1110 | + {
|
| | 1111 | + PCON(7) = 0x44444444;
|
| | 1112 | + PCON(8) = 0x44444444;
|
| | 1113 | + PCON(9) = 0x44444444;
|
| | 1114 | + PCON(10) = (PCON(10) & ~0xffff) | 0x4444;
|
| | 1115 | + }
|
| 666 | 1116 | ata_powered = false;
|
| 667 | 1117 | ata_total_sectors = 0;
|
| 668 | 1118 | #ifdef ATA_HAVE_BBT
|
| — | — | @@ -689,3 +1139,11 @@ |
| 690 | 1140 | if (ata_irq & ATA_IRQ_MASK) wakeup_signal(&ata_wakeup);
|
| 691 | 1141 | ATA_IRQ_MASK = 0;
|
| 692 | 1142 | }
|
| | 1143 | +
|
| | 1144 | +void INT_MMC()
|
| | 1145 | +{
|
| | 1146 | + uint32_t irq = SDCI_IRQ;
|
| | 1147 | + if (irq & SDCI_IRQ_DAT_DONE_INT) wakeup_signal(&mmc_wakeup);
|
| | 1148 | + if (irq & SDCI_IRQ_IOCARD_IRQ_INT) wakeup_signal(&mmc_comp_wakeup);
|
| | 1149 | + SDCI_IRQ = irq;
|
| | 1150 | +}
|
| Index: emcore/trunk/constants/mmc.h |
| — | — | @@ -0,0 +1,302 @@ |
| | 2 | +// |
| | 3 | +// |
| | 4 | +// Copyright 2010 TheSeven |
| | 5 | +// |
| | 6 | +// |
| | 7 | +// This file is part of emCORE. |
| | 8 | +// |
| | 9 | +// emCORE is free software: you can redistribute it and/or |
| | 10 | +// modify it under the terms of the GNU General Public License as |
| | 11 | +// published by the Free Software Foundation, either version 2 of the |
| | 12 | +// License, or (at your option) any later version. |
| | 13 | +// |
| | 14 | +// emCORE is distributed in the hope that it will be useful, |
| | 15 | +// but WITHOUT ANY WARRANTY; without even the implied warranty of |
| | 16 | +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
| | 17 | +// See the GNU General Public License for more details. |
| | 18 | +// |
| | 19 | +// You should have received a copy of the GNU General Public License along |
| | 20 | +// with emCORE. If not, see <http://www.gnu.org/licenses/>. |
| | 21 | +// |
| | 22 | +// |
| | 23 | + |
| | 24 | + |
| | 25 | +#ifndef __CONSTANTS_MMC_H__
|
| | 26 | +#define __CONSTANTS_MMC_H__
|
| | 27 | + |
| | 28 | + |
| | 29 | +#include "global.h" |
| | 30 | + |
| | 31 | + |
| | 32 | +#define MMC_CMD_GO_IDLE_STATE 0 |
| | 33 | +#define MMC_CMD_SEND_OP_COND 1 |
| | 34 | +#define MMC_CMD_ALL_SEND_CID 2 |
| | 35 | +#define MMC_CMD_SET_RELATIVE_ADDR 3 |
| | 36 | +#define MMC_CMD_SET_DSR 4 |
| | 37 | +#define MMC_CMD_SLEEP_AWAKE 5 |
| | 38 | +#define MMC_CMD_SWITCH 6 |
| | 39 | +#define MMC_CMD_SELECT_CARD 7 |
| | 40 | +#define MMC_CMD_SEND_EXT_CSD 8 |
| | 41 | +#define MMC_CMD_SEND_CSD 9 |
| | 42 | +#define MMC_CMD_SEND_CID 10 |
| | 43 | +#define MMC_CMD_READ_DAT_UNTIL_STOP 11 |
| | 44 | +#define MMC_CMD_STOP_TRANSMISSION 12 |
| | 45 | +#define MMC_CMD_SEND_STATUS 13 |
| | 46 | +#define MMC_CMD_BUSTEST_R 14 |
| | 47 | +#define MMC_CMD_GO_INAVTIVE_STATE 15 |
| | 48 | +#define MMC_CMD_SET_BLOCKLEN 16 |
| | 49 | +#define MMC_CMD_READ_SINGLE_BLOCK 17 |
| | 50 | +#define MMC_CMD_READ_MULTIPLE_BLOCK 18 |
| | 51 | +#define MMC_CMD_BUSTEST_W 19 |
| | 52 | +#define MMC_CMD_WRITE_DAT_UNTIL_STOP 20 |
| | 53 | +#define MMC_CMD_SET_BLOCK_COUNT 23 |
| | 54 | +#define MMC_CMD_WRITE_BLOCK 24 |
| | 55 | +#define MMC_CMD_WRITE_MULTIPLE_BLOCK 25 |
| | 56 | +#define MMC_CMD_PROGRAM_CID 26 |
| | 57 | +#define MMC_CMD_PROGRAM_CSD 27 |
| | 58 | +#define MMC_CMD_SET_WRITE_PROT 28 |
| | 59 | +#define MMC_CMD_CLR_WRITE_PROT 29 |
| | 60 | +#define MMC_CMD_SEND_WRITE_PROT 30 |
| | 61 | +#define MMC_CMD_ERASE_GROUP_START 35 |
| | 62 | +#define MMC_CMD_ERASE_GROUP_END 36 |
| | 63 | +#define MMC_CMD_ERASE 38 |
| | 64 | +#define MMC_CMD_FAST_IO 39 |
| | 65 | +#define MMC_CMD_GO_IRQ_STATE 40 |
| | 66 | +#define MMC_CMD_LOCK_UNLOCK 42 |
| | 67 | +#define MMC_CMD_APP_CMD 55 |
| | 68 | +#define MMC_CMD_GEN_CMD 56 |
| | 69 | +#define MMC_CMD_CEATA_RW_MULTIPLE_REG 60 |
| | 70 | +#define MMC_CMD_CEATA_RW_MULTIPLE_BLOCK 61 |
| | 71 | + |
| | 72 | +#define MMC_CMD_SEND_OP_COND_OCR_MASK BITRANGE(0, 31) |
| | 73 | +#define MMC_CMD_SEND_OP_COND_OCR_SHIFT 0 |
| | 74 | +#define MMC_CMD_SEND_OP_COND_OCR(x) (x) |
| | 75 | + |
| | 76 | +#define MMC_CMD_SET_RELATIVE_ADDR_RCA_MASK BITRANGE(16, 31) |
| | 77 | +#define MMC_CMD_SET_RELATIVE_ADDR_RCA_SHIFT 16 |
| | 78 | +#define MMC_CMD_SET_RELATIVE_ADDR_RCA(x) ((x) << 16) |
| | 79 | + |
| | 80 | +#define MMC_CMD_SET_DSR_DSR_MASK BITRANGE(16, 31) |
| | 81 | +#define MMC_CMD_SET_DSR_DSR_SHIFT 16 |
| | 82 | +#define MMC_CMD_SET_DSR_DSR(x) ((x) << 16) |
| | 83 | + |
| | 84 | +#define MMC_CMD_SLEEP_AWAKE_SLEEP_AWAKE_MASK BIT(15) |
| | 85 | +#define MMC_CMD_SLEEP_AWAKE_SLEEP_AWAKE_AWAKE 0 |
| | 86 | +#define MMC_CMD_SLEEP_AWAKE_SLEEP_AWAKE_SLEEP BIT(15) |
| | 87 | +#define MMC_CMD_SLEEP_AWAKE_RCA_MASK BITRANGE(16, 31) |
| | 88 | +#define MMC_CMD_SLEEP_AWAKE_RCA_SHIFT 16 |
| | 89 | +#define MMC_CMD_SLEEP_AWAKE_RCA(x) ((x) << 16) |
| | 90 | + |
| | 91 | +#define MMC_CMD_SWITCH_ACCESS_MASK BITRANGE(24, 25); |
| | 92 | +#define MMC_CMD_SWITCH_ACCESS_CMDSET 0 |
| | 93 | +#define MMC_CMD_SWITCH_ACCESS_SET_BITS BIT(24) |
| | 94 | +#define MMC_CMD_SWITCH_ACCESS_CLEAR_BITS BIT(25) |
| | 95 | +#define MMC_CMD_SWITCH_ACCESS_WRITE_BYTE (BIT(24) | BIT(25)) |
| | 96 | +#define MMC_CMD_SWTICH_INDEX_MASK BITRANGE(16, 23); |
| | 97 | +#define MMC_CMD_SWITCH_INDEX_SHIFT 16 |
| | 98 | +#define MMC_CMD_SWITCH_INDEX(x) ((x) << 16) |
| | 99 | +#define MMC_CMD_SWTICH_VALUE_MASK BITRANGE(8, 15); |
| | 100 | +#define MMC_CMD_SWITCH_VALUE_SHIFT 8 |
| | 101 | +#define MMC_CMD_SWITCH_VALUE(x) ((x) << 8) |
| | 102 | +#define MMC_CMD_SWTICH_CMDSET_MASK BITRANGE(0, 2); |
| | 103 | +#define MMC_CMD_SWITCH_CMDSET_STANDARD_MMC 0 |
| | 104 | + |
| | 105 | +#define MMC_CMD_SELECT_CARD_RCA_MASK BITRANGE(16, 31) |
| | 106 | +#define MMC_CMD_SELECT_CARD_RCA_SHIFT 16 |
| | 107 | +#define MMC_CMD_SELECT_CARD_RCA(x) ((x) << 16) |
| | 108 | + |
| | 109 | +#define MMC_CMD_SEND_CSD_RCA_MASK BITRANGE(16, 31) |
| | 110 | +#define MMC_CMD_SEND_CSD_RCA_SHIFT 16 |
| | 111 | +#define MMC_CMD_SEND_CSD_RCA(x) ((x) << 16) |
| | 112 | + |
| | 113 | +#define MMC_CMD_SEND_CID_RCA_MASK BITRANGE(16, 31) |
| | 114 | +#define MMC_CMD_SEND_CID_RCA_SHIFT 16 |
| | 115 | +#define MMC_CMD_SEND_CID_RCA(x) ((x) << 16) |
| | 116 | + |
| | 117 | +#define MMC_CMD_READ_DAT_UNTIL_STOP_ADDRESS_MASK BITRANGE(0, 31) |
| | 118 | +#define MMC_CMD_READ_DAT_UNTIL_STOP_ADDRESS_SHIFT 0 |
| | 119 | +#define MMC_CMD_READ_DAT_UNTIL_STOP_ADDRESS(x) (x) |
| | 120 | + |
| | 121 | +#define MMC_CMD_SEND_STATUS_RCA_MASK BITRANGE(16, 31) |
| | 122 | +#define MMC_CMD_SEND_STATUS_RCA_SHIFT 16 |
| | 123 | +#define MMC_CMD_SEND_STATUS_RCA(x) ((x) << 16) |
| | 124 | + |
| | 125 | +#define MMC_CMD_GO_INACTIVE_STATE_RCA_MASK BITRANGE(16, 31) |
| | 126 | +#define MMC_CMD_GO_INACTIVE_STATE_RCA_SHIFT 16 |
| | 127 | +#define MMC_CMD_GO_INACTIVE_STATE_RCA(x) ((x) << 16) |
| | 128 | + |
| | 129 | +#define MMC_CMD_SET_BLOCKLEN_LENGTH_MASK BITRANGE(0, 31) |
| | 130 | +#define MMC_CMD_SET_BLOCKLEN_LENGTH_SHIFT 0 |
| | 131 | +#define MMC_CMD_SET_BLOCKLEN_LENGTH(x) (x) |
| | 132 | + |
| | 133 | +#define MMC_CMD_READ_SINGLE_BLOCK_ADDRESS_MASK BITRANGE(0, 31) |
| | 134 | +#define MMC_CMD_READ_SINGLE_BLOCK_ADDRESS_SHIFT 0 |
| | 135 | +#define MMC_CMD_READ_SINGLE_BLOCK_ADDRESS(x) (x) |
| | 136 | + |
| | 137 | +#define MMC_CMD_READ_MULTIPLE_BLOCK_ADDRESS_MASK BITRANGE(0, 31) |
| | 138 | +#define MMC_CMD_READ_MULTIPLE_BLOCK_ADDRESS_SHIFT 0 |
| | 139 | +#define MMC_CMD_READ_MULTIPLE_BLOCK_ADDRESS(x) (x) |
| | 140 | + |
| | 141 | +#define MMC_CMD_WRITE_DAT_UNTIL_STOP_ADDRESS_MASK BITRANGE(0, 31) |
| | 142 | +#define MMC_CMD_WRITE_DAT_UNTIL_STOP_ADDRESS_SHIFT 0 |
| | 143 | +#define MMC_CMD_WRITE_DAT_UNTIL_STOP_ADDRESS(x) (x) |
| | 144 | + |
| | 145 | +#define MMC_CMD_SET_BLOCK_COUNT_RELIABLE BIT(31) |
| | 146 | +#define MMC_CMD_SET_BLOCK_COUNT_COUNT_MASK BITRANGE(0, 15) |
| | 147 | +#define MMC_CMD_SET_BLOCK_COUNT_COUNT_SHIFT 0 |
| | 148 | +#define MMC_CMD_SET_BLOCK_COUNT_COUNT(x) (x) |
| | 149 | + |
| | 150 | +#define MMC_CMD_WRITE_BLOCK_ADDRESS_MASK BITRANGE(0, 31) |
| | 151 | +#define MMC_CMD_WRITE_BLOCK_ADDRESS_SHIFT 0 |
| | 152 | +#define MMC_CMD_WRITE_BLOCK_ADDRESS(x) (x) |
| | 153 | + |
| | 154 | +#define MMC_CMD_WRITE_MULTIPLE_BLOCK_ADDRESS_MASK BITRANGE(0, 31) |
| | 155 | +#define MMC_CMD_WRITE_MULTIPLE_BLOCK_ADDRESS_SHIFT 0 |
| | 156 | +#define MMC_CMD_WRITE_MULTIPLE_BLOCK_ADDRESS(x) (x) |
| | 157 | + |
| | 158 | +#define MMC_CMD_SET_WRITE_PROT_ADDRESS_MASK BITRANGE(0, 31) |
| | 159 | +#define MMC_CMD_SET_WRITE_PROT_ADDRESS_SHIFT 0 |
| | 160 | +#define MMC_CMD_SET_WRITE_PROT_ADDRESS(x) (x) |
| | 161 | + |
| | 162 | +#define MMC_CMD_CLR_WRITE_PROT_ADDRESS_MASK BITRANGE(0, 31) |
| | 163 | +#define MMC_CMD_CLR_WRITE_PROT_ADDRESS_SHIFT 0 |
| | 164 | +#define MMC_CMD_CLR_WRITE_PROT_ADDRESS(x) (x) |
| | 165 | + |
| | 166 | +#define MMC_CMD_SEND_WRITE_PROT_ADDRESS_MASK BITRANGE(0, 31) |
| | 167 | +#define MMC_CMD_SEND_WRITE_PROT_ADDRESS_SHIFT 0 |
| | 168 | +#define MMC_CMD_SEND_WRITE_PROT_ADDRESS(x) (x) |
| | 169 | + |
| | 170 | +#define MMC_CMD_ERASE_GROUP_START_ADDRESS_MASK BITRANGE(0, 31) |
| | 171 | +#define MMC_CMD_ERASE_GROUP_START_ADDRESS_SHIFT 0 |
| | 172 | +#define MMC_CMD_ERASE_GROUP_START_ADDRESS(x) (x) |
| | 173 | + |
| | 174 | +#define MMC_CMD_ERASE_GROUP_END_ADDRESS_MASK BITRANGE(0, 31) |
| | 175 | +#define MMC_CMD_ERASE_GROUP_END_ADDRESS_SHIFT 0 |
| | 176 | +#define MMC_CMD_ERASE_GROUP_END_ADDRESS(x) (x) |
| | 177 | + |
| | 178 | +#define MMC_CMD_FAST_IO_RCA_MASK BITRANGE(16, 31) |
| | 179 | +#define MMC_CMD_FAST_IO_RCA_SHIFT 16 |
| | 180 | +#define MMC_CMD_FAST_IO_RCA(x) ((x) << 16) |
| | 181 | +#define MMC_CMD_FAST_IO_DIRECTION_MASK BIT(15) |
| | 182 | +#define MMC_CMD_FAST_IO_DIRECTION_READ 0 |
| | 183 | +#define MMC_CMD_FAST_IO_DIRECTION_WRITE BIT(15) |
| | 184 | +#define MMC_CMD_FAST_IO_ADDRESS_MASK BITRANGE(8, 14) |
| | 185 | +#define MMC_CMD_FAST_IO_ADDRESS_SHIFT 8 |
| | 186 | +#define MMC_CMD_FAST_IO_ADDRESS(x) ((x) << 8) |
| | 187 | +#define MMC_CMD_FAST_IO_DATA_MASK BITRANGE(0, 7) |
| | 188 | +#define MMC_CMD_FAST_IO_DATA_SHIFT 0 |
| | 189 | +#define MMC_CMD_FAST_IO_DATA(x) (x) |
| | 190 | + |
| | 191 | +#define MMC_CMD_APP_CMD_RCA_MASK BITRANGE(16, 31) |
| | 192 | +#define MMC_CMD_APP_CMD_RCA_SHIFT 16 |
| | 193 | +#define MMC_CMD_APP_CMD_RCA(x) ((x) << 16) |
| | 194 | + |
| | 195 | +#define MMC_CMD_GEN_CMD_DIRECTION_MASK BIT(0) |
| | 196 | +#define MMC_CMD_GEN_CMD_DIRECTION_READ 0 |
| | 197 | +#define MMC_CMD_GEN_CMD_DIRECTION_WRITE BIT(0) |
| | 198 | + |
| | 199 | +#define MMC_CMD_CEATA_RW_MULTIPLE_REG_DIRECTION_MASK BIT(31) |
| | 200 | +#define MMC_CMD_CEATA_RW_MULTIPLE_REG_DIRECTION_READ 0 |
| | 201 | +#define MMC_CMD_CEATA_RW_MULTIPLE_REG_DIRECTION_WRITE BIT(31) |
| | 202 | +#define MMC_CMD_CEATA_RW_MULTIPLE_REG_ADDRESS_MASK BITRANGE(16, 23) |
| | 203 | +#define MMC_CMD_CEATA_RW_MULTIPLE_REG_ADDRESS_SHIFT 16 |
| | 204 | +#define MMC_CMD_CEATA_RW_MULTIPLE_REG_ADDRESS(x) ((x) << 16) |
| | 205 | +#define MMC_CMD_CEATA_RW_MULTIPLE_REG_COUNT_MASK BITRANGE(0, 7) |
| | 206 | +#define MMC_CMD_CEATA_RW_MULTIPLE_REG_COUNT_SHIFT 0 |
| | 207 | +#define MMC_CMD_CEATA_RW_MULTIPLE_REG_COUNT(x) (x) |
| | 208 | + |
| | 209 | +#define MMC_CMD_CEATA_RW_MULTIPLE_BLOCK_DIRECTION_MASK BIT(31) |
| | 210 | +#define MMC_CMD_CEATA_RW_MULTIPLE_BLOCK_DIRECTION_READ 0 |
| | 211 | +#define MMC_CMD_CEATA_RW_MULTIPLE_BLOCK_DIRECTION_WRITE BIT(31) |
| | 212 | +#define MMC_CMD_CEATA_RW_MULTIPLE_BLOCK_COUNT_MASK BITRANGE(0, 15) |
| | 213 | +#define MMC_CMD_CEATA_RW_MULTIPLE_BLOCK_COUNT_SHIFT 0 |
| | 214 | +#define MMC_CMD_CEATA_RW_MULTIPLE_BLOCK_COUNT(x) (x) |
| | 215 | + |
| | 216 | +#define MMC_CMD_SWITCH_FIELD_ERASE_GROUP_DEF 175 |
| | 217 | +#define MMC_CMD_SWITCH_FIELD_BOOT_BUS_WIDTH 177 |
| | 218 | +#define MMC_CMD_SWITCH_FIELD_BOOT_CONFIG 179 |
| | 219 | +#define MMC_CMD_SWITCH_FIELD_ERASED_MEM_CONT 181 |
| | 220 | +#define MMC_CMD_SWITCH_FIELD_BUS_WIDTH 183 |
| | 221 | +#define MMC_CMD_SWITCH_FIELD_HS_TIMING 185 |
| | 222 | +#define MMC_CMD_SWITCH_FIELD_POWER_CLASS 187 |
| | 223 | +#define MMC_CMD_SWITCH_FIELD_CMD_SET_REV 189 |
| | 224 | +#define MMC_CMD_SWITCH_FIELD_CMD_SET 191 |
| | 225 | +#define MMC_CMD_SWITCH_FIELD_EXT_CSD_REV 192 |
| | 226 | +#define MMC_CMD_SWITCH_FIELD_CSD_STRUCTURE 194 |
| | 227 | +#define MMC_CMD_SWITCH_FIELD_CARD_TYPE 196 |
| | 228 | +#define MMC_CMD_SWITCH_FIELD_PWR_CL_52_195 200 |
| | 229 | +#define MMC_CMD_SWITCH_FIELD_PWR_CL_26_195 201 |
| | 230 | +#define MMC_CMD_SWITCH_FIELD_PWR_CL_52_360 202 |
| | 231 | +#define MMC_CMD_SWITCH_FIELD_PWR_CL_26_360 203 |
| | 232 | +#define MMC_CMD_SWITCH_FIELD_MIN_PERF_R_4_26 205 |
| | 233 | +#define MMC_CMD_SWITCH_FIELD_MIN_PERF_W_4_26 206 |
| | 234 | +#define MMC_CMD_SWITCH_FIELD_MIN_PERF_R_8_26_4_52 207 |
| | 235 | +#define MMC_CMD_SWITCH_FIELD_MIN_PERF_W_8_26_4_52 208 |
| | 236 | +#define MMC_CMD_SWITCH_FIELD_MIN_PERF_R_8_52 209 |
| | 237 | +#define MMC_CMD_SWITCH_FIELD_MIN_PERF_W_8_52 210 |
| | 238 | +#define MMC_CMD_SWITCH_FIELD_SEC_COUNT_0 212 |
| | 239 | +#define MMC_CMD_SWITCH_FIELD_SEC_COUNT_1 213 |
| | 240 | +#define MMC_CMD_SWITCH_FIELD_SEC_COUNT_2 214 |
| | 241 | +#define MMC_CMD_SWITCH_FIELD_SEC_COUNT_3 215 |
| | 242 | +#define MMC_CMD_SWITCH_FIELD_S_A_TIMEOUT 217 |
| | 243 | +#define MMC_CMD_SWITCH_FIELD_S_C_VCCQ 219 |
| | 244 | +#define MMC_CMD_SWITCH_FIELD_S_C_VCC 220 |
| | 245 | +#define MMC_CMD_SWITCH_FIELD_HC_WP_GRP_SIZE 221 |
| | 246 | +#define MMC_CMD_SWITCH_FIELD_REL_WR_SEC_C 222 |
| | 247 | +#define MMC_CMD_SWITCH_FIELD_ERASE_TIMEOUT_MULT 223 |
| | 248 | +#define MMC_CMD_SWITCH_FIELD_HC_ERASE_GRP_SIZE 224 |
| | 249 | +#define MMC_CMD_SWITCH_FIELD_ACC_SIZE 225 |
| | 250 | +#define MMC_CMD_SWITCH_FIELD_BOOT_SIZE_MULTI 226 |
| | 251 | +#define MMC_CMD_SWITCH_FIELD_S_CMD_SET 504 |
| | 252 | + |
| | 253 | +#define MMC_CMD_SWITCH_FIELD_BUS_WIDTH_1BIT 0 |
| | 254 | +#define MMC_CMD_SWITCH_FIELD_BUS_WIDTH_4BIT 1 |
| | 255 | +#define MMC_CMD_SWITCH_FIELD_BUS_WIDTH_8BIT 2 |
| | 256 | + |
| | 257 | +#define MMC_CMD_SWITCH_FIELD_HS_TIMING_LOW_SPEED 0 |
| | 258 | +#define MMC_CMD_SWITCH_FIELD_HS_TIMING_HIGH_SPEED 1 |
| | 259 | + |
| | 260 | +#define MMC_STATUS_APP_CMD BIT(5) |
| | 261 | +#define MMC_STATUS_SWITCH_ERROR BIT(7) |
| | 262 | +#define MMC_STATUS_READY_FOR_DATA BIT(8) |
| | 263 | +#define MMC_STATUS_CURRENT_STATE_MASK BITRANGE(9, 12) |
| | 264 | +#define MMC_STATUS_CURRENT_STATE_IDLE 0 |
| | 265 | +#define MMC_STATUS_CURRENT_STATE_READY BIT(9) |
| | 266 | +#define MMC_STATUS_CURRENT_STATE_IDENT BIT(10) |
| | 267 | +#define MMC_STATUS_CURRENT_STATE_STBY (BIT(9) | BIT(10)) |
| | 268 | +#define MMC_STATUS_CURRENT_STATE_TRAN BIT(11) |
| | 269 | +#define MMC_STATUS_CURRENT_STATE_DATA (BIT(9) | BIT(11)) |
| | 270 | +#define MMC_STATUS_CURRENT_STATE_RCV (BIT(10) | BIT(11)) |
| | 271 | +#define MMC_STATUS_CURRENT_STATE_PRG (BIT(9) | BIT(10) | BIT(11)) |
| | 272 | +#define MMC_STATUS_CURRENT_STATE_DIS BIT(12) |
| | 273 | +#define MMC_STATUS_CURRENT_STATE_BTST (BIT(9) | BIT(12)) |
| | 274 | +#define MMC_STATUS_CURRENT_STATE_SLP (BIT(10) | BIT(12)) |
| | 275 | +#define MMC_STATUS_ERASE_RESET BIT(13) |
| | 276 | +#define MMC_STATUS_WP_ERASE_SKIP BIT(15) |
| | 277 | +#define MMC_STATUS_CID_CSD_OVERWRITE BIT(16) |
| | 278 | +#define MMC_STATUS_OVERRUN BIT(17) |
| | 279 | +#define MMC_STATUS_UNDERRUN BIT(18) |
| | 280 | +#define MMC_STATUS_ERROR BIT(19) |
| | 281 | +#define MMC_STATUS_CC_ERROR BIT(20) |
| | 282 | +#define MMC_STATUS_CARD_ECC_FAILED BIT(21) |
| | 283 | +#define MMC_STATUS_ILLEGAL_COMMAND BIT(22) |
| | 284 | +#define MMC_STATUS_COM_CRC_ERROR BIT(23) |
| | 285 | +#define MMC_STATUS_LOCK_UNLOCK_FAILED BIT(24) |
| | 286 | +#define MMC_STATUS_CARD_IS_LOCKED BIT(25) |
| | 287 | +#define MMC_STATUS_WP_VIOLATION BIT(26) |
| | 288 | +#define MMC_STATUS_ERASE_PARAM BIT(27) |
| | 289 | +#define MMC_STATUS_ERASE_SEQ_ERROR BIT(28) |
| | 290 | +#define MMC_STATUS_BLOCK_LEN_ERROR BIT(29) |
| | 291 | +#define MMC_STATUS_ADDRESS_MISALIGN BIT(30) |
| | 292 | +#define MMC_STATUS_ADDRESS_OUT_OF_RANGE BIT(31) |
| | 293 | + |
| | 294 | +#define MMC_OCR_170_195 BIT(7) |
| | 295 | +#define MMC_OCR_200_260 BITRANGE(8, 14) |
| | 296 | +#define MMC_OCR_270_360 BITRANGE(15, 23) |
| | 297 | +#define MMC_OCR_ACCESS_MODE_MASK BITRANGE(29, 30) |
| | 298 | +#define MMC_OCR_ACCESS_MODE_BYTE 0 |
| | 299 | +#define MMC_OCR_ACCESS_MODE_SECTOR BIT(30) |
| | 300 | +#define MMC_OCR_POWER_UP_DONE BIT(31) |
| | 301 | + |
| | 302 | + |
| | 303 | +#endif |