- 注意:ATAPI无法通过IDENTIFY PACKET DEVICE 获取容量信息。
- 这需要另外使用特殊的SCSI命令中的READ CAPACITY(16)
- 来获取,这种命令需要使用ATA的PACKET命令发出。
+ if (port->device->signature == HBA_DEV_SIG_ATA) {
+ goto done;
+ }
+
+ /*
+ 注意:ATAPI设备是无法通过IDENTIFY PACKET DEVICE 获取容量信息的。
+ 我们需要使用SCSI命令的READ_CAPACITY(16)进行获取。
+ 步骤如下:
+ 1. 因为ATAPI走的是SCSI,而AHCI对此专门进行了SATA的封装,
+ 也就是通过SATA的PACKET命令对SCSI命令进行封装。所以我们
+ 首先需要构建一个PACKET命令的FIS
+ 2. 接着,在ACMD中构建命令READ_CAPACITY的CDB - 一种SCSI命令的封装
+ 3. 然后把cmd_header->options的A位置位,表示这是一个送往ATAPI的命令。
+ 一点细节:
+ 1. HBA往底层SATA控制器发送PACKET FIS
+ 2. SATA控制器回复PIO Setup FIS
+ 3. HBA读入ACMD中的CDB,打包成Data FIS进行答复
+ 4. SATA控制器解包,拿到CDB,通过SCSI协议转发往ATAPI设备。
+ 5. ATAPI设备回复Return Parameter,SATA通过DMA Setup FIS
+ 发起DMA请求,HBA介入,将Return Parameter写入我们在PRDT
+ 里设置的data_in位置。
+ 4. 最后照常等待HBA把结果写入data_in,然后直接解析就好了。