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;
}