我在开发板上初始化和运行AHCI端口时遇到问题。 处理器具有SATA主机控制器,实现了2个端口(端口0和端口1)。带有SATA接口的SSD驱动器连接到端口1。
根据" Serial ATA AHCI 1.3.1规范",章节" 10.3.1开始(PxCMD.ST)"在将PxCMD.ST
设置为' 1'之前,应该满足一系列条件。设置此位后,应设置PxCMD.CR
以指示端口已准备就绪并运行。
问题是PxCMD.CR
永远不会被设置。
启用PxCMD.ST
之前的状态:
PxCMD.ST
和PxCMD.CR
都是' 0' PxCMD.FRE
是' 1' PxSSTS = 0x00000133
(SSTS.IPM =
1
,SSTS.SPD = 3
,SSTS.DET = 3
),PxTFD = 0x00000150
(TFD.STS.BSY
= 0
,{{1 },TFD.STS.DRQ = 0
)TFD.STS.ERR = 0
设置了物理地址到缓冲区并且缓冲区已对齐。 (1KB缓冲区,1KB对齐)PxCLB/PxCLBU
(PxCMD = 0x00404010
& PxCMD.FBSCP = 1
)设置PxCMD.FRE = 1
后,PxCMD.ST
和PxCMD = 0x00404011
会停留' 0'
PxCMD.CR
保持不变。在设置PxSERR = 0
PxCMD.FRE
(PxSCTL = 0x00000330
,IPM = 3
,SPD = 3
)DET = 0
保持不变PxTFD = 0x00000150
。当驱动器未连接时,注册表PxSIG = 0x00000101
。
假设0xFFFFFFFF
已设置且PxSIG
为' 0'更可能是SATA HC for PLL设置正确。
我担心PxSERR
(当驱动器已断开连接时PxTFD.ERR = 1
具有默认PxTFD
值和0x7F
),但未找到相关或未考虑还是PxTFD.ERR = 0
错过了什么理想?
PS:它与Linux无关。