概要
- Nanoleaf Pegboard Desk Dock をLinuxで動かすためのドライバ開発記録
- 公式プロトコル情報 と逆アセンブル結果をもとに進行
- libusb を使ったユーザースペースドライバの作成方針
- udevルール による権限設定やNixOS対応の方法も紹介
- Rustとrusbクレート を用いた実装の基本手順解説
Nanoleaf Pegboard Desk DockのLinux対応挑戦記
- Nanoleaf Pegboard Desk Dock はWindows/macOS専用設計
- Linuxで利用するため、 独自ドライバ 開発が必要となる状況
- 公式サポートへ問い合わせたところ、 プロトコル仕様書 を迅速に入手
- 仕様書には 電源・輝度管理 など未発見の機能も記載
- 公式仕様と逆アセンブル結果の 照合作業 を実施
USBデバイスの基礎知識整理
- Linuxでは lsusbコマンド でUSBデバイス情報を取得可能
- idVendor や idProduct でデバイスを一意に識別
- USBデバイスは 複数の構成(Configuration) や インターフェース(Interface) を持つ
- Human Interface Device(HID) クラスとして認識されるが、RGB LED制御には未対応
- 汎用HIDドライバ が動作するものの、LED制御などの拡張機能は未実装
ドライバ開発方針の選択
- カーネルドライバ として/sys/class/leds配下に実装する案
- 独自製品のため、カーネル統合のメリットが限定的
- ユーザースペースドライバ (libusb利用)として実装する案
- 実装・配布のハードルが低く、 rusbクレート でRustからも制御可能
- 本記事では ユーザースペースドライバ 方式を採用
udevルールによるユーザー権限設定
-
USBデバイス制御にはroot権限 が必要だが、一般ユーザーで操作可能にしたい
-
/etc/udev/rules.d/70-pegboard.rules に以下の内容を記述
ACTION=="add", SUBSYSTEM=="usb", DRIVERS=="usb", ATTRS{idVendor}=="37fa", ATTRS{idProduct}=="8201", MODE="0770", TAG+="uaccess"- idVendorとidProductはlsusb出力から取得
- TAG+="uaccess" で現在のユーザーにアクセス権付与
-
NixOSの場合、カスタムパッケージ作成とservices.udev.packages拡張で対応
- pkgs.writeTextFileを利用したルールファイル生成
Rust + rusbでのドライバ実装入門
-
新規Rustプロジェクト作成 とrusbクレート追加
cargo new gamer-driver cd gamer-driver cargo add rusb -
デバイスハンドル取得例
use rusb::{Context, UsbContext}; const VENDOR: u16 = 0x37fa; const DEVICE: u16 = 0x8201; fn main() { let context = Context::new().expect("cannot open libusb context"); let device = context.open_device_with_vid_pid(VENDOR, DEVICE).expect("cannot get device"); let descriptor = device.device().device_descriptor().expect("cannot describe device"); println!("{descriptor:#?}"); } -
インターフェースのクレーム
- bInterfaceNumberが0であることを確認
- claim_interface メソッドで取得
- 失敗時(Busy)は カーネルドライバがデバイスを保持 している可能性
-
カーネルドライバのデタッチ
if device.kernel_driver_active(INTERFACE).expect("cannot get kernel driver") { device.detach_kernel_driver(INTERFACE).expect("cannot detach kernel driver"); } device.claim_interface(INTERFACE).expect("unable to claim interface");- 必要に応じて attach_kernel_driver で再接続も可能
次のステップ:データ送信準備
- write_bulk, write_control, write_interrupt 等のメソッドでデータ送信可能
- どのメソッドを利用するかは デバイス仕様 や エンドポイント属性 に依存
- 以降は ペイロード送信 や LED制御コマンド 実装へ発展予定
この流れで、 ユーザースペースから安全かつ手軽にNanoleaf Pegboard Desk DockをLinuxで制御 するための基礎が整います。