BSP-Storage

    技术2022-05-20  30

    1.         SD

    sd,mmc... 驱动要稍微复杂一点,如果没有硬件控制器的话,那就 gpio 模拟好了, sd 硬件从从左到右为 D2 D3 CMD GND VCC CLK GND D0 D1 CD NC ,对外的接口为 CLK CMD DAT0-DAT3 ,其它位驱动中不用关注, CLK 最高可有 25M ,可支持 1BIT 4BITS SPI 传输方式

     

    SD 包含寄存器有:

    CID (card identification) 卡的识别号

    RCA (relative card address) 卡的相对地址

    DSR (Driver Stage Register) 可选寄存器

    CSD (Card Specific Data) 描述操作该卡的规则 ( 时序规则 ) ,包括:数据读 / 写时间,工作电流,扇区大小,文件系统格式,卡所使用的命令集,写保护等信息,通过该寄存器可以获取卡的容量,访问方式

    SCR (SD Configuration Register) 卡的配置寄存器

    OCR (Operation condition register) 卡运行条件寄存器,描述卡的工作电压范围

     

    这是一个多数据的读写流程,比 I2C 要复杂一些

    HOST2SD_START

    HOST2SD_CMD all have 64 commands)

    HOST2SD_CRC7

    HOST2SD_WAIT:

    1 SD2HOST_NODATA SD2HOST_CRC7_NODATA

    2 SD2HOST_DATA4 SD2HOST_CRC16_DATA

    3 SD_IDLE

     

    2.         IDE

    硬件接口如图:

     

    根据片选 CS0 ,假如地址为 IDE_BASE ,对应 IDE 的寄存器地址映射

    #define IDE_BASE              

    #define Data_Reg       (*(volatile UI16 *)(IDE_BASE+0x20+(0x0<<1)))    

    /* even read data/odd write data */

    #define Error_Reg           /* read error/write feature */

    #define Sector_Count       /* sector count */

    #define Sector_Number       /* sector number */

    #define Cylinder_Low       /* cylinder low */

    #define Cylinder_High      /* cylinder high */

    #define SDH           /* select card/head */

    #define Command_Reg     /* read status/write command */

    #define Status_Reg    /* read status/write command */

     

     

    因为 IDE 有自己的私有寄存器,驱动相对也方便多了,在访问硬盘时,由 IDE 控制器把由磁头、 柱面、扇区等参数确定的逻辑地址转换为实际硬盘的物理地址。

    int IDE_BufferSector(UI32 LBALocation)

    {

        WriteReg(SECTOR_COUNT, 1);   

        WriteReg(HEAD_DEVICE_PIO, (((LBALocation >> 24) & 0xFF) | 0xE0));

        WriteReg(CYLINDERHIGH, ((LBALocation >> 16) & 0xFF));

        WriteReg(CYLINDERLOW,((LBALocation >> 8) & 0xFF));

        WriteReg(START_SECTOR,(LBALocation & 0xFF));

        WriteReg(COMMAND, READ);

        Wait_DRQBusy();

        for(i=0; i <HDD_SECTOR_SIZE; i=i+2)

        {

            *((UI16*)(&(IDE_Internal.currentsector[i]))) = ReadWord(DATA);

        }

        return 1;

    }

     


    最新回复(0)