0

我在开发板上初始化和运行 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 = 0x00404011PxCMD.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无关。

4

0 回答 0