以前のリビジョンの文書です
ビーグルボーン・ブラック(BBB)は、高性能なミニPC基板である。
Rev.C は、標準で Linux の Debian が基板上のフラッシュメモリへインストールされている。
Raspberry Pi と同様に UNIX を知らない人間が、安さにつられて手を出すと痛い目に会うこと請け合いである。
すべてrootユーザーでログインして作業する。
タイムゾーン
% dpkg-reconfigure tzdata
USBの無線LANドングルを使う。
<古> Debian 8.4 / Linux beaglebone 4.4.9-ti-r25
例:Buffalo WLI-UC-GNM2
/etc/network/interfaces
auto wlan0 allow-hotplug wlan0 iface wlan0 inet dhcp wpa-ssid "SSID" wpa-psk "PASS"
<新> Debian 8.6 / Linux beaglebone 4.4.30-ti-r64
例:EDIMAX EW-7811UN
コマンドでVendor ID/Device IDを確認する
% lsusb Bus 001 Device 002: ID 7392:7811 Edimax Technology Co., Ltd EW-7811Un 802.11n Wireless Adapter [Realtek RTL8188CUS]
/etc/rc.local
modprobe rtl8192cu echo "7392 7811" > /sys/bus/usb/drivers/rtl8192cu/new_id ifdown wlan0 ifup wlan0
/etc/network/interfaces
auto wlan0 allow-hotplug wlan0 iface wlan0 inet dhcp wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
/etc/wpa_supplicant/wpa_supplicant.conf
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev update_config=1 network={ ssid="SSPD" psk="PASSPHRASE" key_mgmt=WPA-PSK }
専用の液晶ディスプレイが 4D Systems から販売されており、つなげばすぐ使える。
http://www.4dsystems.com.au/products
うまく表示されない場合 /boot/uEnv.txt を編集し、次の行を有効化する。
dtb=am335x-boneblack-emmc-overlay.dtb
そのままでは不要なGUIデスクトップが起動してしまうので、まずこれをOFFにしてコマンドライン(シェル、CUI)だけにする。
UNIXでリモートデスクトップも意味わからん。 X Client で display を指定すればよい。
% cd /etc/init.d % chmod 0 lightdm x11-common xrdp
以下のコマンドがまっとうだと思うがエラーになる。
% systemctl disable lightdm % systemctl disable x11-common % systemctl disable xrdp.service
基板上のピンヘッダに FTDI TTL-232R-3V3 を接続すると、シリアルコンソールとして使える。
115200bps
Xサーバをlistenするようにする。
起動オプションに -nolisten tcp がないことを確認
/etc/lightdm/lightdm.conf
xserver-allow-tcp=true
~debian/.xsessionrc
xhost +
% xeyes -display localhost:0.0 &
または
% export DISPLAY=localhost:0.0 % xeyes &
I/OはUNIXらしくデバイスドライバによりデバイスファイル化されており、これをオープンしたり読み書きすることにより制御できる。
もちろん root 権限で作業するか、setuid の立ったプロセスにしておく。
基板上のLEDのデバイスファイルは /sys/class/leds/beaglebone:green:usr[0-4] がそれにあたる。
コマンドラインであれば下記のようなコマンドで点灯/消灯させることができる。
% echo 1 > /sys/class/leds/beaglebone:green:usr0/brightness % echo 0 > /sys/class/leds/beaglebone:green:usr0/brightness
C言語であれば fopen の追記モードで開き、”1” (High) または “0” (Low) を出力する。
ソースコードは以下。
#include <stdio.h> #define LED0_PATH "/sys/class/leds/beaglebone:green:usr0" int main () { int i; FILE *fp; printf("Hello World\n"); fp = fopen(LED0_PATH "/brightness", "r+"); if (fp) { for (i = 0; i < 10; i ++) { fprintf(fp, "1"); fflush(fp); usleep(500000); fprintf(fp, "0"); fflush(fp); usleep(500000); } fclose(fp); } }
※ バッファリングされてしまうので、毎回 fflush() していることに注意する。
ソケットに出ている端子をコントロールするには、まず /sys/class/gpio/export へ使いたいピン番号を出力する。
すると /sys/class/gpio/gpio番号 というデバイスファイルの入ったフォルダができる。
そこで /sys/class/gpio/gpio番号/value を入出力することによりコントロールできる。
入力・出力の切り替えは /sys/class/gpio/gpio番号/direction へ “in” または “out” を出力すればよい。
使い終わったら /sys/class/gpio/unexport ピン番号を出力すると消える。
% echo 60 > /sys/class/gpio/export % cat /sys/class/gpio/gpio60/value 0 % echo out > /sys/class/gpio/gpio60/direction % echo 1 > /sys/class/gpio/gpio60/value % echo 0 > /sys/class/gpio/gpio60/value % echo 60 > /sys/class/gpio/unexport
C言語でのサンプルプログラム。
#include <stdio.h> #define GPIO_PATH "/sys/class/gpio" #define GPIO_NUM "60" // GPIO1_28 or pin 12 on the P9 header int main () { int i; FILE *fp; printf("Hello World\n"); fp = fopen(GPIO_PATH "/export", "a"); if (fp) { fprintf(fp, GPIO_NUM); fclose(fp); } fp = fopen(GPIO_PATH "/gpio" GPIO_NUM "/direction", "r+"); if (fp) { fprintf(fp, "out"); fclose(fp); } fp = fopen(GPIO_PATH "/gpio" GPIO_NUM "/value", "r+"); if (fp) { for (i = 0; i < 10; i ++) { fprintf(fp, "1"); fflush(fp); usleep(500000); fprintf(fp, "0"); fflush(fp); usleep(500000); } fclose(fp); } fp = fopen(GPIO_PATH "/unexport", "a"); if (fp) { fprintf(fp, GPIO_NUM); fclose(fp); } }
※ それぞれファイルのオープンモードに注意が必要。
昔から Linux ではデバイスドライバを経由せず、直接ハードウェアにアクセスする方法が用意されている。
#include <asm/io.h> iopl(3); または ioperm(port, num, 1);
FreeBSD では /dev/io をオープンしていれば、そのプロセスには特権が与えられる。
#include <machine/cpufunc.h> fd = open("/dev/io", 000); outb(val, port); // outw(), outl() inb(port); // inw(), inl()
よくプリンタポートを使って入出力したもんです。
最近なら /dev/ppi0 を開いて ioctl() をコールしたほうがよい。
シリアルポート
http://stackoverflow.com/questions/26012459/serial-port-polling-not-working-on-beaglebone-black
i2cget [-f] [-y] i2cbus chip-address [data-address [mode]]
i2cset [-f] [-y] [-m mask] [-r] i2cbus chip-address data-address [value] ... [mode]
-f オプションは、カーネルの管理によるbusyを無視します。
-y オプションは、対話モードを無効にします。
chip-address は、7bit (LSB justified) のアドレスです。