1-wire (w1) 子系統簡介¶
1-wire 匯流排是一個簡單的主從匯流排,透過單根訊號線(加上地線,所以是兩根線)進行通訊。
裝置透過使用漏極開路輸出將訊號拉低到地電位,以及取樣訊號線的邏輯電平來在總線上進行通訊。
w1 子系統提供了一個框架,用於管理 w1 主裝置並與從裝置進行通訊。
所有 w1 從裝置都必須連線到 w1 匯流排主裝置。
w1 主裝置示例
DS9490 USB 裝置
W1-over-GPIO
DS2482 (i2c to w1 橋接器)
模擬裝置,例如 RS232 轉換器、並行埠介面卡等
w1 子系統做什麼?¶
當 w1 主裝置驅動程式在 w1 子系統中註冊時,會發生以下情況:
為該 w1 主裝置建立 sysfs 條目
定期搜尋 w1 總線上的新從裝置
當在總線上找到裝置時,w1 核心會嘗試載入其系列驅動程式並檢查是否已載入。 如果已載入,則將系列驅動程式附加到從裝置。 如果沒有該系列的驅動程式,則會分配預設驅動程式,這允許執行幾乎任何型別的操作。 每個邏輯操作本質上都是一個事務,可以包含幾個(兩個或一個)低階操作。 讓我們看看如何讀取 EEPROM 上下文:1. 必須寫入控制緩衝區,即包含命令位元組和兩個位元組地址的緩衝區。 在此步驟中,匯流排被複位,並使用 W1_SKIP_ROM 或 W1_MATCH_ROM 命令選擇適當的裝置。 然後將提供的控制緩衝區寫入到總線上。 2. 讀取。 這將發出讀取 eeprom 響應。
可能在 1. 和 2. 之間,w1 主執行緒將重置匯流排進行搜尋,甚至會刪除從裝置,但在這種情況下,將讀取 0xff,因為未選擇任何裝置。
W1 裝置系列¶
從裝置由為 w1 裝置系列編寫的驅動程式處理。
系列驅動程式填充 struct w1_family_ops(參見 w1_family.h)並在 w1 子系統中註冊。
當前系列驅動程式
- w1_therm
(ds18?20 熱感測器系列驅動程式) 提供溫度讀取功能,該功能繫結到上述 w1_family_ops 結構的 ->rbin() 方法。
- w1_smem
用於簡單 64 位儲存單元的驅動程式,提供 ID 讀取方法。
您可以透過讀取適當的 sysfs 檔案來呼叫上述方法。
w1 主裝置驅動程式需要實現什麼?¶
w1 匯流排主裝置的驅動程式必須至少提供兩個函式。
模擬裝置必須提供設定輸出訊號電平(write_bit)和取樣訊號電平(read_bit)的能力。
本地支援 1-wire 的裝置必須提供寫入和取樣一位(touch_bit)和重置匯流排(reset_bus)的能力。
大多數硬體提供更高級別的功能,可以解除安裝 w1 處理。 有關詳細資訊,請參見 w1.h 中的 struct w1_bus_master 定義。
w1 主裝置 sysfs 介面¶
<xx-xxxxxxxxxxxx> |
找到的裝置的目錄。 格式為系列-序列號 |
bus |
(標準) 指向 w1 匯流排的符號連結 |
driver |
(標準) 指向 w1 驅動程式的符號連結 |
w1_master_add |
(rw) 手動註冊從裝置 |
w1_master_attempts |
(ro) 嘗試搜尋的次數 |
w1_master_max_slave_count |
(rw) 一次要搜尋的最大從裝置數量 |
w1_master_name |
(ro) 裝置的名稱 (w1_bus_masterX) |
w1_master_pullup |
(rw) 5V 強上拉,0 啟用,1 停用 |
w1_master_remove |
(rw) 手動移除從裝置 |
w1_master_search |
(rw) 剩餘的搜尋次數,-1=持續(預設) |
w1_master_slave_count |
(ro) 找到的從裝置數量 |
w1_master_slaves |
(ro) 從裝置的名稱,每行一個 |
w1_master_timeout |
(ro) 搜尋之間的延遲(以秒為單位) |
w1_master_timeout_us |
(ro) 搜尋之間的延遲(以微秒為單位) |
如果您的 w1 匯流排永遠不會更改(您不新增或移除裝置),您可以將模組引數 search_count 設定為較小的正數,以便最初進行較少數量的匯流排搜尋。 或者,可以將其設定為零,然後透過 w1_master_add 裝置檔案手動新增從裝置序列號。 w1_master_add 和 w1_master_remove 檔案通常僅在禁用搜索時才有意義,因為搜尋將重新檢測存在的、手動移除的裝置,並使不在總線上的手動新增的裝置超時。
匯流排搜尋以間隔發生,該間隔指定為 timeout 和 timeout_us 模組引數的總和(兩者都可以為 0),只要 w1_master_search 保持大於 0 或為 -1。 每次搜尋嘗試都會將 w1_master_search 遞減 1(降至 0),並將 w1_master_attempts 遞增 1。
w1 從裝置 sysfs 介面¶
bus |
(標準) 指向 w1 匯流排的符號連結 |
driver |
(標準) 指向 w1 驅動程式的符號連結 |
name |
裝置名稱,通常與目錄名稱相同 |
w1_slave |
(可選) 含義取決於系列驅動程式的二進位制檔案 |
rw |
(可選) 為沒有適當系列驅動程式的從裝置建立。 允許讀取/寫入二進位制資料。 |