Linuxでusbserialモジュールにau DATA07を自動認識させる

今回は、auの通信デバイスDATA07をLinuxに自動で認識させるための方法です。以前、似たような内容を書きました(LinuxでusbserialモジュールにL-02Cを自動で認識させる)が、至るまでの過程が異なりますので、まとめておきます。

前提条件
カーネルのバージョンは、linux-2.6.37です。
カーネルおよびカーネルモジュールのコンパイル等の知識を保有していることが前提です。
カーネルおよびカーネルモジュールの入れ替えには起動しなくなる等の可能性がありますので、自己責任で作業してください。
auのDATA07は環境により、productIDが0x1446として認識される場合と、0x1506として認識される場合があります。以下の内容は、productIDが0x1506として認識された環境で行ったものですが、0x1506を0x1446に置き換えても問題なく動作すると思います。

作業に至るまでの経緯
Linuxでauの通信デバイスDATA07を通常の用途で使用するには、udevからusb_modeswitchがコールされるように設定し、productIDを切り替えることでmodemとして認識させることができます。

しかし、usbserialを使用する他の通信デバイスを同時に接続した際に、usb_modeswitchがうまく動いてくれず、modemとして認識されないケースがありました。
usb_modeswitchがうまく動作し、DATA07がmodemとして認識される場合は、以下のようなログが出力されていました。

usb_modeswitch: adding device ID 12d1:1506 to driver "option"

そこで、上記メッセージを出力している箇所をgrepしていったところ、udevからコールされるusb_modeswitchのスクリプト(バイナリではなく)に該当箇所がありました(手元のファイルでは、301行目から327行目でした。見つからない場合は、addingを検索してください。)。

	set idfile /sys/bus/usb-serial/drivers/option1/new_id
	if {![file exists $idfile]} {
			Log "\nTrying to load the option driver"
			set loader /sbin/modprobe
			Log " loader is: $loader"
			if [file exists $loader] {
					set result [exec $loader -v option]
					if {[regexp {not found} $result]} {
							Log " option driver not present as module"
					}
			} else {
					Log " /sbin/modprobe not found"
			}
	}
	if [file exists $idfile] {
			Log "Trying to add ID to option driver"
			catch {exec logger -p syslog.notice "usb_modeswitch: adding device ID $usb(idVendor):$usb(idProduct)" to driver \"option\""}
			#"
			exec echo "$usb(idVendor) $usb(idProduct)" >$idfile
			after 600
			set devList2 [glob -nocomplain /dev/ttyUSB* /dev/ttyACM*]
			if {[llength $devList1] >= [llength $devList2]} {
					Log " still no new serial devices found"
			} else {
					Log " driver successfully bound"
			}
	}

ソースコードを見ると、addingというログを出力してから、idfileに対して“vendorID(半角スペース)productID”をechoしています。idfileは”/sys/bus/usb-serial/drivers/option1/new_id”ですので、このファイルに対して、ベンダIDとプロダクトIDの間に半角スペースを入れて出力すれば、usb_modeswitchの動作が再現できそうです。

実際に、/sys/bus/usb-serial/drivers/option1/new_idに対して”12d1 1506″をechoしてみたところ、DATA07をmodemとして認識させることができました。

ここまで来た時に、new_idについて調べてみたところ、以下のようなページを見つけました。

Thread: USB Serial device does not register a /dev/ttyUSBX, Opensuse 11.3 (64bit)

このページを参考に一旦usbserialをrmmodして、modprobe usbserial vendor=0x12d1 product=0x1506を実行し、他のデバイスと同時に接続してみたところ、以下のようなメッセージが出力され、正常にmodemとして認識させることができました。

vmunix: usb 1-1: Product: HUAWEI Mobile
vmunix: usb 1-1: Manufacturer: Huawei Technologies
vmunix: usbserial_generic 1-1:1.0: generic converter detected
vmunix: usb 1-1: generic converter now attached to ttyUSB2
vmunix: usbserial_generic 1-1:1.1: generic converter detected
vmunix: usb 1-1: generic converter now attached to ttyUSB3

generic.cの変更点
ここまでくれば、あとは以前書いた内容(LinuxでusbserialモジュールにL-02Cを自動で認識させる)と同じです。
drivers/usb/serial/generic.cを以下のように修正し、カーネルモジュールをコンパイルしました。

#define BM_VENDOR_DEFAULT      0x05f9
#define BM_PRODUCT_DEFAULT     0xffff
#define BM_VENDOR_L02C         0x1004
#define BM_PRODUCT_L02C        0x618f
+#define BM_PRODUCT_DATA07        0x12D1
+#define BM_PRODUCT_DATA07        0x1506

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) },
+      { USB_DEVICE(BM_VENDOR_DATA07, BM_PRODUCT_DATA07) },
       {} /* Terminating entry */
};

コンパイルしてできたusbserial.koを入れ替えると、DATA07をmodemとして自動で認識させることができます。

3 Comments

  1. こんにちは。
    自分も、FedoraでDATA07を認識させたいと思っていますが、うまくいきません。
    ubuntuの人達は、うまくwindows用のデバイスドライバを使ってアクセスできているようなことを、書いておられました。
    出来れば、LINUXの初心者の人にもわかるように記入していただけるとありがたいです。
    DATA07のLINUXでの情報は驚くほど少ない割りに、WEBサイトで書かれていても、反応が少ないところにマイナーさを感じるような気がします。
    基本DATA06の無線接続(子機使用)なんでしょうか。
    教えて君は、ありがたがられないし、かわりに差し上げる情報等ないですが、
    お暇でしたら、また情報書き込んでください。
    では。

  2. コメントありがとうございます。
    本内容は、カーネルの中にDATA07を自動で認識させる仕組みを入れるためのものですが、ユーザーランドで対応することも可能です。
    linux-2.6.32-41-generic(Ubuntu 10.04)の場合だと、以下のような手順を行います(詳細な手順については調べてみてください)。

    1.usbserialを引数付きでロードする
      記事中にもありますが、”lsmod | grep usbserial”を実行して何か表示される場合は、一旦”rmmod usbserial”を実行してアンロードし、”modprobe usbserial vendor=0x12d1 product=0x1506”を実行してusbserialをロードしておきます。

    2.usb_modeswitchでproductIDを変える
      DATA07がmodemとして認識されるには、vendorIDが12d1、productIDが1506である必要がありますが、productIDが1446で認識されていると思います(lsusbで確認)。
      これを解消するため、usb_modeswitchというプログラムをインストールしてください。
      ※yumやaptでは古いバージョンがインストールされることがあるので、本家よりダウンロードし、コンパイル、インストールしてください。確か、tclとlibusb-devが必要だったと思います。
      
    3.DATA07のmodem化確認
      1と2の手順を行った後、PCにDATA07を挿して30秒ほど待ち、ログ中に以下のような内容が出力されているとmodemとして認識されています。

    usbserial_generic 1-5:1.0: generic converter detected
    usb 1-5: generic converter now attached to ttyUSB0
    usbserial_generic 1-5:1.1: generic converter detected
    usb 1-5: generic converter now attached to ttyUSB1

    ここまでくれば、あとはpppdなどの接続用プログラムを使ってインターネットへ接続できます。
    参考になれば、幸いです。

  3. ご親切にありがとうございます。
    webページを保存してゆっくり見てみようと思います。
    自分で出来ればいいと思います。
      

コメントを残す

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

*