LinuxでusbserialモジュールにL-02Cを自動で認識させる

LinuxでDocomoの通信デバイスL-02Cを使用するためには、現状、usbserialモジュールを引数付き(vendor=0x1004 product=0x618f)でロードする必要があります。

しかし、諸事情により引数付きでロードする訳にはいかないので、自動で認識させるようにした時の方法をまとめておきます。

前提条件
カーネルのバージョンは、linux-2.6.37です。
カーネルおよびカーネルモジュールのコンパイル等の知識を保有していることが前提です。
カーネルおよびカーネルモジュールの入れ替えには起動しなくなる等の可能性がありますので、自己責任で作業してください。

usbserial.koの調査
対象のソースファイルは、drivers/usb/serial/generic.cです。
以下の部分(実際は、34行目から43行目)で、デフォルトのvendorID、productIDが宣言され、モジュールのパラメータも受け付けられるように記述されています。

static __u16 vendor  = 0x05f9;
static __u16 product = 0xffff;

module_param(vendor, ushort, 0);
MODULE_PARM_DESC(vendor, "User specified USB idVendor");

module_param(product, ushort, 0);
MODULE_PARM_DESC(product, "User specified USB idProduct");

static struct usb_device_id generic_device_ids[2]; /* Initially all zeroes. */

重要なのは、generic_device_ids配列で、モジュール登録処理時のusb_serial_generic_register関数内において、generic_device_idsの0番目の要素に引数指定された場合はその値が、されない場合はデフォルトの値が登録されます。

これらのことから、generic_device_ids配列に自動認識させたいデバイスのvendorID、productIDを入れればよいということが推測されます。

generic.cの変更点
実際に行った変更は以下です。

diff -ruaN ./bkup/generic.c ./change/generic.c
--- ./bkup/generic.c    2011-12-15 14:53:42.726830743 +0900
+++ ./change/generic.c  2011-12-15 15:03:28.654831284 +0900
@@ -40,7 +40,17 @@
 module_param(product, ushort, 0);
 MODULE_PARM_DESC(product, "User specified USB idProduct");

-static struct usb_device_id generic_device_ids[2]; /* Initially all zeroes. */
+#define BM_VENDOR_DEFAULT      0x05f9
+#define BM_PRODUCT_DEFAULT     0xffff
+#define BM_VENDOR_L02C         0x1004
+#define BM_PRODUCT_L02C        0x618f
+
+static struct usb_device_id generic_device_ids[] = {
+       { USB_DEVICE(BM_VENDOR_DEFAULT, BM_PRODUCT_DEFAULT) }, // for arguments.
+       { USB_DEVICE(BM_VENDOR_DEFAULT, BM_PRODUCT_DEFAULT) },
+       { USB_DEVICE(BM_VENDOR_L02C, BM_PRODUCT_L02C) },
+       {} /* Terminating entry */
+};

 /* we want to look at all devices, as the vendor/product id can change
  * depending on the command line argument */

ここで、generic_device_idsの0番目と1番目の要素が重複しているのは、引数指定された時のためです。必要なければ、削ってしまっても問題ないと思います。
別のデバイスのvendorID、productIDを指定してロードできることは確認しています(その場合でも、L-02Cは自動で認識されます)。

変更したソースをコンパイルしてモジュールを作成し、対象モジュールを入れ替えれば、vendorID、productIDを指定せずとも、ejectするだけでL-02Cが自動で認識されます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*