BeagleBone Tips

BeagleBoneBlackにふれる機会があったので、気付いた点、嵌りそうなポイントをまとめていきたいと思う。

周辺I/Oの設定

BBBではcape managerというので、周辺I/Oの設定をおこないます。BBBに限らず、マイコンボードではI/Oピンが限られているし、割込みリソースも潤沢とはいえないので、機能を必要に応じて起動、割当てすることによって、ユーザー毎に必要なI/Oを確保しようという仕組みです。

確認方法は以下の通りで、デフォルトでは次のようになっている。

root@beaglebone:~# cat /sys/devices/bone_capemgr.9/slots
 0: 54:PF---
 1: 55:PF---
 2: 56:PF---
 3: 57:PF---
 4: ff:P-O-L Bone-LT-eMMC-2G,00A0,Texas Instrument,BB-BONE-EMMC-2G
 5: ff:P-O-L Bone-Black-HDMI,00A0,Texas Instrument,BB-BONELT-HDMI

設定変更は、/boot/uEnv.txtで行う。以下のケースではHDMIをdisableとし、UARTをenableにしている。特に、UARTに関してはコメント文に書いてないので良くわすれる。書式はv3.8.xとv4.0で若干異なる。

余談であるが、UART3は出力専用となっており、RXピンが存在しない。また、UART0はピンヘッダではなく、J1に接続されている。

slotファイルに動的にslot番号を書き込んで増やせるという情報もあるが、私はresource busyになって上手くいかなかった。

cape_enable=capemgr.enable_partno=BB-UART1,BB-UART2,BB-UART4,BB-UART5
cape_disable=capemgr.disable_partno=BB-BONELT-HDMI,BB-BONELT-HDMIN,BB-BONE-EMMC-2G

リブート後次のように変化していれば意図した設定になっている。上手くいかないときは起動時のlogを確認しましょう。

root@beaglebone:/lib/firmware# cat /sys/devices/platform/bone_capemgr/slots
 0: PF----  -1
 1: PF----  -1
 2: PF----  -1
 3: PF----  -1
 4: P-O-L-   1 Override Board Name,00A0,Override Manuf,BB-UART1
 5: P-O-L-   0 Override Board Name,00A0,Override Manuf,BB-UART2
 6: P-O-L-   2 Override Board Name,00A0,Override Manuf,BB-UART4
 7: P-O-L-   3 Override Board Name,00A0,Override Manuf,BB-UART5

周辺I/Oの設定(上級編)

予め用意されているdtbファイルでは、pull up/downなどは設定出来ないので、任意の設定にしたい場合は、自前で用意する必要がある。特に、boot configurationなどに利用されている一部のピンで、外部回路でpull up/downを行うと、起動しなくなったりする場合があるので、こういった場合に有用だ。
dtbファイルはdtsファイルと呼ばれるテキストファイルと、dtcコマンドを用いて相互に変換することができる。

dtb -> dts

dtc -I dtb -O dts am335x-boneblack.dtb > /root/am335x-boneblack.dts

dts -> dtb

dtc -O dtb -o BB-SPI1-01-00A0.dtbo -b 0 -@ BB-SPI1-01-00A0.dts

ちなみに、dtbファイルを読み込ませるタイミングは以下の3通りがある。1,2の方法を使う場合、mkinitramfsでinitrdを作り直しておく必要がある。

  1. /boot/dtbs以下におかれている標準で読み込まれるdtbファイルを/boot/uEnv.txtで指定する。
  2. /lib/firmware以下におかれているdtbファイルを/boot/uEnv.txtで指定して標準をオーバーライド
  3. /lib/firmware以下におかれているdtbファイルを/dtc/default/capemgrで指定して起動後に設定を変更する。

AM335xの各I/Oピンの設定はTIのPinMuxUtilityを用いて、GUIで行う事が出来る。
現在、ダウンロードして利用するソフトと、オンラインで利用するタイプがある。オンラインで利用するタイプはmyTIのアカウント登録が必要である。料金については何れも無料。

http://www.ti.com/tool/pinmuxtool

ピン割り当てがコンフリクトしているものは、その旨表示が出るので、エラーが無い状態に設定をして、outputタブを開くとgenerated filesの項目にソースファイルが出来上がっている。

Cのソースと、devicetree.txtというファイルが含まれているが、このファイルからdtsファイルに紐付ける方法が不明だったので、この方法は保留とした。
参考:http://wiki.sharedcircuits.com/index.php/BeagleBone_Black

dtsファイルを作るスクリプトや、webページが公開されているので、これを利用することにした。
1ピンづつしか指定できないので、必要なピン数分取得したのち、マージした。

作成したファイルを参考までに置いておく。
BB-MYIO-00A0.dts BB-MYIO-00A0.dtbo

上記のように作成したdtboファイルを/etc/firmware以下に置いておき、/etc/default/capemgrで指定した。

# Options to pass to capemgr
CAPE=BB-MYIO

uEnv.txtで指定する方法も試したが、エラーは出ないものの、起動後に/sys/class/gpio/exportにGPIOの番号を書き込んでも、動的にデバイスファイルが作成されなくなる不具合いがあった。