我在开发板上初始化和运行 AHCI 端口时遇到问题。处理器具有 SATA 主机控制器,实现了 2 个端口(端口 0 和端口 1)。带 SATA 接口的 SSD 驱动器连接到端口 1。
PxCMD.ST
根据“Serial ATA AHCI 1.3.1 Specification”的“10.3.1 Start (PxCMD.ST)”一章,在设置为“1”之前应满足一系列条件。设置该位后,PxCMD.CR
应设置以指示端口已准备好并运行。
问题PxCMD.CR
永远不会被设定。
启用前的状态PxCMD.ST
:
- 端口处于空闲状态,
PxCMD.ST
并且PxCMD.CR
都是“0” - FIS 接收启用,
PxCMD.FRE
为“1” - 驱动器连接到端口
PxSSTS = 0x00000133
(SSTS.IPM = 1
,SSTS.SPD = 3
,SSTS.DET = 3
),PxTFD = 0x00000150
(TFD.STS.BSY = 0
,TFD.STS.DRQ = 0
,TFD.STS.ERR = 0
) PxCLB/PxCLBU
用物理地址设置缓冲区并且缓冲区对齐。(1KB 缓冲区,1KB 对齐)PxCMD = 0x00404010
(PxCMD.FBSCP = 1
&PxCMD.FRE = 1
)
设置后,PxCMD.ST
保持“0”PxCMD = 0x00404011
PxCMD.CR
PxSERR = 0
保持原样。ERR在设置前被提前清理PxCMD.FRE
PxSCTL = 0x00000330
(IPM = 3
,SPD = 3
,DET = 0
)PxTFD = 0x00000150
保持原样PxSIG = 0x00000101
.0xFFFFFFFF
未连接驱动器时,该 reg 具有。
假设PxSIG
已设置且PxSERR
为“0”,则 SATA HC 的 PLL 设置正确的可能性更大。
我担心PxTFD.ERR = 1
(当驱动器断开连接时PxTFD
具有默认0x7F
值和PxTFD.ERR = 0
)但没有发现它是否相关或也不考虑仍然TFD.STS.ERR = 0
任何理想都错过了什么?
PS:与Linux无关。