|
| 1 | +この章では、ATAドライバについて記述します。 |
| 2 | +実装されているファイルは[ata.c](../../src/kernel/driver/ata.c), [ata.h](../../src/include/driver/ata.h)です。 |
| 3 | + |
| 4 | +## 概要 |
| 5 | +ATAドライバは、IDE/ATAハードディスクドライブへのアクセスを提供します。PIOモードを使用してセクタの読み書きを行い、LBA28アドレッシングをサポートします。プライマリおよびセカンダリバスの両方に対応し、マスター/スレーブドライブの検出と制御が可能です。 |
| 6 | + |
| 7 | +## 関数 / API |
| 8 | + |
| 9 | +#### `int ata_init(void)` |
| 10 | +ATAドライバを初期化し、接続されているATAデバイスを検出します。Primary Slave、Secondary Master、Primary Masterの順にデバイスを試行します。 |
| 11 | + |
| 12 | +引数: なし |
| 13 | + |
| 14 | +戻り値: 成功時0、失敗時-1 |
| 15 | + |
| 16 | +#### `int ata_read_sectors(uint8_t drive, uint32_t lba, uint8_t sectors, void *buffer)` |
| 17 | +ATAデバイスから指定されたセクタを読み取ります。 |
| 18 | + |
| 19 | +引数: |
| 20 | + - drive(uint8_t): ドライブ番号(0=Primary Master, 1=Primary Slave, 2=Secondary Master, 3=Secondary Slave) |
| 21 | + - lba(uint32_t): 読み取り開始LBA(Logical Block Address) |
| 22 | + - sectors(uint8_t): 読み取るセクタ数 |
| 23 | + - buffer(void*): 読み取ったデータを格納するバッファ(sectors * 512バイト) |
| 24 | + |
| 25 | +戻り値: 成功時0、失敗時-1 |
| 26 | + |
| 27 | +#### `int ata_write_sectors(uint8_t drive, uint32_t lba, uint8_t sectors, const void *buffer)` |
| 28 | +ATAデバイスへ指定されたセクタを書き込みます。 |
| 29 | + |
| 30 | +引数: |
| 31 | + - drive(uint8_t): ドライブ番号 |
| 32 | + - lba(uint32_t): 書き込み開始LBA |
| 33 | + - sectors(uint8_t): 書き込むセクタ数 |
| 34 | + - buffer(const void*): 書き込むデータのバッファ |
| 35 | + |
| 36 | +戻り値: 成功時0、失敗時-1 |
| 37 | + |
| 38 | +## 定数 / 定義 |
| 39 | + |
| 40 | +### ATAレジスタ(Primary Bus) |
| 41 | +- `ATA_PRIMARY_DATA`: 0x1F0 - データレジスタ |
| 42 | +- `ATA_PRIMARY_ERROR`: 0x1F1 - エラーレジスタ(読み取り) |
| 43 | +- `ATA_PRIMARY_FEATURES`: 0x1F1 - フィーチャーレジスタ(書き込み) |
| 44 | +- `ATA_PRIMARY_SECCOUNT`: 0x1F2 - セクタカウントレジスタ |
| 45 | +- `ATA_PRIMARY_LBALOW`: 0x1F3 - LBA Low |
| 46 | +- `ATA_PRIMARY_LBAMID`: 0x1F4 - LBA Mid |
| 47 | +- `ATA_PRIMARY_LBAHIGH`: 0x1F5 - LBA High |
| 48 | +- `ATA_PRIMARY_DRIVE`: 0x1F6 - ドライブ/ヘッドレジスタ |
| 49 | +- `ATA_PRIMARY_STATUS`: 0x1F7 - ステータスレジスタ(読み取り) |
| 50 | +- `ATA_PRIMARY_COMMAND`: 0x1F7 - コマンドレジスタ(書き込み) |
| 51 | + |
| 52 | +### ATAレジスタ(Secondary Bus) |
| 53 | +- `ATA_SECONDARY_DATA`: 0x170 - データレジスタ |
| 54 | +- `ATA_SECONDARY_ERROR`: 0x171 - エラーレジスタ |
| 55 | +- `ATA_SECONDARY_FEATURES`: 0x171 - フィーチャーレジスタ |
| 56 | +- `ATA_SECONDARY_SECCOUNT`: 0x172 - セクタカウントレジスタ |
| 57 | +- `ATA_SECONDARY_LBALOW`: 0x173 - LBA Low |
| 58 | +- `ATA_SECONDARY_LBAMID`: 0x174 - LBA Mid |
| 59 | +- `ATA_SECONDARY_LBAHIGH`: 0x175 - LBA High |
| 60 | +- `ATA_SECONDARY_DRIVE`: 0x176 - ドライブ/ヘッドレジスタ |
| 61 | +- `ATA_SECONDARY_STATUS`: 0x177 - ステータスレジスタ |
| 62 | +- `ATA_SECONDARY_COMMAND`: 0x177 - コマンドレジスタ |
| 63 | + |
| 64 | +### ATAコマンド |
| 65 | +- `ATA_CMD_READ_PIO`: 0x20 - PIO読み取りコマンド |
| 66 | +- `ATA_CMD_WRITE_PIO`: 0x30 - PIO書き込みコマンド |
| 67 | +- `ATA_CMD_IDENTIFY`: 0xEC - IDENTIFY DEVICEコマンド |
| 68 | + |
| 69 | +### ATAステータスビット |
| 70 | +- `ATA_SR_BSY`: 0x80 - ビジー(デバイスが処理中) |
| 71 | +- `ATA_SR_DRDY`: 0x40 - ドライブ準備完了 |
| 72 | +- `ATA_SR_DF`: 0x20 - ドライブ書き込みエラー |
| 73 | +- `ATA_SR_DSC`: 0x10 - ドライブシーク完了 |
| 74 | +- `ATA_SR_DRQ`: 0x08 - データ要求準備完了 |
| 75 | +- `ATA_SR_CORR`: 0x04 - 訂正されたデータ |
| 76 | +- `ATA_SR_IDX`: 0x02 - インデックス |
| 77 | +- `ATA_SR_ERR`: 0x01 - エラー |
| 78 | + |
| 79 | +### ATAエラービット |
| 80 | +- `ATA_ER_BBK`: 0x80 - 不良ブロック |
| 81 | +- `ATA_ER_UNC`: 0x40 - 訂正不可能なデータ |
| 82 | +- `ATA_ER_MC`: 0x20 - メディア変更 |
| 83 | +- `ATA_ER_IDNF`: 0x10 - IDが見つからない |
| 84 | +- `ATA_ER_MCR`: 0x08 - メディア変更要求 |
| 85 | +- `ATA_ER_ABRT`: 0x04 - コマンド中止 |
| 86 | +- `ATA_ER_TK0NF`: 0x02 - トラック0が見つからない |
| 87 | +- `ATA_ER_AMNF`: 0x01 - アドレスマークが見つからない |
| 88 | + |
| 89 | +### ATAデバイス選択 |
| 90 | +- `ATA_MASTER`: 0xE0 - マスターデバイス |
| 91 | +- `ATA_SLAVE`: 0xF0 - スレーブデバイス |
| 92 | + |
| 93 | +## 構造体 |
| 94 | + |
| 95 | +このファイルには公開構造体の定義はありません。 |
| 96 | + |
| 97 | +### 内部実装 |
| 98 | + |
| 99 | +ATAドライバはポーリングベースのPIOモードを使用します: |
| 100 | +- デバイスの準備完了を待機(BSYビットのクリア) |
| 101 | +- データ要求準備完了を待機(DRQビットのセット) |
| 102 | +- エラー検出とタイムアウト処理 |
| 103 | +- 割り込みイベントの定期的な処理でFIFOオーバーフローを防止 |
0 commit comments