​AHCI介绍

2025-04-08 11:47 来源:网络 点击:

AHCI介绍

什么是AHCI?我的个人理解是AHCI定义了传输ATA/ATAPI命令的一个接口规范,当然目前AHCI是比较传统的一个规范,更早期的接口规范是IDE了解的或者听说过的可能不多了,虽然AHCI相对比较传统,但是当下应用还是比较普遍,所以有必要做简单了解。本文帮助大家初步了解AHCI的基本概念,可以让大家掌握基础AHCI概念后,有能力阅读AHCI规范,更详尽的了解AHCI。AHCI支持ATA/ATAPI device,因此相关的命令需要参考ATA/ATAPI规范。AHCI支持PIO/DMA protocol。无论PIO还是DMA数据传输,HBA(Host Bus Adapter)一直作为bus master执行system memory和device的数据传输。因此更进一步可以理解AHCI其实就是定义system memory和SATA device进行数据传输的一个interface!AHCI寄存器介绍

AHCI Memory Structure

AHCI Memory Structure

Receive FIS Structure

Command List Structure

Command Table Structure

AHCI UEFI Driver Stack

以Identify command为例具体介绍如何透过AHCI 发送ATA/ATAPI命令

Step1 Check Device在哪一个AHCI port上

Example code:

PxSSTS寄存器

  PortData = ReadMmioDword(Abar+Port*0x80+100+HBA_PORTS_SSTS);
  if((PortData&0x0f)==3) //Device on this port!

Step2 Get Device Type

PxSIG寄存器

PortData = ReadMmioDword(Abar+Port*0x80+0x100+HBA_PORTS_SIG);
 if((PortData&0xffff0000) = 0xeb140000)
  \\DeviceType ATAPI
 else
\\Device Type ATA

Step3 Build command table 之CFIS

CFIS Structure

Type = 0x27 C = 1

Command = 0xec //ATA device identify

Sector Number = 1

Step4 Build command table之PRDT table

PRDT Structure

DBC = Identify data count

DW3 BIT0 BIT1 置1

DBA = Identify data buffer address

Step5 Build Command List Structure

Command List Structure

CFL=CFIS长度 = 5

PRDTL = PRDT entry number,对于Identify command PRDTL = 1

CTBA = command table base address

Step6: Start Command

Register PxCI port command issue

选择command list中的某个command例如:

PxCI Bit0 = 1 ,选择command 0

Register PxCMD

Set Bit0 to 1,执行命令

热门排行