當模態不匹配時,是否可以在 linux 上使用現有驅動程序設置新設備?
我有一個用於 Ubuntu 20.04.3 的 USB 設備。製造商提供了一個庫和一個驅動程序。
我可以安裝驅動程序並讓設備工作,但每次核心更新時,我都必須將驅動程序重新安裝到新樹中。我知道這是 dkms 的工作,我開始著手解決這個問題,因為它看起來並不難,但退後一步,我想知道是否有更簡單/更好的方法來讓設備正常工作我認為他們的大部分使用者群是 Windows,因此沒有太多的開發時間用於 linux 方面。無論如何,我想更多地了解linux是如何做事的。
他們提供的驅動程序是經過稍微修改的 Exar 驅動程序。查看他們的版本和原版 Exar 驅動程序之間的差異,基本上他們所做的只是將他們的供應商編號和產品 ID 編號添加到程式碼中,以便他們的設備將被辨識為與驅動程序兼容並執行適當的程式碼塊(與當設備與他們的設備描述符匹配時,他們使用的特定 Exar 晶片。
基於這個非常有用的頁面和網際網路上的其他資源,我的理解是每個驅動程序都有一個 modules.alias 文件,該文件基本上對它接受的設備類型有規則。然後,當設備插入時,系統會從設備中提取資訊,為該設備製作一個模態別名文件。然後,將設備模態別名與 modules.alias 文件中的規則匹配的第一個最具體的驅動程序是分配給設備的驅動程序。
所以我想我的設備有一個 Exar 晶片,如果驅動程序接受它並將其辨識為本質上是 Exar 晶片,則可以使用 Exar 驅動程序使其工作。但是由於製造商放置了他們自己的自定義設備描述符,modprobe 無法辨識該設備與 vanilla Exar 驅動程序兼容。
與其複制驅動程序並稍微修改它以使系統像以前那樣尊重它,有沒有辦法告訴系統該設備確實與香草 Exar 驅動程序兼容,或者隱藏了一個 Exar 設備作為某種子設備?就 modprobe 而言,就像設備描述符的別名一樣?
或者也許有一種方法可以為這個設備編寫一個不同的驅動程序,利用底層的 exar 驅動程序並將所有內容傳遞給它而不是複制程式碼?然後我可以從晶片製造商那裡獲得更新的好處。
還是我應該繼續使用 dkms,因為製造商的做法是最好的做法?
我已經看到了有關如何使用 udev 規則將驅動程序綁定和取消綁定到設備的範例,但我認為如果驅動程序不匹配,它無論如何都不會被綁定?即使是這樣,那會是“最好”的方式嗎?
正如@ReedGhost 在評論中很有幫助的建議(謝謝!),這正是我想做的。我找到了內置的 xr_serial 模組,並將我的設備供應商和產品 ID 回顯到 newid 文件中。內置驅動程序將我的設備辨識為兼容並在我插入時載入。
但是,這並沒有解決我的具體案例,因為內置的 exar 驅動程序是為具有不同產品 ID 的多個設備編寫的。有一個 if-then-else 鏈指定要為每個特定產品 ID 執行的特定程式碼塊。因此,某些功能仍然無法正常工作,因為我的設備 ID 導致它在它應該執行其他部分之一時轉到程式碼的 else 部分。
我現在意識到我真的需要將設備的 id 欺騙或替換為使用的特定晶片的 id,而不是僅僅添加一個新的晶片以供驅動程序辨識。
編輯:實際上,我可能會嘗試為使用製造商提供的驅動程序的設備編寫不同的驅動程序,因為這似乎是更正確的方法並獲得更新的好處。對於發現此問題並遇到相同問題的任何人來說,這個問題和 這個問題似乎都是很好的起點。同時,我使用dkms來更新驅動程序。