chakokuのブログ(rev4)

テック・コミック・ごくまれにチャリ

旧BeagleBone(BBW)のOS載せ替え(試行錯誤の記録)


旧型のBeagleBone(BBBでない方)でSerialを使おうとして、どうしてもIOからシリアル信号が出ない問題に遭遇した。左の写真が旧BeagleBone(BBW)、簡単な回路が組めるよう、Proto Cape Kitが乗せてある。基板上の配線は、マイコンのピンがケープのパッドに直結されているようであり、信号が出力されないのはマイコン側のIOマルチプレクスあたりがおかしいのでは?と思えた。が、、ネット上の情報でUART1等を有効にする方法はあるものの、自分の環境(BeagleBone + Debian 6.0)では該当するディレクトリ等が見当たらず、自分のOSが古すぎるのでは?と思えて最新版に上げることにした。
OS入りSDを作る方法として、(1)PC環境で専用のツールを使って焼く方法と、(2)Linux環境でddコマンドで/dev/sdXにじか書きする方法がある。今回は後者の方法(古いOSが走っているBeagleBoneのUSBにSDカードリーダをさして/dev/sdXXに対してddコマンドでじか書き)で作ってみた。

SDメモリをさしたSDカードリーダをBeagleBoneのUSBに挿入、dmesgの内容を確認。メッセージ内容から、SDメモリは/dev/sdbと当たりをつけた。

[   69.400353] usb 1-1: new high speed USB device number 2 using musb-hdrc
[   69.688356] usb 1-1: New USB device found, idVendor=1307, idProduct=0330
[   69.695478] usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[   69.703013] usb 1-1: Product: Mass Storage Device
[   69.707964] usb 1-1: Manufacturer: Generic
[   69.712569] usb 1-1: SerialNumber: 00000000000006
[   69.730860] scsi0 : usb-storage 1-1:1.0
[   69.783891] usbcore: registered new interface driver uas
[   70.731841] scsi 0:0:0:0: Direct-Access     Generic  USB  CF Reader   0.00 PQ: 0 ANSI: 2
[   71.509834] scsi 0:0:0:1: Direct-Access     Generic  USB  SD Reader   0.00 PQ: 0 ANSI: 2
[   71.520412] scsi 0:0:0:2: Direct-Access     Generic  USB  MS Reader   0.00 PQ: 0 ANSI: 2
[   71.529698] scsi 0:0:0:3: Direct-Access     Generic  USB  SM Reader   0.00 PQ: 0 ANSI: 2
[   71.547630] sd 0:0:0:0: Attached scsi generic sg0 type 0
[   71.560778] sd 0:0:0:0: [sda] Attached SCSI removable disk
[   71.574024] sd 0:0:0:1: Attached scsi generic sg1 type 0
[   71.582533] sd 0:0:0:2: Attached scsi generic sg2 type 0
[   71.594051] sd 0:0:0:1: [sdb] 15693824 512-byte logical blocks: (8.03 GB/7.48 GiB)
[   71.606348] sd 0:0:0:2: [sdc] Attached SCSI removable disk
[   71.618846] sd 0:0:0:3: Attached scsi generic sg3 type 0
[   71.628592] sd 0:0:0:1: [sdb] Write Protect is off
[   71.633814] sd 0:0:0:1: [sdb] Mode Sense: 03 00 00 00
[   71.641372] sd 0:0:0:3: [sdd] Attached SCSI removable disk
[   71.648957] sd 0:0:0:1: [sdb] No Caching mode page present
[   71.654876] sd 0:0:0:1: [sdb] Assuming drive cache: write through
[   71.674647] sd 0:0:0:1: [sdb] No Caching mode page present
[   71.680574] sd 0:0:0:1: [sdb] Assuming drive cache: write through
[   71.692887]  sdb: sdb1
[   71.711977] sd 0:0:0:1: [sdb] No Caching mode page present
[   71.717770] sd 0:0:0:1: [sdb] Assuming drive cache: write through
[   71.724317] sd 0:0:0:1: [sdb] Attached SCSI removable disk

fdiskでも再確認、パーティションにアクセスでき、FAT32、8GBになっているので、これでよし。

root@debone:~# fdisk /dev/sdb

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').

Command (m for help): p

Disk /dev/sdb: 8035 MB, 8035237888 bytes
229 heads, 20 sectors/track, 3426 cylinders
Units = cylinders of 4580 * 512 = 2344960 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               2        3427     7842816    b  W95 FAT32

Command (m for help):

Debianの最新イメージを、BeagleBoneサイトよりダウンロード、xzコマンドで展開しつつddコマンドでSDに書き込み

wget http://debian.beagleboard.org/images/bone-debian-7.8-lxde-4gb-armhf-2015-03-01-4gb.img.xz
xz -dc bone-debian-7.8-lxde-4gb-armhf-2015-03-01-4gb.img.xz || dd of=/dev/sdb

ddコマンドでイメージを書き込むのは非常に時間がかかる。以下コマンド出力、約30分

7577600+0 records in
7577600+0 records out
3879731200 bytes (3.9 GB) copied, 1666.24 s, 2.3 MB/s

書き込めたのか確認

root@debone:~# fdisk /dev/sdb

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to switch off the mode (command 'c') and change display units to sectors (command 'u').

Command (m for help): p

Disk /dev/sdb: 8035 MB, 8035237888 bytes
248 heads, 62 sectors/track, 1020 cylinders
Units = cylinders of 15376 * 512 = 7872512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1   *           1          13       98304    e  W95 FAT16 (LBA)
Partition 1 has different physical/logical beginnings (non-Linux?):
     phys=(0, 32, 33) logical=(0, 33, 3)
Partition 1 has different physical/logical endings:
     phys=(12, 93, 17) logical=(12, 228, 8)
Partition 1 does not end on cylinder boundary.
/dev/sdb2              13         493     3689472   83  Linux
Partition 2 has different physical/logical beginnings (non-Linux?):
     phys=(12, 93, 18) logical=(12, 228, 9)
Partition 2 has different physical/logical endings:
     phys=(471, 174, 23) logical=(492, 203, 22)
Partition 2 does not end on cylinder boundary.

clinyder boundaryのエラーというか警告がでているけど。。まぁ仕事じゃないし、これでよしとしよう。
勝手にブートするとID/PWDとかIPとか分からなくなるので、マウントして細工しておく。

root@debone:~# mount /dev/sdb2 /mnt/sd2
root@debone:~# cd /mnt/sd2/
root@debone:/mnt/sd2# ls -F
bin/   dev/  home/  lost+found/  mnt/  proc/  run/   selinux/  sys/  usr/
boot/  etc/  lib/   media/       opt/  root/  sbin/  srv/      tmp/  var/

file:/mnt/sd2/etc/network/interfaces に eth0を設定(固定IPでつながるように)

iface eth0 inet static
        address 10.0.128.160
        netmask 255.255.255.0
        network 10.0.128.0
        broadcast 10.0.128.255
        gateway 10.0.128.1
        dns-nameservers 10.0.128.1

本来はuseraddコマンドでユーザ追加するのだけど、/mnt/sd2/etc配下の自分のアカウントのpasswd,shadowを母艦のBeagleBoneからコピー、mkdir /mnt/sd2/home/hogehogeと、chown NNN:NNN でオーナ変更
これでブート後、普段のIP、ID/PWDで接続できるはずなので、SDを差し替えてブートしてみる*1

ブートしたけど、ping 10.0.128.160 では応答しない。LEDの光っぷりからOS自体は動いていそうだけど。。やっぱりシリアルコンソールで繋ぐか、BB独自のUSB経由でのメンテナンスをするしかなさそうだ。(あるいは、、OSを旧に戻して、新OSのSDをマウントしてsyslogを見るか。。)

SDを差し替えて、旧OSでブートして、新OSのカードをマウントして syslogを見ると、それなりに仕事をしているようであった。そこで、、print文デバッグのごとく、/etc/rc.localに 以下のようにログ取るようにスクリプトを書いて、SDを交換して再度実行


ifconfig -a >> /var/log/aho
再度新旧OSを入れ替えてprint文デバッグを確認、メッセージは以下

eth0 Link encap:Ethernet HWaddr 00:18:31:8f:26:8c
BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
Interrupt:40

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

eth0は上がってるけどIPが付いていない。なぜか?? ぐぐって判明、auto eth0を有効にすべし。

# The primary network interface
auto eth0
で、OS入れ替えて再起動。。pingの応答があったのでsshでログイン

beaglebone:~$ uname -a
Linux beaglebone 3.8.13-bone70 #1 SMP Fri Jan 23 02:15:42 UTC 2015 armv7l GNU/Linux
beaglebone:~$ cat /etc/issue
Debian GNU/Linux 7 \n \l

BeagleBoard.org Debian Image 2015-03-01

Support/FAQ: http://elinux.org/Beagleboard:BeagleBoneBlack_Debian

default username:password is [debian:temppwd]

The IP Address for eth0 is: 10.0.128.160
The IP Address for usb0 is: 192.168.7.2

ひとまず、OSが最新版に更新できた。apt-get update; apt-get upgradeでパッケージも最新にしておく。

Debian 7だと、/dev/ttyO0 しかない。これはWeb上の情報通り、で、、CAPEを有効化する設定を追加
file:/boot/uEnv.txt


# Enable UART1
cape_enable=capemgr.enable_partno=BB-UART1
これで再起動、/dev/ttyO1が出来ているのを確認
信号が出力されるかを確認。ttyO1(UART1)に文字列を書き出し

while [ 1 ] ; do echo "adsfasfsaf" > /dev/ttyO1 ; done
オシロで波形確認

ボーレートはともかく、UART1から信号が出ているのを確認した。

やっとのことで、シリアル出力ができるようになった。で、、この後は、TxD/RxDを合流させる回路を作って、iCOMの無線機に接続して、icomコマンドで操作すれば、リモートシャック用の操作環境ができるはず。が、、もう日曜日の夕方なので、ここまで。

過去BBを使っていた頃はOSを載せ替えるのも頻繁にやっていた。こんなに手こずるのはやっぱり時間が経って、いろいろ忘れてしまったりスキルが低下したせいだろうか。まぁ普段BBつかってないのでしょうがない。

シリアルはなんとかなりそうなので、今度は音の処理(リモートシャックのため)だということで、USBで接続できるSouldBlaster(creative sb-play)をBBに差してみた。SoundBlsterのLEDが点灯しないので、嫌な予感がしたが、、やっぱりデバイスとして認識されていない。これは、カーネル再のコンパイルが必要なのだろうか。。

root@beaglebone:/var/log# lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

root@beaglebone:/var/log# aplay -L
null
    Discard all samples (playback) or generate zero samples (capture)

root@beaglebone:/var/log# cat /proc/asound/cards
--- no soundcards ---

dmesgやsyslogみても、SoundBlasterを差しても何もログが出力されず、まずUSBデバイスとして認識がなされていない。

あまり意味ないけど、ALSAのバージョンとかは以下。

root@beaglebone:/var/log# cat /proc/asound/version
Advanced Linux Sound Architecture Driver Version k3.8.13-bone70.

SoundBlasterを差したままでBeagleBoneを再起動したら、SoundBlsterのLEDが点灯して、正しく認識された状態になった。

root@beaglebone:~# lsusb
Bus 001 Device 002: ID 041e:30d3 Creative Technology, Ltd Sound Blaster Play!
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

root@beaglebone:~# cat /proc/asound/cards
 1 [U0x41e0x30d3   ]: USB-Audio - USB Device 0x41e:0x30d3
                      USB Device 0x41e:0x30d3 at usb-musb-hdrc.1.auto-1, full speed

root@beaglebone:~# aplay -L
null
    Discard all samples (playback) or generate zero samples (capture)
default:CARD=U0x41e0x30d3
    USB Device 0x41e:0x30d3, USB Audio
    Default Audio Device
sysdefault:CARD=U0x41e0x30d3
    USB Device 0x41e:0x30d3, USB Audio
    Default Audio Device
front:CARD=U0x41e0x30d3,DEV=0
    USB Device 0x41e:0x30d3, USB Audio
    Front speakers
surround40:CARD=U0x41e0x30d3,DEV=0
    USB Device 0x41e:0x30d3, USB Audio
    4.0 Surround output to Front and Rear speakers
surround41:CARD=U0x41e0x30d3,DEV=0
    USB Device 0x41e:0x30d3, USB Audio
    4.1 Surround output to Front, Rear and Subwoofer speakers
surround50:CARD=U0x41e0x30d3,DEV=0
    USB Device 0x41e:0x30d3, USB Audio
    5.0 Surround output to Front, Center and Rear speakers
surround51:CARD=U0x41e0x30d3,DEV=0
    USB Device 0x41e:0x30d3, USB Audio
    5.1 Surround output to Front, Center, Rear and Subwoofer speakers
surround71:CARD=U0x41e0x30d3,DEV=0
    USB Device 0x41e:0x30d3, USB Audio
    7.1 Surround output to Front, Center, Side, Rear and Woofer speakers
iec958:CARD=U0x41e0x30d3,DEV=0
    USB Device 0x41e:0x30d3, USB Audio
    IEC958 (S/PDIF) Digital Audio Output

なぜSoundBlaster(SB)入れっぱなしだと認識されるのか不明。ちなみに、抜いた状態でBeagleBone(BBW)を起動して、SBを挿入すると、一瞬LEDがチカっと光って、BBWの挙動がおかしくなる。電源容量が足りないのか、割り込みが入っておかしくなるのか。。
まぁSBはずっと入れっぱなしで問題ないので、抜き差しはせずに運用することにする。

音声再生テストをやってみた。イヤフォンからピンクノイズが流れてきた。

root@beaglebone:/dev/snd# speaker-test -Dsysdefault:U0x41e0x30d3 -c6 -wav

speaker-test 1.0.25

Playback device is sysdefault:U0x41e0x30d3
Stream parameters are 48000Hz, S16_LE, 6 channels
Using 16 octaves of pink noise
Rate set to 48000Hz (requested 48000Hz)
Buffer size range from 2048 to 16384
Period size range from 1024 to 1024
Using max buffer size 16384
Periods = 4
was set period_size = 1024
was set buffer_size = 16384
 0 - Front Left
 4 - Center
 1 - Front Right
 3 - Rear Right
 2 - Rear Left
 5 - LFE
Time per period = 17.601251
 0 - Front Left
 4 - Center
 1 - Front Right
 3 - Rear Right
  ... 続く ...

録音をそのまま再生する例


arecord -D hw:1,0 -f S16_LE | aplay -D plughw:1,0
ひとまず、シリアルと音声はなんとかなった。
あとは、アプリレベルで作りこんだり、フリーソフトを整えたら、リモート操作が可能になるはず。。

memo


avconv -f alsa -ac 1 -i hw:1,0 –acodec mp2–ab 128k -f rtp rtp://239.1.1.1:1234

avconv -f alsa -ac 1 -i hw:1,0 -f rtp rtp://10.0.128.201:1234

ffmpeg -f oss -i /dev/dsp -acodec libmp3lame -ab 32k -ac 1 -re -f rtp rtp://234.5.5.5:1234
■ご参考URL
マイクで拾った音をストリーミングする方法
Thread: How To Stream Live Audio from your Mic in Real Time
http://ubuntuforums.org/showthread.php?t=1544946

Stream Live Audio from a Microphone in Near Real Time in Ubuntu
https://prupert.wordpress.com/2010/08/02/stream-live-audio-from-a-microphone-in-near-real-time-in-ubuntu/

*1:心配しなくても、debianの初期ID/PWDssh接続時にメッセージとして表示されるようであった。。 default username:password is [debian:temppwd]