Aros/開發人員/文件/裝置/ATA
ata.device 已重構並分離了匯流排訪問程式碼。
對它們實施 HIDD API 會有益嗎?它實際上允許使用者構建自己的 ata.device 版本,並在執行時新增驅動程式。
當前程式碼將 EXECUTE DEVICE DIAGNOSTIC 單獨傳送到主裝置和從裝置(如果兩者都存在)。僅當兩個裝置都是 PATA 硬碟時。ATAPI 在較早的時間進行檢查,因此在這種情況下並不重要。
ATA 規範說
使用此介面的裝置應由主機計算機程式設計以執行命令並在命令完成時向主機返回狀態。當兩個裝置在介面上菊花鏈連線時,命令將並行寫入兩個裝置,除了 EXECUTE DEVICE DIAGNOSTIC 命令外,只有選定的裝置執行命令。兩個裝置都應執行 EXECUTE DEVICE DIAGNOSTIC 命令,無論選擇哪個裝置,裝置 1 都應透過 PDIAG- 將其狀態釋出到裝置 0。當裝置控制暫存器中的 SRST 位設定為 1 時,兩個裝置都應執行軟體復位協議。
程式碼要麼缺少解釋為什麼以這種方式執行的註釋,要麼就是錯誤。這意味著兩個裝置都運行了 EXECUTE DEVICE DIAGNOSTIC 兩次,這可能會導致檢測程式碼出現問題。在 ATA 從裝置完成(EXECUTE DEVICE DIAGNOSTIC 完成)之後,沒有任何東西可以重新檢查主裝置的狀態。如果它是比從裝置慢的裝置,它仍然可能正在執行此命令。
如果我正確理解 ATA 規範,主裝置將等待從裝置完成使用 /PDIAG 線,但當從裝置完成時,主裝置可能仍在執行診斷。我只執行它一次,而不是新增第二個測試。
匯流排探測程式碼仍然需要做一些工作 -
當前行為
- 建立傳統埠列表
- 列舉 PCI 裝置(從列表中刪除已使用的傳統埠)
- 新增剩餘的傳統埠。
正確行為
- 建立傳統埠列表
- 列舉 PCI 裝置(刪除傳統節點) - 並檢查連線的單元
- 如果沒有找到單元,則新增剩餘的傳統埠。
IDE 倍增器處理將僅在 m68k-amiga 平臺檔案中進行。
IDE 倍增器是一種裝置,它將 IDE 匯流排數量增加一倍(從單個 IDE 匯流排獲取兩個獨立的匯流排,兩者都可以具有主裝置和從裝置)如果安裝了 Amiga IDE 倍增器(即使沒有驅動器連線到額外的 IDE 匯流排),IDE 檢測將掛起。
IDE 倍增器接管第 3(位 2)IDE 地址線並將其用作 IDE 匯流排 0/1 選擇線。(誰發明了這種駭客行為?)不幸的是,這也意味著 ATA 備用狀態和裝置控制暫存器將無法訪問。目前,ata.device 需要兩者。
我可以在 Amiga 特定程式碼中輕鬆地“模擬”這兩個暫存器,只需要在通用中斷處理程式中進行一些小的更改,但是“無備用狀態/裝置控制”處理應該在通用程式碼中嗎?我的意思是,如果備用埠 == 0,是否使用備用方法?
還有其他平臺使用過 IDE 倍增器嗎?它不是 Amiga 特定的,但似乎它們只能與傳統的僅 PIO 硬體一起使用。
據我所知,所有 FastATA 模型都帶有包含自定義驅動程式的引導 ROM,不需要或不使用 ata.device。據報道,FastATA 引導 ROM 崩潰,原因不明。(可能需要 FastATA 擴充套件或 ROM 匯出才能找到問題)。而且對於速度最佳化來說還為時過早(而且這個最佳化可能會引入新的相容性問題)。這裡是 FastATA 1200、4000 和 ZIV 的文件。
不幸的是,這也意味著 ATA 備用狀態和裝置控制暫存器將無法訪問。目前,ata.device 需要兩者。我可以在 Amiga 特定程式碼中輕鬆地“模擬”這兩個暫存器,只需要在通用中斷處理程式中進行一些小的更改,但是“無備用狀態/裝置控制”處理應該在通用程式碼中嗎?我的意思是,如果備用埠 == 0,是否使用備用方法?
IDE 倍增器程式碼現在位於 Amiga 特定檔案中(它甚至還沒有在真實機器上進行測試,現在還沒有任何型別的通用支援)。通用程式碼中唯一的變化是中斷處理程式狀態/備用狀態重新排序。
據我所知,在這種情況下,您只需使用狀態而不是備用狀態。備用狀態在我們的 ata.device 中使用,因為狀態會重置中斷狀態,中斷可能會丟失。在速度較慢的機器上偶爾會發生這種情況。因此,在狀態的情況下,我們可以避免使用 IOAlt = IOBase 的“if”。是否可以對裝置控制說同樣的話?如果是這樣,問題根本不存在。
還有其他平臺使用過 IDE 倍增器嗎?沒有已知的。它不是 Amiga 特定的,但似乎它們只能與傳統的僅 PIO 硬體一起使用。是的,DMA 是一個完全不同的東西。順便說一句,我看到您在 Amiga 埠中將 dma 程式碼覆蓋為 NOPs。這是否意味著 DMA 操作是匯流排特定的,應該移到匯流排驅動程式中?Amiga PCI 總線上的 DMA 與此程式碼有何不同?我真的想將這部分 HIDD 化。沒有 Amiga IDE DMA 裝置,從未有過,可能永遠不會有。所有這些都是僅 PIO 的,即使是更新的第三方裝置也是如此。這就是為什麼我想擺脫“無用”的 DMA 程式碼的原因。
即使是 PCI 橋接板?據我所知,至少其中一些是支援 DMA 的?也許吧,但這個 ata.device 只處理 Gayle 相容的 PIO-IDE。是否可以使用同一個 ata.device 處理 PCI 風格的自定義 IDE 埠? (從技術上講,Gayle ata.device 應該被稱為“scsi.device”,但也許沒有人真的關心。我希望…)
我終於得到了一個 A4000,並注意到 ata.device 掛起了。配置是 CF 卡(8G SanDisk,主裝置)和 Plextor PX-708A(從裝置)。
出於某種未知的原因,ATA_EXECUTE_DIAG 會導致中斷。(是的,nIEN 已設定!)根據 ATA 規範,這不應該發生,我檢查了 ATA-1、ATA-2 和 ATA-7 規範。這會完全掛起機器,因為沒有人可以清除中斷。
因此,要麼 ata_AltControl 在 A4000 上不起作用(但另一方面,如果我手動讀取暫存器,ata_AltStatus 很明顯可見),要麼是 IDE 裝置(或兩者)有缺陷。
我可以透過在 ata_InitBus() 呼叫之前設定中斷處理程式,並讓 ata_HandleIRQ() 來清除虛假中斷來輕鬆解決此問題。
我可以儘早(在 ata_RegisterBus 中,在 ata_InitBus() 之前)呼叫 bus->ab_Driver->CreateInterrupt(bus);還是有某種原因導致它在稍後呼叫?如果它破壞了其他平臺,替代修復是什麼?是否向 ata_BusDriver 結構新增 CreateInterruptEarly() 或其他類似的東西?
如果使用 IDE 倍增器,此修復也是必需的,因為它使 ata_AltControl 無法訪問。也許這也可以解決其他報告的 IDE 檢測掛起問題?我記得在論壇上看到過類似的東西。