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が自動で認識されます。