8月 022020
 

今回も ThinkPad X13 で FreeBSD を動かすネタです。前回のエントリは「ThinkPad X13 AMD で利用する FreeBSD。」というネタでしたが、結局のところ FreeBSD/amd64 12.1-RELEASE ではだいじなものが動作しない。と、いう結果に終わりました。

その後、それなりに使い続けているのですが、中々厳しい状況においてもそれなりに許せる点もあるので、その辺りについて先に書いてみます。

 
o. 音は出るね。
/dev/sndstat を覗いてみると音は出るみたいです。

Installed devices:
pcm0: <ATI R6xx (HDMI)> (play)
pcm1: <ATI R6xx (HDMI)> (play)
pcm2: <ATI R6xx (HDMI)> (play)
pcm3: <Realtek (0x0257) (Analog)> (play/rec) default
pcm4: <Realtek (0x0257) (Right Analog Headphones)> (play)
No devices installed from userspace.

 
本体で音を出すのは Realtek 側のデバイスを利用する必要があるのですが、前のエントリでは「イヤホンジャックに切り替えられない」と、書いていたのですが、実はそんなことはなく、ちゃんと切り替えできました。

ただ、利用できない状態の場合もあります。例えば動画を mpv で見るとき、止まってしまいます。色々オプションを変えて確認したところ mpv -no-audio test.mp4 とかで再生できることが解りました。
つまり、mpv で動画の再生ができないのは Realtek のドライバがちょっと怪しいからなのね。と、いうことが解りました。

で、回避策ですが、Windows10 をリブートして FreeBSD を起動するとサウンドデバイスが怪しい。しっかりとシャットダウン状態から起動すると音が出るような感じです。通電している状態からの初期化がうまくいってないのかな?と、いう雰囲気です。

まぁ、音が出るのでヨシとしておきますf(^^;;。

 
o. suspend/redume もしないし画面の明るさ変えられないけど・・。
いやぁ・・。半分あきらめの境地で xf86-video-scfb を利用していますが、比較的新しい AMD APU を利用している人は以下の URL を見てみると良いかもです。

amd vega and radeon series vga card driver for FreeBSD 12.1 tutorial for beginner

Picasso は大丈夫そうですね。 Renoir はまだちょっと無理っぽい・・。

そして、drm-v5.0-fbsd12.1.zip を使い、 linuxkpi のソースにパッチを当てると suspend/resume もするみたいです。

いやぁ・・。早く Renoir に対応してくれないかなぁ・・。

 
画面の明るさを調整できないのは、AC アダプタ運用時には特に気にならないです。それにしても液晶ディスプレーが大きくて綺麗なので scfb でも結構それなりに綺麗に映ります。明るい画面だとなおさら綺麗に見えるっ!!

負け惜しみです・・。 orz

ThinkPad E145 の場合は 起動中の BIOS の画面とか、FreeBSD のブートセレクタの画面が出ているときに ThinkPad の Fn ボタンで画面の明るさが調整できた (FreeBSD が起動して acpi.ko に制御が渡るといきなりボタンが無効化される。 acpi.ko が悪さしていることは、文字通り、目に見えている) のですが、今はそれができない。最大の明るさで光っています。 xrandr でも制御できない。

 
と、いうことで、本題に行きましょうか。

ThinkPad X13 AMD に FreeBSD/amd64 12.1-RELEASE をインストールしていて、実はタッチパットの動作が怪しかったのであります。

どの辺りが怪しかったかというと、

  • タッチしてツーツーと指を動かしてもカーソルの動きがやたらと遅い
  • 二本指でスクロールしてくれない
  • KDE5 の「KDE システム設定」の「ハードウェア」→「入力デバイス」→「マウス」の [タッチパッド] のメニューで認識していない

みたいな感じです。一応、タップしてクリック風の動作はするし、タッチしてズズズとずらすとマウスカーソルが動いてくれるので『ま。こんなモノなのかな。新製品は。』などと、思っておりましたが、二本指でスクロールができないのは不便なことこの上ないので、やはり調べてみることにしました。

 
1. iichid って?
ports に sysutils/iichid というのがあります。これをインストールします。

GitHub に設定方法が書いてあるので、参考にして、色々設定します。

https://github.com/wulf7/iichid

/boot/loader.conf で ig4 iicbus と iichid を kldload するように設定しろ。って、書いてあります。その通りします。
xorg.conf のマウスの部分の設定も上記 URL に書かれているようにします。しかし、二本指スクロールの設定はなくてええんかい? と、なるのでありますが・・。

実は /boot/loader.conf にはもう一個設定が必要です。

 
2. /boot/loader.conf の設定
フツー、ThinkPad を利用している人は赤ポッチのマウスとタッチパッドの両方を利用したいと考えます。その設定を /boot/loader.conf に書きます。上記の kldload 分と合わせて書いたものはこんな感じです。

hw.psm.synaptics_support="1"
hw.psm.trackpoint_support="1"

ig4_load="YES"
iic_load="YES"
iichid_load="YES"

 
synaptics_support はタッチパットサポートの設定で trackpoint_supportは赤ポッチサポートですね。
そして xorg.conf のマウス部分の設定に入ります。

Section "InputClass"
    Identifier          "libinput touchpad catchall"
    MatchIsTouchpad     "on"
    MatchDevicePath     "/dev/input/event*"
    Driver              "libinput"
    Option              "NaturalScrolling" "on"
    Option              "ScrollMethod"     "twofinger"
    Option              "Tapping" "on"
    Option              "DisableWhileTyping" "on"
    Option              "AccelSpeed" "0.42"
EndSection

Section "InputClass"
    Identifier  "Trackpoint Wheel Emulation"
    Driver              "evdev"
    MatchProduct        "TPPS/2 IBM TrackPoint"
    MatchDevicePath     "/dev/input/event*"
    Option              "EmulateWheel"          "true"
    Option              "EmulateWheelButton"    "2"
    Option              "Emulate3Buttons"       "false"
    Option              "XAxisMapping"          "6 7"
    Option              "YAxisMapping"          "4 5"
EndSection

 
ThinkPad E145 の場合はこれで動いていました。以前のエントリの「FreeBSD に KDE5 が降ってきた。」で libinput を使うようにしました。その流れのまま ThinkPad X13 AMD の設定をしていたのですが、上記のような現象。 ScrollMethod twofinger が効いてない。

 
何回か、試してみましたが、ダメでした。で、色々と調べたところ、今の時代 hw.psm.synaptics_support ではなく hw.psm.elantech_support というのを使うと良いみたいなのであります。と、いうことで全て設定を見直してみました。

 
3. 結局 hw.psm.elantech_support=1 だね
まずは正しいと思われる設定を色々としていくことにします。

 
o./boot/loader.conf

#hw.psm.synaptics_support="1"
hw.psm.elantech_support="1"
hw.psm.trackpoint_support="1"

ig4_load="YES"
iic_load="YES"
iichid_load="YES"

evdev_load="YES"
uinput_load="YES"
cuse_load="YES"

 
ThinkPad X13 AMD の場合は hw.psm.synaptics_support ではなく hw.psm.elantech_support を 1 にします。
一応 iichid 関連を kldload するようにしました。
その下 evdev は libinput 系の Xorg で利用するときに必要なカーネルモジュールです。これらも kldload するようにしました。

とは言いつつ、僕の場合、デスクトップに KDE5 を利用しているので Wayland べったりです。 ports 的にインストールしたのは以下になるでしょうかね。

 
xf86-input-evdev-2.10.6_5
xf86-input-keyboard-1.9.0_4
xf86-input-libinput-0.30.0
xf86-input-mouse-1.9.3_3
xf86-input-synaptics-1.9.1_6 (多分、これはもう要らない)

 

o.Xorg.conf のマウス設定

Section "InputClass"
    Identifier          "libinput touchpad catchall"
    Driver              "libinput"
    MatchDevicePath     "/dev/input/event3"
    MatchIsTouchpad     "on"

    Option "AccelSpeed"  "0.1"
    Option "ClickMethod" "clickfinger"
    Option "DisableWhileTyping"  "on"
    Option "HorizontalScrolling" "on"
    Option "LeftHanded"          "off"
    Option "NaturalScrolling"    "on"
    Option "ScrollMethod"        "twofinger"
    Option "Tapping"             "on"
    Option "TappingDrag"         "on"
    Option "TappingDragLock"     "on"
EndSection

Section "InputClass"
    Identifier          "Trackpoint Wheel Emulation"
    Driver              "evdev"
#   MatchProduct        "TPPS/2 IBM TrackPoint"
    MatchDevicePath     "/dev/input/event4"
    Option              "EmulateWheel"          "true"
    Option              "EmulateWheelButton"    "2"
    Option              "Emulate3Buttons"       "false"
    Option              "XAxisMapping"          "6 7"
    Option              "YAxisMapping"          "4 5"
EndSection

 
上の部分がタッチパットで、下の設定が赤ポッチ(トラックポイント)です。 xinput list とか、コマンド打つとか /var/log/Xorg.0.log をひたすら眺めて /dev/input/event の何番目が割り当てられるのか確認する必要があります。

僕の場合 hw.psm.synaptics_support のときは event0 だったのに hw.psm.elantech_support にしたら event3 になりました。そしてトラックポイントは event4 になりました。

 
『hw.psm.synaptics_support=1 を設定しましょう。』と書かれているサイトはよく見るのですが『hw.psm.elantech_support=1 を設定しましょう。』ってのは、まだあまり見かけないので、今回のエントリーを書いてみました。
タッチパットが思ったとおりの動作をしない場合は hw.psm.synaptics_support ではなく hw.psm.elantech_support を指定してトライしてみてはいかがでしょうか。

 
ちなみにですが hw.psm.elantech_support を利用したら KDE システム設定のメニューにも正しく表示されるようになりました。

 
デバイス的には ETPS/2 Elantech Touchpad として認識されました。 ET な PS/2 なマウスって感じ? (なにそれ? f(^^;;)

xorg.conf で設定している値がそのまま KDE の設定画面から調整できるのが良いですよねぇ。これも Wayland の恩恵かなぁ;-)。

7月 152020
 

さてと。前回のエントリは ThinkPad X13 の AMD 版が納品されて、簡単なファースト・インプレッションを行いました。
僕はそもそも NotePC で Windows10 を利用することはあまりないので、ベンチマークとか全然できないのであります。なので、詳細な検証などはまるで皆無。参考にならない記事ですなf(^^;;。

と、いうことで、今回は出たばかりの最新鋭の NotePC に FreeBSD をインストールしてみます。色々と問題点があるのだろうなぁ。とは思うのでありますが、れっつとらい。

 
1. FreeBSD のインストール準備
今回チョイスした FreeBSD のバージョンは FreeBSD/amd64 12.1-RELEASE と、いうリリースされている標準的なバージョンです。このバージョンが、最新鋭の NotePC にインストールしてどこまで動作するのか確認してみたいと思います。

インストールの作業手順は以下のとおりです。

0).Windows10 の回復 USB の作成
1).Windows10 のパーティションの縮小
2).FreeBSD 用 UEF パーティションの確保
3).FreeBSD のインストール
4).bcdedit でブートメニューの登録

このうちのほとんどの作業は以前「ThinkPad E145 を UEFI ブートに変えてみた。」といえエントリに書いているのでサクっと省略します。実際に僕もこの手順で問題なくインストールできましたので、そちらを参考にして頂ければと思います。

ただ、今回は最新鋭の NotePC で、今まで利用していた ThinkPad e145 と比べて最新技術が導入されています。

気を付けたのは以下の点。

  • BitLocker が default で導入されている
  • UEFI (BIOS) の設定画面で「レガシー BIOS」(CSM のことですね) がどうも見当たらない

この二つをなんとか回避する必要があります。

 
2. BitLocker の解除
「コントロールパネル」から「BitLocker ドライブ暗号化」メニューを覗いても無効にはできませんでした。ただし、この画面から BitLocker のキーを取得しておきましょう。
BitLocker を解除するのは「設定」アプリの [更新とセキュリティ] の中にあります。ここからまず、 BitLocker を無効にします。

最初から入っている OS 以外をインストールするとき EFI セットアップメニュー (BIOS 画面) で「セキュアブート」を無効にする必要があるのですが、 BitLocker を有効にしたままセキュアブートをオフにすると青い画面が現れて何やらキーを入力するように要求されてしまい『むむむ。』などと思ってしまうのであります。

と、いうことで、新しい OS をインストールするためには、

・BitLocker を無効にする
・セキュアブートをオフにする

以上の二つが必要です。

 
3.「レガシー BIOS」の設定画面が見当たらない
もしかしたら EFI セットアップメニュー内にあるのかもしれません。が、しかし、僕は見つけられませんでした。と、いうか、もう FreeBSDの インストール時には「レガシー BIOS」の設定の有無は不要です。

ThinkPad e145 を UEFI で利用する設定を投入したときに FreeBSD のインストール用 USB メモリを Rufus で作成した。と、書いています。 Rufus で FreeBSD のブート USB イメージを作成するときは MBR で起動する USB ブートイメージしか作れない。と、書いているのですが、実は FreeBSD の 12.1-RELEASE のインストールイメージは UEFI+GPT に対応しているんですね。

Rufus を利用して UEFI 対応の FreeBSD の USB ブートイメージを作成する場合 ALT+E を押すことにより BIOS+MBR にするか UEFI+GPT にするか選択できます。

なので、「レガシー BIOS」 をオンにせずとも UEFI モードのままで FreeBSD をインストールすることができるのであります。

 
4.FreeBSDのインストール
EFI セットアップメニューで変更するのは セキュアブート “オフ” のみで FreeBSD のインストールが可能になりました。

と、いうことで、あとは FreeBSD をインストールするのみです。途中パーティションの設定の所では、 [Auto] を設定すると、SSD の全領域を対象としてしまうので、ここは [Manual] で、必要な領域を確保するようにします。

インストールが完了したあとは Windows10 が起動するので bcdedit で Firmware Windows Boot Manager に FreeBSD がブートするように登録してあげてインストール作業は終了です。

 
5.いよいよ FreeBSD の起動。しかし NIC は?
まず、必要なのにデバイス的に動かないもの。あ、今回は一発目のインストールなので 12.1-RELEASE になります。あまりにも動かないようであれば CURRENT に移行するか。などと思っていますが。

  • WiFi6 AX200
  • Ryzen7 Radeon Vega10

この二つは結構痛い・・。orz
順番に話して行きます。

そもそも pciconf -lv すると none のデバイスが 8 個もあります。orz

pciconf -lvの結果

vmm.ko を kldload するとか、仮想 OS 用のブリッジ・RealTek のデバイス・AMD のマルチメディア系デバイスなどが認識していません。

 
Intel の WiFi6 対応の AX200 は 調べてみたところ OpenBSD のほうでは if_ixw と、いうドライバが書かれているみたいですが、 FreeBSD はまだ未対応のようです。 if_iwm.ko でも動作しません。

ThinkPad X13 の内臓 re0 を利用するためのアダプタを購入してないので USB WiFi や USB NIC を利用しようと思いましたが・・。それにしても最近の FeeeBSD の USB NIC はボロボロですな・・。RealTek の WiFi NIC ドライバ if_urtw.ko は 802.11a 対応したチップをマージしたら速度が全く出ないし、 if_axge.ko は ue0 の 1Gbps で接続する JR45 の NIC なのに、こいつは ping の損失率は 60% 前後。もう、悲惨というほかない・・。

ショーがないので WiFi の場合は if_run.ko を利用し RJ45 NIC の場合は if_axe.ko を利用する。と、いう状態・・。orz

 
6.Xorg 動く?
Ryzen7 Radeon Vega10 はディスプレイ用のチップですが ports から graphics/drm-fbsd12.0-kmod/ をインストールして

kld_list="/boot/modules/amdgpu.ko "/boot/modules/radeonkms.ko"

 

を書いても認識されませんでした。

/dev/dri/Card0 が生成されないので OS 的にも認識されていません。

まぁ、この際 amdgpu.ko をきっぱりと諦めて vesa ドライバで Xorg が起動してみようと試みるもダメ・・。あらまぁ。

[ 71220.842] (II) VESA(0): initializing int10
[ 71220.843] (EE) VESA(0): V_BIOS address 0x0 out of range
[ 71220.843] (II) UnloadModule: "vesa"
[ 71220.843] (II) UnloadSubModule: "int10"
[ 71220.843] (II) Unloading int10
[ 71220.843] (II) UnloadSubModule: "vbe"
[ 71220.843] (II) Unloading vbe
[ 71220.843] (EE) Screen(s) found, but none have a usable configuration.
[ 71220.843] (EE) 
Fatal server error:
[ 71220.843] (EE) no screens found(EE) 
[ 71220.843] (EE) 
Please consult the The X.Org Foundation support 
         at http://wiki.x.org
 for help. 
[ 71220.843] (EE) Please also check the log file at "/var/log/Xorg.0.log" for additional information.
[ 71220.843] (EE) 
[ 71220.844] (EE) Server terminated with error (1). Closing log file.

 
vesa ドライバを利用した場合はこんな感じのログが出力されます。

それなら最後の手段だ。と、いうことで scfb で試してみたところ、一応 Xorg の画面は現れました。が、 xrandr で対応する画面サイズを確認してみると・・。

# xrandr 
xrandr: Failed to get size of gamma for output default
Screen 0: minimum 640 x 480, current 640 x 480, maximum 640 x 480
default connected 640x480+0+0 0mm x 0mm
   640x480        0.00* 

 
orz。

しかし、scfs ドライバというのは UEFI と密接に関連いているようですね。 xorg.conf でディスプレイサイズを変更するのではなく UEFI 用のコマンドが用意されていて、 OS 起動時の画面サイズを調整してから、そのサイズを scfb ドライバが読み取って画面サイズが決定されるようです。

FreeBSD の起動時に OS ブートのメニューが表示されますが、そこで 3 を 押して OK プロンプトを出します。

表示された OK プロンプトで gop コマンドを打ちます。 GOP とは Graphics Output Protocol のことらしいです。オプションは list (選択枝の表示) get (現在の設定情報の取得) set (新しい設定を指定) の三つ。

OK プロンプトから gop list と打つとディスプレイが対応しているサイズの一覧が表示されます。そこて gop set 0 などと打ち、使いたいサイズの番号を打ちます。

すると、コンソールが中央付近に小さくなって表示されます。そこの OK プロンプトで boot と打つと指定した画面の大きさで FreeBSD がブートします。くれぐれも reboot とは打たないように;-)。
OS の起動後にすかさず startx と叩くと、さっきまで 640×480 でしか表示してくれなかった scfb ドライバが大画面で表示できるようになります。

ちなみに ThinkPad X13 AMD は色々なサイズがあったのですが、実質的に 640×480 か 1920×1080 の二つのサイズしか表示できませんでした。

なお、 /boot/loader.rc に gop set で指定したモードの番号を記載することにより毎回 OK プロンプトで設定する必要がなくなるらしいのですが、それはちょっとバグがあるみたいで正しく動作しないようです。
では、どうするか? と、いうと /boot/loader.conf に exec=”gop set 0″ と、コマンドイメージそのままを書くと良いです。

これで Xorg が無事に起動したので、ずいぶんと利便性がアップしました;-)。いやぁ。良かった。
あと、 NotePC のスペックが非常に高いので scfb ドライバでもその遅さがあまり気になりません。これは非常にラッキーです;-)。

 
7.Suspend/Resume するの?
以前、今回の ThinkPad X13 AMD を購入する前に FreeBSD の偉い人が既に ThinkPad X1 を持っていたのでその人に「Suspend/Resume します?」って、聞いたら「興味ない。」と、つれない返事。あらま。

では、ThinkPad X13 AMD が届いてから確認すれば良いやぁ。などと思ったのですが、今回はその検証を。

 
まず、何はなくとも zzz と打ってみると、一応は寝てくれました。しかし、電源を投入すると、 OS が起動して来て fsck が走ります。あらら・・。

試しに以下のコマンドを打ってみます。

# sysctl hw.acpi.supported_sleep_state
hw.acpi.supported_sleep_state: S4 S5

 
うひょー。 S3 ステートがないじゃーーん。 orz
なるほど。これが原因で「興味ない。」と、コメントが返ってきたんだな。と、一人で納得。

本当に S3 ステートが無いのか? とウェブで探し回ったことろ、以下の URL にぶち当たりました。

Lenovo ThinkPad X1 Carbon (Gen 6)

最近の ThinkPad には BIOS レベルで S3 ステートがなく、かわりに s0i3 スリープというのがあるらしい。では s0i3 スリープとはなんぞや? と、思い調べてみると Windows10 もしくは Microsoft 『モダンスタンバイ』というモノらしく OS べったりなスリープモードらしいです。

これを FreeBSD 側、上記 URL では『Linux 側』で利用するには ACPI の DSDT を書き換える必要がります。まぁ、過去に何回か書き換えたことがあるのでどーにかなるだろう。などと思いつつも EFI セットアップメニューを眺めていたらなんとっ!!

ThinkPad X13 AMD はスリープステートを EFI セットアップメニューから切り替えられるようになっておりました。

[Windows 10] にすると「モダンスタンバイ」 になって [Linux] にすると今までどおり S3 ステートになります。 [Linux] に変更したあとに上記 hw.acpi.supported_sleep_state を確認すると S3 S4 S5 と、 S3 が生えてまいりました;-)。

 
と、いうことで準備が整ったので再度 zzz と打ちます。 Suspend は割と素直に寝てくれます。フタを閉じて再度開けると、画面はブラックアウトです。しかし、 USB WiFi がピカピカ光っているのでカーネル自体は起き上がったようです。

しばらく待って ping の疎通確認したら目覚めていました。 ssh したらログインできました。無事に Suspend/Resume 自体は動作しているようですが、画面は真っ暗なまま。まぁ、まだ Xorg 動き始めたばかりなのでなんとも言えないですが、 コンソール周りの vt や Xorg 次第で画面が復活するかな?などと安直に思っています。

ちなみに、相変わらず acpi_video.ko はまともに動作せず sysctl の hw.acpi.reset_video mib を 1 にするとカーネルが凍りつくのは ThinkPad e145 と一緒ですね。

 
8.その他
画面の明るさ変更についてですが、上にも書いた通り acpi_video.ko がまともに動かないので sysctl の hw.acpi.video.lcd0.brightness mib などが使い物になりません。

これまた、画面の明るさについては Xorg が動いたら本格的にいじっていきたいです。

 
あと、まださわりだけですが、イヤホンジャックから音が出ません。 /dev/sendstat 見ると色々デバイスはあるみたいですが sysctl hw.snd.default_unit で切り替えてもヘッドホン端子にさしたイヤホンで音が出ていません。

pciconf -lv で AMD マルチメディアチップが none8 になっていたのでその辺りが影響しているのかな?

 
9.で、結局?
しかし、普段から NotePC で FreeBSD を利用しているので Windows10 では PC のスペックに対してその速さをあまり体験できなかったのですが FreeBSD をブートするとその性能が体感できますね。起動がむちゃくちゃ速い。 KDE5 も sddm からログインしたらサクっとデスクトップが表示されるし、 Firefox の起動もむちゃくちゃ速い。『いやぁー。速い NotePC は中々良いねぇ。』と、なるのであります;-)。

そして、ですが FreeBSD/amd 12.1-RELEASE では結局、以下が動きませんでした。

  • WiFi の AX200 が動作しない
  • Radeon Vega10 が amdgpu.ko で認識しない
  • S3 ステートは利用可能だが Suspend して Resume 後は画面がブラックアウト
  • 画面の明るさは変更できない
  • 音声出力がイヤホンジャックに切り替えられない

こんな感じでしょうか。Radeon Vega10 が graphics/drm-devel-kmod/ な ports で動作するのか確認したいところではありますが、そーすると OS 自体を CURRENT に上げる必要があります。

上記の状態を鑑みると CURRENT を試してみる価値ば十分にあるのかなぁ? などと、思っている次第ではあります・・。

が、このネタ、もう一回続くかも。

10月 282019
 

以前書いた「FreeBSD で if_urtwm を使ってみる。」と、いうエントリの置き換えです。当時は 11.0-RELEASE で RealTek のチップセットが組み込まれている 802.11a な USB Wi-Fi 子機を利用するためにドライバ(カーネルモジュール)をインストールして、利用する。と、いうものだったのですが 12.0-RELEASE になって RealTek の Wi-Fi チップは rtwn というデバイスに統合されました。 PCI 接続のものも USB 接続のものもどっちも rtwn.ko になりました。

なので、以前の記事はもう古くなっているので、新しく更新します。

 
と、いうことで FreeBSD 12.0-RELEASE 以降で RealTek のチップを利用している USB な Wi-Fi 子機を利用する方法を記載します。

まず、何はなくともカーネルモジュールをロードします。以下が /boot/loader.conf に書く内容ですね。

legal.realtek.license_ack="1"
firmware_load="YES"
if_rtwn_load="YES"
if_rtwn_usb="YES"
rtwn-rtl8188eufw_load="YES"
rtwn-rtl8192cfwE_B_load="YES"
rtwn-rtl8192cfwE_load="YES"
rtwn-rtl8192cfwT_load="YES"
rtwn-rtl8192cfwU_load="YES"
rtwn-rtl8192eufw_load="YES"
rtwn-rtl8812aufw_load="YES"
rtwn-rtl8821aufw_load="YES"

 
wlan_* の設定は省略しています。 if_rtwn.ko は本体で、それとは別な if_rtwn_usb.ko は USB な Wi-Fi 子機用のカーネルモジュールもロードし(自動的にロードされ)ます。 PCI 接続のデバイス用にもカーネルモジュールは用意されていますが、今回は割愛します。

rtl81* なファームウェアは 802.11 b/n/g 用のチップで、今まで urtwn で利用されていたヤツですね。でもって rtl88* は 802.11a/ac 用のチップで、これが使えるようになったのが一番大きい変更点です。僕も FreeBSD で 802.11a を利用したくて以前のエントリを書いたくらいですからねぇ。

 
で、使える USB な Wi-Fi 子機ですが、古い b/g/n 用の、以前 urtwn.ko で利用していたヤツはサクっと利用可能です。なので、今回は詳細について記載しません。
ただし、遅いです。 google のスピードテストのサイトにアクセスしても 10Mbps 前後の速度です。以前の urtwn.ko のほうが速度は出たんではないかなぁ・・。

 
さてと。問題は、今回のメインの話になる 802.11a についてですが、現在、僕の知る限り(製品など)、以下の三種類のチップがあるようです。

  • RTL8811AU : USB2.0 ベースで 802.11a/ac にアクセスできるチップ
  • RTL8812AU : USB3.0 ベースで 802.11a/ac にアクセスできるチップ
  • RTL8821AU : USB3.0 ベースで 802.11a/ac にアクセスできるチップ

FreeBSD の ソースを見れば解りますが src/sys/dev/rtwn/ には rtl8812a/ と rtl8821a/ しかないので、一番上のチップを利用している USB Wi-Fi 子機は動作しません。

RTL8811AU なチップを利用している USB 子機で、僕が持っているのは以下の二種類です。

一個は「二個目の if_urtwm を試す。」というエントリで書いています。

そして、もう一個、新しいのを買ってみました。 TP-LINK の AC600 と言うヤツです。

しかし、こいつも見事に RTL8811AU だったので FreeBSD では利用できませんでした・・。orz

これらを src/sys/dev/usb/usbdevs や、番号がちょっと違うだけの src/dev/rtwn/usb/rtwn_usb_attach.h にエントリを書いても以下のログが出て動作しませんでした。

kernel: ugen0.2:  at usbus0
kernel: rtwn0 on uhub1
kernel: rtwn0:  on usbus0
kernel: rtwn0: MAC/BB RTL8812AU, RF 6052 2T2R
kernel: wlan0: Ethernet address: 81:3f:5d:28:3a:bb
wpa_supplicant[1676]: Successfully initialized wpa_supplicant
wpa_supplicant[1678]: wlan0: Trying to associate with 1a:68:82:43:0a:99 (SSID='80211N-AP' freq=2412 MHz)
wpa_supplicant[1678]: Failed to add supported operating classes IE
wpa_supplicant[1678]: ioctl[SIOCS80211, op=21, val=0, arg_len=42]: No such file or directory
wpa_supplicant[1678]: wlan0: Association request to the driver failed
wpa_supplicant[1678]: wlan0: Authentication with 1a:68:82:43:0a:99 timed out.
wpa_supplicant[1678]: wlan0: CTRL-EVENT-DISCONNECTED bssid=1a:68:82:43:0a:99 reason=3 locally_generated=1

 
Mac アドレスが付加されず ff:ff:ff:ff:ff:ff になってしまうので、やはり RTL8812AU なドライバのソースコードでは代用できない。と、いうことですねぇ。ifconfig wlan0 scan も動作しません。

となると、手持ちの RTL8812AU なチップを利用した USB Wi-Fi 子機に全てをかけることになります。

 
以前、このブログで一回掲載しているヤツで、やたらと大きい USB Wi-Fi 子機です。 amazon.co.jp で探しても RTL88* なチップ利用している USB 子機はアンテナが出ていたりやたらと大きかったりして邪魔になるものが多いですね。

では、この USB Wi-Fi 子機利用時の設定を見ていきます。が、その前に usbdevs や rtwn_usb_attach.h にエントリを作成し、カーネルモジュールを make し直す必要があります。

 
o. src/sys/dev/usb/usbdevs に追加

product REALTEK RTL8812AU       0x8812  RTL8812AU Wireless Adapter

 

 
o. src/dev/rtwn/usb/rtwn_usb_attach.h に追加

        RTWN_RTL8812AU_DEV(REALTEK,             RTL8812AU),

 
これで sys/modules/rtwn_usb/ で make && make install します。 /boot/modules/ にインストールされるので好みで /boot/kernel/ に移してください。

そして、次に設定。

 
o. /etc/rc.conf

wlans_rtwn0="wlan0"
ifconfig_wlan0="WPA DHCP country JP ssid 80211A-AP mode 11a"

 

 
o. /etc/wpa_supplicant.conf

# パスワードが必要な Wi-Fi (802.11a)
network={
        ssid="80211A-AP"
        scan_ssid=1
        key_mgmt=WPA-PSK
        proto=RSN WPA
        psk="PASSWORD"
}

# パスワードが必要な Wi-Fi (802.11n)
network={
        ssid="80211N-AP"
        scan_ssid=1
        key_mgmt=WPA-PSK
        proto=RSN WPA
        psk="PASSWORD"
}

# パスワードが不要なフリー Wi-Fi (802.11n)
network={
        ssid="80211N-AP_FREE"
        scan_ssid=0
        key_mgmt=NONE
        proto=RSN WPA
}

 
この設定で、フツーなら接続できるはずなんですけどねぇ・・。公開している (ifconfig wlan0 scan で表示される) 802.11a な AP には接続できます。ステルスモードの 802.11a な AP には接続できませんでした。 scan_ssid=1 を指定しているのにね。

『/etc/wpa_supplicant.conf の書き方、悪いんじゃね?』とか思う方がいるかと思われますが 802.11n なステルスモードの AP には接続できます。 SSID のみを書き換えているだけなのに 802.11n は接続できて、802.11a には接続できません。
そして、 802.11a でもステルスモードを off にして SSID を公開している AP には接続ができて、かつ、通信もできます。
ステルスモードの 802.11a に接続できないのは、ドライバ (rtwn.ko) ・ wpa_supplicant ・ ifconfig のどこに問題があるのか、まるで見当がつかないのでソースコードさえ追ってないです・・。

wpa_supplicant で、何か特別なオプションが必要なのかな?

FreeBSD で 802.11a の ステルスモードの AP に接続できている人ってどなたかいますか?

 
さてと。ここから先は無事に接続できた SSID 公開モードの 802.11a な AP に接続した状態で、通信試験をしてみた結果です。

google のスピートテストで確認してみましたが・・。

これまた遅い・・。orz

RTL81* シリーズで 802.11n な AP に接続した状態と対して変わらないか、色眼鏡で見て +2Mbps 程度、つまりは、いーとこ 10Mbps 程度の速度しか出ません・・。
非力な CPU や firefox が重いなどの点を抜きにしても遅すぎます。常用にはほぼ向かない雰囲気です・・。orz

これじゃ 802.11a にする意味ねー・・。orz まぁ、電子レンジ対策にはなりそうですが。

ちなみに今回試した 802.11a な AP は iPhone8 でアクセスすると 70Mbps 程度、 FreeBSD に接続していた同じ USB Wi-Fi 子機を Windows10 に接続して試験すると 50Mbps 程度は出ているので AP や USB 子機の問題は無いはずです。つまりは FreeBSD の rtwn.ko ドライバは『利用できるよ。』ってだけで、速度は全然出ていない。と、いうことになりそうです・・。

 
Intel の CPU を積んでいない NotePC にとって 802.11a に接続できる唯一の rtwn.ko だったのですが、これでは利用するに値しません・・。きちんと動作して、サクっと 802.11n に接続する if_run.ko のほうが圧倒的に性能良いです。

 
では、 FreeBSD で 802.11a な AP に接続するには他にどんな手段があるのか考えてみました。
そして、ふと、思いました。 Wi-Fi 中継機を RJ45 な NIC に接続して、そこから 802.11a に接続するのが良いんじゃね? みたいな。

僕のは手元には ELECOM の WRH-583GN2-S があるのですが、これは超小型の Wi-Fi AP です。ウェブ UI から設定を変更することにより Wi-Fi の中継機にもなります。
価格も 802.11a/ac 対応の USB Wi-Fi 子機を買うのと遜色ありませんでした。大体 2,000yen くらいで買った記憶が・・。今はもう既に販売終了のようですね。

このてのちっこいヤツは、利用時の電源は USB から供給できるので、通信時には FreeBSD の re0 に接続して WRH-583GN2-S が Wi-Fi の中継機として動作し 802.11a の AP に接続して利用すれば望み通り無線環境で 802.11a が利用可能になります;-)。

これが最後の手段かなぁ・・。

 
今回は FreeBSD 12.0-RELEASE で登場した rtwn.ko の 802.11a について、以前のエントリを書き換えるために書いてみました。結果はそこはかとなく悲しい状態だったのでありました・・。 orz

このエントリを読み終えた方。慌てて RTL8812AU や RTL8821AU に対応した USB Wi-Fi 子機を買う必要は、今の所、全くありません。たとえ FreeBSD で認識して、利用可能な状態になったとしても、遅すぎてお話になりません。ヒトバシラーは僕だけで十分です・・ (g_g)。

さて。それでも rtwn.ko を使うか使わないかはあなた次第っ!!??

 

 
って、FreeBSD のバージョンが上がったら、もう一回エントリ書くことになるのかなぁ?

3月 292018
 

以前のエントリで「FreeBSD で if_urtwm を使ってみる。」と、いうエントリを書いているのですが、今回はそれの続編です。と、いうか、僕は USB の Wi-Fi ドングルが好きなようで、今までにもこのブログでは何回か書きました。

最近は REALTEK の USB Wi-Fi ドングルは 802.11a の 5GHz 帯に対応しているものが多いので FreeBSD でもその恩恵にさずかりたいものだ。などと思っているのですけども。

 
前回の USB 接続機器はずいぶんと大きかったのですが、今回は手頃なサイズの USB 機器です。まずは写真を。

でもってこっちがパッケージ。僕の場合 Windows10 で動作確認する前にまずは FreeBSD に接続して確認するのですが、ご多分にもれず、今回も素直に ugen に落ちました(^^;;。

パッケージやドライバ DC の印刷を見てみると REALTEK の RTL8811AU というチップが使われているようです。

で、以前掲載した GitHub を見に行くと・・。おやまぁ。カーネルモジュールのは FreeBSD 12-CURRENT に対応した patch になっているようです。で、ちょっと違ったところを見に行くと、おぉ。 FreeBSD 本体に commit されたのかしら? 新しく rtwn_usb というカーネルモジュールになるようですねぇ。
もう少し待てば、自分でコンパイルせずとも、 OS 標準で利用できるようになるのかもしれません。

 
さてと。今回購入した USB Wi-Fi ドングルですが、仕様としては REALTEK RTL8811AU ですが、 if_urtwm.ko は RTL8821AU 対応です。大丈夫か? などと思い試しましたが、すんなりと動きました。

まぁ、当然の作業として if_urtwm.c にはエントリを記述して、 usbdevs にも product ID を登録する必要があるんですが。

o. if_urtwm.c に記述する行

        URTWM_DEV(REALTEK,      RTL8811AU),

 
o. usbdevs に記述する行

product REALTEK RTL8811AU       0xa811  RTL8811AU

 
これで利用可能になりました。

 
以前のエントリで試した AUKEY の AC1200 というのは USB3.0 接続でチップセットが RTL8812AU でしたが、今回のは USB2.0 で RTL8811AU なので、もしかしたら一個古いチップで USB2.0 対応なのかもしれません。

 
電波が外にもれない(と思われる)部屋で動作確認をしたところ、200MB のファイルを転送してみると 50Mbps 程度でいたので、ずいぶんと速度が速い USB WiFi で、それが FreeBSD で体験できることにある意味感動を覚えました;-)。

 
あ。FreeBSD で 802.11a を利用する場合 /etc/rc.conf のネットワークの設定のところにおまじないを書かないと動作しないようです。

o. /etc/rc.conf の記述例

wlans_urtwm0="wlan0"
ifconfig_wlan0="WPA DHCP ssid AP802-5 mode 11a country J5"
#ifconfig_wlan0="WPA inet 192.168.1.100 netmask 255.255.255.0 ssid AP802-5 mode 11a country J5"

 
上記の設定は SSID: AP802-5 という 802/11a (もしくは 802.11ac) の AP に接続するときの設定ですが、どこの国で接続するか指定してあげないと正しく動作しないようです。おかげでサクサクと動作しているー;-)。

今後は安定的に動作していることを確認して行きたいとは思うのですが、こってりと利用するのはちょっとはばかれるので、動作確認のみ。と、したいと思います。

9月 102017
 

Amazon で USB Wi-Fi の子機が安く売っているのを発見し、購入しました。 AUKEY の AC1200 というヤツです。似たようなのを出しているメーカ名は色々あって Wavlink だとか、型番が WF-R6 というものだったりします。きっと OEM なんでしょうね。フツーの価格が 2,980yen で、クーポン利用で 999yen だったのでラッキーです。もう一個買おうかなぁ。

届いたのはこんな感じ。壁掛けパッケージです。そして、実物はこんな感じ。ずいぶんと大きいです。

USB の子機は 802.11 b/g/n/a/ac に対応しています。僕が購入した USB Wi-Fi 子機では初めての a (5GHz 帯) 対応です(僕は ac な AP は持ってない)。親機にもなれるようですが WindowsOS の場合はユーティリティをインストールしないとダメなようです。なので、自分的には子機専用で使う予定です。

利用しているチップは REALTEK の RTL8812AU というモノらしいです。 Windows10 Creators Update ではドライバなしでサクっと認識され 5GHz 帯のアクセスポイントにすんなり接続できました。
Cisco の EAP などに接続するためにはメーカサイトからドライバをダウンロードする必要があります。
ドライバはこの辺りのが使えるかな。 WN688A2–CD_WLAN_V6.85 のドライバをダウンロードすると良い感じです。

WindowsOS で 801.11a で接続して速度の検証してみたところ 802.11n の FreeBSD で言うところの if_run (Ralink のチップ) の機器の倍以上の 100Mbps 程度で通信することを確認しました。

 
さてと。これが FreeBSD で動作するのか、早速試してみました。

REALTEK の RTL8812AU は FreeBSD では対応していないようでドライバがありません。 REALTEK チップのカーネルモジュールとしては if_urtwn.ko がありますが、これでは動作しません。
で、ウェブで調べていると GitHub にカーネルモジュールがあったので、今回はそれを試してみました。

GitHub から urtwm-master.zip をダウンロードして適当なディレクトリに展開します。そしてその中にあるパッチを適用します。 usbdevs に適用するパッチになります。あとは、同梱の README.md を読んでその通りにやるとコンパイルが通り、インストールも無事に完了です。

インストール後は /boot/modules/ に urtwm-rtl8812aufw.ko urtwm-rtl8821aufw.ko if_urtwm.ko が配置されます。そして、それらを kldload すると利用可能な状態となります。
僕は普段から if_urtwn.ko を利用しているので、以下の設定が /boot/loader.conf に書いてあります。今回も必要かもしれません。

legal.realtek.license_ack="1"

 
さてと。カーネルモジュールのコンパイル時のとこをはしょりすぎているのでちょっと書きますが GitHub からダウンロードしたソースコードは 11.0-RELEASE 以降のカーネルソースが必要になります。

僕は FreeBSD/amd64 では環境が整わず FreeBSD/i386 と FreeBSD/arm で検証しました。

それにしても FreeBSD の 10 系 RELEASE と 11 系 RELEASE では USB 周りのソースの配置がガラっと変わりましたね。 10 系までは /usr/src/sys/dev/usb/wlan/ などにモジュールのソースがあったのに 11 系では /usr/src/sys/dev/ 配置されるようになりました。他にもカーネルのコードが変わっているので 10 系 RELEASE では if_urtwm はコンパイルできません。是非とも 11 系 RELEASE を用意しましょう。

 
と、いうことで if_urtwm* のコンパイルが通ったので使ってみることにします。一番最初に試したのはなんと Raspberry Pi 2 Model B の FreeBSD 11.0-RELEASE-p1 です。 USB Wi-Fi の子機は USB3 に対応しているのですが Ras Pi2 は USB2 にしか対応していないので性能が出ないんですが・・f(^^;;。

ザクっと USB ポートにさしてみると ugen に落ちて認識しません。あらら。僕が購入した AUKEY の AC1200 の情報を usbdevs に書いてあげる必要があります。

と、いうことで以下の行を /usr/src/sys/dev/usb/usbdevs に記述してあげます。 VendorID は既に登録済みだったので ProductID のみ記載します。

product REALTEK RTL8812AU      0x8812  RTL8812AU

 
あと、ソースコード中にも記載してあげる必要があります。 urtwm-master/sys/dev/urtwm/if_urtwm.c に対して以下のパッチを適用します。

--- sys/dev/urtwm/if_urtwm.c.orig       2017-09-07 18:59:06.031051000 +0900
+++ sys/dev/urtwm/if_urtwm.c    2017-09-06 20:51:41.749003000 +0900
@@ -128,6 +128,7 @@
        URTWM_RTL8812A_DEV(SENAO,               EUB1200AC),
        URTWM_RTL8812A_DEV(SITECOMEU,           WLA7100),
        URTWM_RTL8812A_DEV(TRENDNET,            TEW805UB),
+       URTWM_RTL8812A_DEV(REALTEK,             RTL8812AU),
        URTWM_RTL8812A_DEV(ZYXEL,               NWD6605),
        URTWM_DEV(DLINK,        DWA171A1),
        URTWM_DEV(DLINK,        DWA172A1),

 
これで、再度コンパイルしてインストールします。今回購入した USB Wi-Fi 子機は REALTEK の RTL8812AU というデバイスとして認識されるようになります。

kernel: urtwm0 on uhub0
kernel: urtwm0:  on usbus4
kernel: urtwm0: MAC/BB RTL8812AU, RF 6052 2T2R

 
で、 FreeBSD/arm 11.0-RELEASE-p1 と FreeBSD/i386 11.1-RELEASE-p1 で試してみましたが、残念ながら 802.11a では接続できませんでした・・。orz

ただし、 802.11n では動作しました。こちらのほうはかなりの速さで、一応 30Mbps くらい出ました。 USB 子機が大きくてアンテナがちゃんとしているからでしょうかね。
WindowsOS では 802.11a で利用できるのですが、残念ながら FreeBSD では 802.11n だったですが、速度が出るのでヨシとしておくかぁ。と、いう感じでしょうか。 NotePC には大きくて常用は厳しいですが Ras Pi2 には良いかもしれんです。

USB3 へ接続すると 802.11a で通信できるのかなぁ? 今回はその環境がありませんでした。

あ。 /etc/wpa_supplicant.conf とか /etc/rc.conf の記述方法は今回ここでは書きませんが、大丈夫ですよね?

 
自宅の ThinkPade145 は USB3 が動作するのですが、この NotePC はカーネルのみが 10.1-RELEASE のままなので今回のカーネルモジュールはコンパイルできません。 syspend/resume を取るか、最新の FreeBSD を取るか悩ましいところではありますが、僕の場合は suspend/resume のほうが重要。なのでバージョンアップはしていません。

 
と、いうことで GitHub から拾ってきた if_urtwm のカーネルモジュールですが、一応は動いている。ということになります。if_run も if_rum も if_urtwn も、今までは 802.11n 対応だったので今回 FreeBSD で初めての 802.11a のドライバ。と、いうことになるかと思われます (僕の試した環境では接続できなかったけど・・)。

if_urtwm はどんなデバイスがあるのか? というのは上のパッチを適用したソースコードである sys/dev/urtwm/if_urtwm.c の中に書いてあるので、試してみたい方は一回覗いてみると良いかも知れません;-)。

3月 012015
 

最近はほとんどの NotePC にカメラが付いていて Windows とかだと Skype しよう。 Mac だと FaceTime しよう。などと言っていますが、普段はほとんど使わない(と、僕は思う)んだけど、実際にはどうなんでしょうか?

そんな感じの標準装備のカメラですが OS に FreeBSD を利用していた場合にどのような目的でどう使う? ってか、その前に「ここに付いているカメラは FreeBSD で動くの?」などと思ってしまうのですが、今回は実際に NotePC に付いているカメラを FreeBSD で利用してみるとこにしましょう。

 
今回登場する NotePC は僕の持っている ThinkPad Edge e145 です。このブログには何回か登場しているのですが FreeBSD がバリバリ動作しています;-)。この ThinkPad Edge e145 も最近の NotePC のトレンドを追いかけているようで、ディスプレーの上にカメラが付いています。

今回はこのカメラを利用して色々やってみたいと思います。もしかしたら、ネタ的にはもう既に枯れているかも・・f(^^;;。

 
1). カメラを認識させる
最近の NotePC に付属のカメラはほとんどが USB に接続されているようですね。 pciconf -lv とか usbconfig list コマンドを叩き、デバイス的に、どこにカメラが接続されているか確認しましょう。

 # usbconfig list
    :
ugen4.2: <Integrated Camera Vimicro corp.> at usbus4, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=ON (256mA)
    :

 
ThinkPad Edge e145 の場合は USB の ugen4.2 として認識されているようですね。と、いうことでこいつを正しいデバイスとして認識させてみましょう。

 
2). デバイスドライバのインストール
FreeBSD の純正デバイスドライバというのは存在してないのですが、 Linux 方面で開発されたキャラクタデバイスを読み込むドライバを FreeBSD に対応させた Cuse4BSD を利用します。 ports 的には multimedia/cuse4bsd-kmod になります。
まず、これをインストールし、続いてキャラクタデバイスをビデオデバイスとして認識させる webcamd をインストールします。 ports 的には multimedia/webcamd になります。まぁ、 webcamd を make install すると関連性で cuse4bsd-kmod もインストールされますが;-)。

そして multimedia/cuse4bsd-kmod を make install したときにインストールされた cuse4bsd.ko を kldload します。

# kldload /boot/modules/cuse4bsd.ko

 
カーネルモジュールをロードしたあとに wbecamd を起動し /dev/video0 として USB カメラを認識させます。オプションに USB 接続のカメラの USB のデバイス名を指定します。

# webcamd -d ugen4.2
Attached to ugen4.2[0]
Creating /dev/video0
^Z
中断
# bg
# ls -l /dev/video0
crw-rw---  1 webcamd  webcamd  0x82 Feb 28 26:14 /dev/video0
# chmod 666 /dev/video0

 
webcamd を起動すると正しく動作する USB カメラであれば /dev/video0 が生えてきます。
その後、一旦バックグラウンドにほーり投げてパーミッションを確認します。今回は一般ユーザでも利用したいので 666 に変更しています。デバイス生成時にバーミッションを変更したい場合には /etc/devd.conf におまじないを書いてください。ここでは割愛します;-)。

以上で準備は完了です。

 
3). まずはローカルでカメラを利用してみる
/dev/video0 が生えてきたので、実際にカメラに写るモノを表示させてみたいですね。そんな時は pwcview を利用します。 ports 的には multimedia/pwcview になります。
こいつを make install したあとに特にオプションも付けずに起動すると X11 上にウィンドが現れてカメラから映る景色が表示されると思います。

しかし、ローカルな FreeBSD の X11 の画面にカメラから映る景色が表示されても「だから何?」で終わってしまいますよねf(^^;;。
僕自身もまさしくそのとおりでして。ただ単に「あ。 cuse4bsd.ko と webcamd でデバイスを認識したのね。ふーん。すごいね。いじょ。」みたいな・・f(^^;;。

この写真はまさしくそんな感じで、 ThinkPad Edge e145 上の FreeBSD で KDE4 が動いていて、そこで pwcview を起動させた状態です。

IMG_0968_NotePC_Cam_1

ディスプレーの上にカメラがあるのですが、その横にある黄緑色の LED が光っております。カメラが Ready 状態ですねぇ;-)。

と、いうことで何か別の利用方法を考えてみることにしましょう。

あ。 chmod 666 /dev/video0 しましたが、これしないと一般ユーザで起動する pwcview では 画像が読み込めない状態になります。

 
4). リモートからカメラの映像を確認する
ローカルな FreeBSD の X11 に画面が出力されたので、リモートの FreeBSD から ssh -CY し、手元の X11 に pwcview を表示させればいんじゃね? えぇ。まさしくそのとおりですね。それだとリモートの X11 にカメラに映された映像が表示されます。それもひとつの案ですね;-)。

今回は http で画像を転送してみましょう。 ports から mjpg-streamer をインストールします。 ports 的には multimedia/mjpg-streamer になります。 make config は default の設定で良いです。まぁ、強いて言えば “Linux-UVC V4L2 plugin” を有効にしてインストールしましょう。

インストールしたものの中で重要なのはプラグインがインストールされた場所でしょうか。 /usr/local/lib/mjpg-streamer/ の中を覗くと .so なファイルが入っていますが mjpg-streamer を起動するときに利用するプラグインになります。

では実際に起動してみましょう。

$ mjpg_streamer -i 'input_uvc.so -d /dev/video0 -y' -o 'output_http.so -w /usr/local/www/mjpg-streamer'

 
/dev/video0 は chmod 666 しているので一般ユーザ権限で起動できます。

-i でカメラ側のオプションを指定します。 input_uvc.so プラグインを利用し、デバイスは /dev/video0 から入力します。
-o で出力側のオプションを指定します。 output_http.so プラグインを利用しコンテンツは /usr/local/www/mjpg-streamer にあることを指定します。
-o に output_file.so を指定するとカメラに写ったモノはファイルに出力してくれるのでしょうなぁ。僕は試していませんがf(^^;;。

ちなみに /usr/local/etc/rc.d/mjpg_streamer という起動スクリプトがインストールされるのですが、こいつは -i のオプションを指定する部分が無いんですよね。 rc.conf.local には以下のように書くと良いかな。

mjpg_streamer_enable="YES"
mjpg_streamer_flags="-i 'input_uvc.so -d /dev/video0 -y' -o 'output_http.so -w /usr/local/www/mjpg-streamer'"

 
さてさて。あとはウェブブラウザで http://localhost:8080 とかリモートのマシンからアクセスしてみるとそれらしいウェブサイトが表示されると思います。

ちなみにポート番号を変えたい場合には以下のように設定するが良いです。

mjpg_streamer_enable="YES"
mjpg_streamer_flags="-i 'input_uvc.so -d /dev/video0 -y' -o 'output_http.so -p 8081 -w /usr/local/www/mjpg-streamer'"

 
こんな感じで任意のポートに変更できたりします。

ただ、悲しいかな・・。 mjpg_streamer は IPv6 には対応していないようですねぇ。ソースコードの plugins/output_http/httpd.c の socket(PF_INET, …); の部分を書き換えると IPv6 対応になるかなぁ?暇なときにいじってみよう。

さてと。実際に表示される動画ですが、皆さんの目で確認してみてください;-)。
左のメニューから Static を選択すると写真が、 Stream を選択すると動画が流れ始めます。
僕の ThinkPad Edge e145 のカメラは pwcview ではまぁ、そこそこ綺麗に見えるのですが mjpg_streamer で見ると多少ちらつきますね。あと、ブラウザ側の PC の負荷が高くなるかな。

 
と、いう感じで NotePC に付いていたカメラが FreeBSD からでも利用できることが確認できました。しかもそのカメラがリモートからアクセスできて閲覧もできることが確認できたので、これで利用頻度がいっきにアップするのでは無いかと思われます。嬉しいことですね。

ただ、音を飛ばす時にはもっと別の技が必要になりそうな気がしますが、それはまた別の機会にでも:-|。

あと、カメラが付いてない FreeBSD がインストールされた PC には手元にある USB カメラを色々付けてみて cuse4bsd-kmod と webcamd で動作するか確認して見るのもよいかと思います。
もし動作する USB カメラだった場合、フツーの自作 PC にインストールした FreeBSD でも今回の組み合わせでカメラが利用できるようになるかと思われます。

ちなみに、僕は以下の二つの USB カメラを持っているのですが、こいつらをデスクトップの FreeBSD で利用してみました。

IMG_2228_NotePC_Cam_2

左側の白いのは FreeBSD というか webcamd で認識してくれませんでした。以下のようなメッセージが出力されます。

# webcamd -d ugen0.2
webcamd: Cannot find USB device

 
右側の黒いのは赤外線付きで暗いところでも良く見えるカメラなのですが、こいつは pwcview では動きましたが mjpg_streamer では動きませんでした(砂の嵐が表示されます)。
カメラによって動作が多少違うようですね。

 
と、いうことで、今回は NotePC に標準で付いているカメラで遊んでみました。 mjpg_streamer がちゃんと動いてくれると、利用価値は上がりそうですね。 また、 mjpg_streamer に変わる何か別のアプリを見つけてきて、それを試してみるのも良さそうですね。何か良い ports をご存じの方いましたら教えて下さい;-)。

また、最近流行の Raspberry Pi を FreeBSD/ARM で起動して USB カメラを接続し今回の組み合わせを利用すると、IoT な監視カメラができるかもしれません。

バッテリ運用で Raspberry Pi+USB Camera+FreeBSD+cuse4bsd-kmod+webcamd+mjpg_streamer+Wi-Fi な状態のヤツをラジコンカーに積んで走らせたら、録画ではなく、リアルタイムで動画が堪能できるような気がします。

面白そうだ・・;-)。

11月 142011
 

以前に一回「USB 無線 LAN 色々、FreeBSD で試してみた。」と言うエントリを書いているのですが今回のその続編。二回目です。

今回は FreeBSD のバージョンを 9.0-RC1 にして、新たに購入した機器の動作確認をしてみました。とわいつつ、実は前回も書いているのですが、if_run と if_rum の機器を持ってくればほとんどが動作するんですけどねぇ・・。

今回試した USB 無線 LAN 機器は以下の通り。まずは写真を。

IMG_2549_RadioLan2_1.jpg

順番に見ていくとしましょう。

1. Planex GW-USNano2-G
写真の上のほうにある黒くてチッコイやつです。こいつは FreeBSD で動作しない、ドライバが書かれていない、例の Realtek RTL8192CU を使っているヤツです。またまたま買ってしまい大失敗しました・・。orz。 NetBSD だと動作するんですけどねぇ。

で、今回も ndis でトライしてみたんですが、USB 機器はどうしたら if_ndis に結びつけるのか結局解りませんでした。sys/dev/usb/usbdevs にエントリー書けば良いのかなぁ? ndis での USB 機器の使い方がいまいち解らないんですよねぇ。そんなデバイスは知らん。と言われて ugen にアタッチされてしまいます・・。orz。

2. Planex GW-US54Mini2
これはアキバの某お店で 499yen で売っていたので買ってきて試しました。 FreeBSD では if_rum で動作します。 802.11g でリンクアップするのでこれはまぁ、中々良い感じでしょうか。ただし、今はもう販売終了となっていると思いますが・・。

3. Logitec LAN-W300N/U2
これは FreeBSD では if_run で動作します。けっこう高速で利用できます。続きはちょっと下のほうで書きます。

4. BUFFALO WLI-UC-GNM
これも FreeBSD では if_run で動作します。802.11b/g/n に対応しているので 150Mbps 出る。と言われていますが、そこそこな感じでしょうか。

と、言うことで今回は四打数三安打でした。それにしても最近は ちっこい USB 無線 LAN アダプタが RealTek のだったり Ralink のだったりするので購入する場合にはちゃんと下調べしたほうが良いと思われます。

で、どうして今回、再度の検証を行なったかと言うと、以前利用していた PCI GW-US300MiniW が壊れてしまったので、手持ちであるあるやつを利用し始めたんだけどこいつらみんな遅いっ!! 例えば NFS 上にある動画を再生しようとするとブチブチコマ落ちするし止まるしで到底実用には耐えられない遅さなのであります。

じゃ。ってんで、今回二回目の買い出しに出たのであります。結論から言うは if_run でも通信速度が速いものと遅いものがあります。僕が思うに小さいのはアンテナの影響から来るのか、遅いですね。BUFFALO WLI-UC-GNM は小さくてスルっと収まるんだけど遅いのが難点。
Logitec LAN-W300N/U2 はちょっと出っ張るんだけど、こいつは速いです。WLI-UC-GNM よりも速い。あと、以前使っていて壊れてしまった GW-US300MiniW も大きくて邪魔だったんだけど速かった。

あ、体感的には if_rum よりも if_run のほうが速いですね。まぁ、これはチップとドライバの問題で、当然 if_run のほうが速いのだろうと思いますが。

と、言うわけで教訓。

・if_run を買いましょう。
・300M と書いてあるのは多分速い。けど、その分でかい。
・速さを求めるならでかいのを買いましょう。

って感じでしょうか。デバイスが認識したあとに ifconfig wlan0 の media の部分を見ると良いと思います。

さてさて。どうして僕がこんなに USB 無線 LAN アダプタに凝るのか? と言えば、ThinkPad X100e 内蔵の 無線 LAN カード Advanced-N + WiMAX 6250 が正常に動作しないので USB アダプタに走るのでありました。

が、この間別のエントリにコメントしました<が、Advanced-N + WiMAX 6250 は動作するようになりました。 ここに書かれているように if_iwn.c を改修すると動作します。

それにしてもちゃんと動作する if_iwn はむちゃくちゃ速いです。 802.11n でリンクアップします。実際に計測してみると 24,5Mbps は出ています。すげーーっ(@_o)。けど、しょっちゅう通信が切れるんですよね。リンクの up/down はしないんだけど 30 秒くらい平気で止まってしまい、利用できるんだけど実用には耐えられない。速いだけに非常にもったいない・・。orz

と、言うことで Advanced-N + WiMAX 6250 の次に速いのが GW-US300MiniW、その次が LAN-W300N/U2 です。こいつは 12,3Mbps くらい出てくれます。 WLI-UC-GNM になると if_rum の速い機器と同等程度の速度になりますかねぇ。

あくまでも僕の実測と体感からの感想です。

と、言うことで if_run が今のところは一番良い感じだと思います。利用できるのは当たり前。更に速度を求めるのであればもっと他に色々試してみたいものですねぇ;-)。

11月 272010
 

ThinkPad X100e 内蔵の Intel Centrino Advanced-N + WiMAX 6250 って無線 LAN は 8.1-STABLE を利用すると iwn0 として認識するんだけど、利用できない。9-CURRENT では if_iwn.c とかビミョーに更新されているので、もしかしたら動作するかもしれませんが・・。

と、言うことで、USB の無線 LAN を利用することにしました。でもってできることなら小型が良いなぁ。と思い、既に持っているもの二つと、新たに三個も購入してしまいました・・。orz。

IMG_0145_RadioLan_1.jpg

これが僕が持っている USB 無線 LAN のオールスターキャストです。右側の白い、大きいヤツは前回書いていますね。if_rum と if_run で認識されるヤツです。

今回新たに購入したのは左側の黒いの二つと、下のちっこい白いの一つ。順番に見ていくことにしましょう。

一つ目。いちばんちっこい、黒いヤツ。

PLANEX GW-USValue-EZ

こいつは FreeBSD では動作しません。チップセットは Realtek RTL8192CU を利用しています。現在、FreeBSD では Realtek RTL8192CU に対応したドライバはありません。orz。

ただ、このまま、何もせずに使わないのはちょっともったいないので、ちょっと if_ndis ドライバで試してみることにしました。 FreeBSD の ndis ドライバは以前は PCMCIA カードにしか対応していなかったのですが、最近は USB デバイスにも対応したので、試してみる価値あり。と言う感じなのですね。

まずは Windows7 x64 用のドライバを持ってきます。そして、FreeBSD 上で ndisgen コマンドを叩きます。

# ndisgen net8192cu.inf rtl8192cu.sys

 
試してみると ndisgen コマンドがエラーになります。 net8192cu.inf の最後の行に改行コードが無いのでエラーになっているようです。なのでエディタで net8192cu.inf を開いてリターンキーを一発叩いてあげて再度実行すると、おぉ。できました。rtl8192cu_sys.ko が完成したので /boot/modules/ に入れた後、kldload します。が・・。

Windows7 x64 のフツーのドライバを利用すると ugen に落ちてしまい ndis0 では認識してくれません。 XLINK 用のドライバを kldload するとカーネルが凍り付きます。と、言うことで、今のところ、Realtek RTL8192CU なチップの USB 無線 LAN は使えないかなぁ。と言う感じなのであります。

続いて二個目。ちょっと大きめの黒いヤツ。

Buffalo WLI-UC-GN

一個目の PLANEX GW-USValue-EZ は usbdevs をろくすっぽ見ずに購入したので大失敗です。今度はちゃんと下調べして購入しました。この USB デバイスは if_run で動作するようです。9-CURRENT には man に run(4) が存在していて、そこにはちゃんと Buffalo WLI-UC-GN と書いてあるのです。

がっ!! こいつも動作しませんでした。と、言うか素直に AP に接続できない・・。 orz

usbdevs にもちゃんとエントリがあって kldload if_run するとサクっと認識してくれます。おっ。やったーっ!! ってなるんですけどね。しかし、WPA で接続しようと思い /etc/wpa_supplicant.conf を以下のように書くんですけど・・。

ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=0
eapol_version=1 ap_scan=1 fast_reauth=1
network={ ssid="SSID-AP" scan_ssid=1 key_mgmt=WPA-PSK psk="PassWord" }

 
ドライバ的には認識するのですが WPA を利用して AP を検索しようとしても WLI-UC-GN 本体のほうで wpa_supplicant.conf に記述した内容を上書きしてしまいます。ap_scan=2 で AP を探索したりとか・・。

なので、ドライバ的にはちゃんと認識するのですが、デバイス的には利用できないのでありました。ただ、利用できない(AP に接続できない)だけでないのがこれまた痛い。あるタイミングで突然 AP に接続できたりするし、全然全く AP に接続できない場合もある。

ブート時には全く AP に接続できないので実質的には FreeBSD では利用できない USB 無線 LAN の内の一つです。購入時には十分に注意しましょう。

で。三個目。

PLANEX GW-USMicroN

いやぁ。小型で、ようやっと動作するものに巡り会えました。man run に掲載されているものをウェブで調べて Amazon.co.jp で購入しました。999yen。ふぅ。

こいつは Ralink の RT3020 チップセットを利用しています。FreeBSD のファームウェアは RT2870 を利用しています。runfw.ko を kldload します。

今度は WPA でもちゃんと接続できるのでホッとしました。大きさ的にもまぁ、とりあえず小型なので嬉しいです。ただ、色が黒いほうが良かったかな。と言う感じはしますが。

と、言うことで NotePC に内蔵な無線 LAN の他に USB のヤツもそろそろ色々動くものが出てきたような感じがします。ただ、if_run 対応のチップは ieee802.11n に対応しているのに if_run 自体は 802.11g の速さでしか認識してくれないのでちょっと悲しいかなぁ。と言うのはありますが、FreeBSD で USB な 無線 LAN デバイスを利用する場合には if_rum もしくは if_run 対応のものが安心でしょうなぁ。と思うのであります・・。

がっ!! WLI-UC-GN はハマリ道で、GW-USValue-EZ は FreeBSD においてはドライバが存在しない。と言う結果になったのでありました・・。

11月 112010
 

最近、ThinkPad X100e を購入したのですが、こいつはグラフィックスカードが ATI の HD3200 相当だったので X11 のドライバの xf86-video-ati とか色々触っていたわけなのであります。

で、色々いじってみると、 X11 の ati の radeon ドライバでは HD5450 が動作するみたいだったのでいよいよ満を持してグラフィックスカードを交換してトライしてみよう。と言うことになったのであります。

購入したのは玄人志向の RH5450-LE512HD/D3/HS。ドスパラで購入したのですが、その時、ASUS の HD5570 が5,980yen だったのでどっちにしようか悩み、店員さんに確認したのですが、僕の PC は AthlonX2 4600+ で電源は 350W。店員さん曰く「350W で HD5570 はきついかもしれないですねー。」と言うことで HD5450 にしたのでありました。

IMG_0049_RadeonHD5450_1.jpg

ファンレス・ロープロファイルなのであります。

まずはこのグラフィックスカードを Windows7 で試してみました。Windows エクスペリエンスで確認してみると、以前使っていたHD 4350と比較です。以前比較したのはここにあますね。

hd5450_winperie.jpg

グラフィックス性能がちょっぴりアップした。と言う感じでしょうか。それでも(僕は多分使う機会は無いとは思いますが) DirectX11 に対応しているのでね。まぁ、よしとしましょう。

後、Windows7 で HDMI 出力する時の注意点があります。ディスプレーの画面全体に表示できないので CCC で設定を見てあげる必要があります。以下の URL を参考にすれば良いかと思います。

http://www.ask-corp.jp/supports/ati2/hdmi_scaling.html

DVI 出力だと問題無いのですけどね。HDMI でフル DH 出力すると画面が小さく表示され、周りが黒くなります。

さて。Windows で動作確認が終わったので次はいよいよ FreeBSD でトライです。

が・・。ブートして X が起動した段階でブラックアウト、フリーズしてしまいますな・・。orz。

もう少し詳しく書くと、drm.ko・radeon.ko を kldload しない状態で HD5450 を利用するとディスプレはブラックアウトします。 リモートから ssh して shutdown するか power ボタンを押して S5 ステートでシャットダウンするかしか方法がありません。

drm.ko・radeon.ko を kldload した場合は、カーネル自体が凍り付きます。orz。

xf86-video-ati を 6.13.0 や 6.13.2、はたまた master にしてもカーネル自体が凍り付きます。orz。

なんだかなー。X11 のドライバは対応しているみたいなんだけど、カーネル側で対応していないのかなぁ・・。カーネルモジュールの drm.ko・radeon.ko をロードしない場合はカーネルは関係ないはずで X11 の radeon ドライバのみで動作している(libdrm も使われるのかな?)のだけど、けど、それさえも正常に動作しないのでありました・・。orz。

それにしても 玄人志向の RH5450-LE512HD/D3/HS は調べてみるとイワク付きのグラフィックスカードみたいなのでその辺りが問題になっているのかもしれませんが・・。

と、言うことで、もう少し HD4350 を利用することにしたのでありました・・。

ちなみに Radeon HD の 5000 番台が正常に動作している。という方いますか?いましたらコメント頂ければと思います。

10月 052010
 

さて。ThinkPad X100e を購入して色々試している最中です。「ThinkPad X100e で FreeBSD。気がついた点。」のエントリーで書いた通り、if_iwn が動作しないので手元にある USB 接続の WiFi デバイスを試してみました。

手元にあるのは二つ。

MELCO WLR-UC-G
PCI GW-US300MiniW

上の MELCO WLR-UC-G は Ralink の 802.11a/b/g に対応した RT2500W のチップを載せています。こいつは FreeBSD 8.1-STABLE においては usbdevs にエントリが無いのでパッチを書きました。以下の URL にパッチはあります。

http://icmpv6.org/Prog/FreeBSD_patches/MELCO_WLR-UC-G_8.1-STABLE.patch

そして、このパッチは send-pr したので近いうちにパッチを適用せずとも利用できるようになるのでは。と思います。
なお、MELCO WLR-UC-G は ディップスイッチで AOSS(AP モード)とクライアントモードの両方に対応していますが、USB の deviceid は両方とも登録しておきました。

下の PCI GW-US300MiniW は 8.1-STABLE にはドライバは用意されていますが、man ページが存在していないようですね。if_run で認識するデバイスです。 if_run は Ralink の 802.11a/b/g/n に対応した RT2700U / RT2800U / RT3000U のチップに対応したデバイスです。

if_rum_run_0.jpg

では、FreeBSD/amd64 8.1-STABLE で利用できるのか? 検証した結果をちょっと書いておきます。

まず、if_rum の MELCO WLR-UC-G ですが、パッチを適用して kldload if_rum した後に USB に接続すると無事に認識します。認識するとこんな感じになります。

ugen2.2: <Buffalo> at usbus2
rum0: <Buffalo WLR-UC-G, class 0/0, rev 2.00/0.01, addr 2> on usbus2
rum0: MAC/BBP RT2573 (rev 0x2573a), RF RT2528

 
今回は一番簡単な wep で接続しています。全ての機器はこれで利用するようにコマンドを投入しました。rum0、run0 とオンボードの iwn0 は以下のコマンドで検証しています。

# ifconfig wlan0 create wlandev rum0
# ifconfig wlan0 ssid SS-ID wepmode on wepkey 0x313131 weptxkey 1 up
# dhclient wlan0

 
パッチ適用後の MELCO WLR-UC-G はこれで無事に動作することを確認しました。DHCP サーバからアドレスを取得して、ネットワークに接続できることを確認しました。ただ、問題もまたあって、どうやらマルチキャストパケットが通らないようです。

最近の FreeBSD と言うか KDE は mDNS が動作していて、Apple の Bonjour などと連携してプリンタが利用できたりするんですが、 mDNSResponder が以下のメッセージを出力し正常に動作していないように見えます。あれま・・。orz。

mDNSResponder: mDNS_AddDNSServer: Lock not held! mDNS_busy (0) mDNS_reentrancy (0)

 
ユニキャストなどが無事に通信ができるデバイスなだけにちょっと残念です。ちなみに mDNS 関係のソースは追ってないのであります・・。

次に if_run の PCI GW-US300MiniW についてですが、僕は 9-CURRENT を追っかけていないのでよく解らないのですが、 8.1-STABLE に man が無いと言うことはまだ STABLE に降りてきて時間が経ってないと言うことなんでしょうかね?

kldload if_run した後に USB に接続すると、既にエントリーが登録されているようで特にパッチを書く必要もなくサクっと認識しました;-)。

ugen2.2: <Ralink> at usbus2
run0: <1.0> on usbus2
run0: MAC/BBP RT2860 (rev 0x0102), RF RT2820 (MIMO 2T2R), address 00:90:cc:fd:86:e7
run0: firmware RT2870 loaded

 
上に書いてある ifconfig コマンドを投入し、こちらも wep で動作確認します。run0、wlan0 ともに status: associated になっているのですが、DHCP でアドレスをもらうことができませんでした。orz。

パケットが全く外に出て行ってない感じで手動で IP アドレスを付加して ping を打ってもまぁるで利用できない状態なのでありました・・。orz。

後、run0 で気になったのは if_run のコードをチロっと見てみると 802.11n に対応しているコードが入っているようです。でもって、今回接続したPCI GW-US300MiniW は 802.11n に対応しているデバイスなのですが、こいつは 802.11g で認識してしまいました。あぁれぇ・・。

ドライバがアップデートされるのをちっくと待ちましょうかねぇ。

さてと。ThinkPad X100e に付属の fi_iwn が利用できない。USB の if_run が利用できない。USB の if_rum は利用できるみたいだけどマルチキャストがどうもあやすぃ。みたいな感じとなりました。さてと、どうすっかなぁ・・。