從統計發現,ata cmd這一篇有很高的點擊率。我想原因很簡單,畢竟會玩這個的圈子應該不大,有也屬於fw居多,畢竟fw與sw要互相搭配,這cmd才有意義。最近開發遇到一些legacy code,遇見ATA的學長SCSI,但SCSI畢竟比較年長,相關資料也比較多,所以今天僅分享,CDB這塊array在玩什麼。
從ata cmd這篇,可以看到Microsoft已經把cmd把裝得滿簡單的。如果回到SCSI,你會需要處理byte 0, 1, 2這三個,尤其是在Linux平台上你更需要注意。
先來看一下這一份文件:ATA Command Pass-Through
來看一些範例:SCSI_PASS_THROUGH
sptwb.spt.Cdb[0] = 0xA1; // ATA PASS THROUGH (12) OPERATION CODE (A1h)
sptwb.spt.Cdb[1] = (4 << 1) | 0; // MULTIPLE_COUNT=0, PROTOCOL=4 (PIO Data-In), Reserved
sptwb.spt.Cdb[2] = (1 << 3) | (1 << 2) | 2; // OFF_LINE=0, CK_COND=0, Reserved=0, T_DIR=1 (ToDevice), BYTE_BLOCK=1, T_LENGTH=2
sptwb.spt.Cdb[3] = cmds[0]; // FEATURES (7:0)
sptwb.spt.Cdb[4] = cmds[1]; // SECTOR_COUNT (7:0)
sptwb.spt.Cdb[5] = cmds[2]; // LBA_LOW (7:0)
sptwb.spt.Cdb[6] = cmds[3]; // LBA_MID (7:0)
sptwb.spt.Cdb[7] = cmds[4]; // LBA_HIGH (7:0)
sptwb.spt.Cdb[8] = cmds[5];
sptwb.spt.Cdb[9] = cmds[6]; // COMMAND
byte 1:從table可看到protocol在bit 1:4
( 4 shift 1 ) or 0, 代表PIO data-in, shift因為bit 0為reserved, or 0則是因為bit 5:7也為0. 所以看是什麼樣的protocol都要設置對應的方式, cmd下進去跟fw溝通才會完整. 因此, 這一個部分如果單純sw在try一定碰壁居多, 畢竟, 如果大家都乖乖依照規範寫, 這世界就沒這麼多紛紛擾擾了… 其餘部分就是依照文件依此類推囉
從bus演進可以看出來到處都可見scsi,這是有歷史的設計,尤其可以看到電腦驅動的logo,那個就是scsi。但後面出現ata甚至到現在的nvme。其實向下相容設計本來就是一項基本,因此越老越舊的平台或OS都可見scsi cmd的影子而且你一定找不到ata,因此從開發角度來看,把握一點scsi cmd格式,在開發與除錯上可以得到不錯的相容性反應。