BeagleBone Black Serialx4 BOXを使ったMAR-782用IOC
BeagleBone Black Serialx4 CapeにEPICSをインストールし、その上でIOCを実行したときのメモ。
環境整備
当初、BBBに内蔵されたeMMCに環境を作ってそこでIOCを起動しようとしたが、Serialx4 CapeをつけてBBBを起動するとなぜか追加したSerialが認識されない。調べてみると、Serialx4 CapeをつけるとeMMCのデバイスドライバ(?)と当たってしまい、弾かれてしまうようだった。
[ 0.249779] bone-capemgr bone_capemgr.8: Baseboard: 'A335BNLT,0A5C,2713BBBK6962' [ 0.249820] bone-capemgr bone_capemgr.8: compatible-baseboard=ti,beaglebone-black [ 0.280807] bone-capemgr bone_capemgr.8: slot #0: No cape found [ 0.317915] bone-capemgr bone_capemgr.8: slot #1: No cape found [ 0.355023] bone-capemgr bone_capemgr.8: slot #2: No cape found [ 0.385285] bone-capemgr bone_capemgr.8: slot #3: 'RS232C x4 Cape,00A0,KEK cERL CTRL,cape-bone-uartx4' [ 0.385455] bone-capemgr bone_capemgr.8: slot #4: specific override [ 0.385496] bone-capemgr bone_capemgr.8: bone: Using override eeprom data at slot 4 [ 0.385525] bone-capemgr bone_capemgr.8: slot #4: 'Bone-LT-eMMC-2G,00A0,Texas Instrument,BB-BONE-EMMC-2G' [ 0.385656] bone-capemgr bone_capemgr.8: slot #5: specific override [ 0.385691] bone-capemgr bone_capemgr.8: bone: Using override eeprom data at slot 5 [ 0.385719] bone-capemgr bone_capemgr.8: slot #5: 'Bone-Black-HDMI,00A0,Texas Instrument,BB-BONELT-HDMI' [ 0.385867] bone-capemgr bone_capemgr.8: slot #6: specific override [ 0.385903] bone-capemgr bone_capemgr.8: bone: Using override eeprom data at slot 6 [ 0.385931] bone-capemgr bone_capemgr.8: slot #6: 'Bone-Black-HDMIN,00A0,Texas Instrument,BB-BONELT-HDMIN' [ 0.386482] bone-capemgr bone_capemgr.8: loader: before slot-3 cape-bone-uartx4:00A0 (prio 0) [ 0.386511] bone-capemgr bone_capemgr.8: loader: check slot-3 cape-bone-uartx4:00A0 (prio 0) [ 0.386647] bone-capemgr bone_capemgr.8: loader: before slot-4 BB-BONE-EMMC-2G:00A0 (prio 1) [ 0.386673] bone-capemgr bone_capemgr.8: loader: check slot-4 BB-BONE-EMMC-2G:00A0 (prio 1) [ 0.386797] bone-capemgr bone_capemgr.8: loader: before slot-5 BB-BONELT-HDMI:00A0 (prio 1) [ 0.386822] bone-capemgr bone_capemgr.8: loader: check slot-5 BB-BONELT-HDMI:00A0 (prio 1) [ 0.386884] bone-capemgr bone_capemgr.8: initialized OK. [ 0.388874] OneNAND driver initializing [ 0.390228] bone-capemgr bone_capemgr.8: loader: after slot-3 cape-bone-uartx4:00A0 (prio 0) [ 0.390263] bone-capemgr bone_capemgr.8: slot #3: Requesting part number/version based 'cape-bone-uartx4-00A0.dtbo [ 0.390293] bone-capemgr bone_capemgr.8: slot #3: Requesting firmware 'cape-bone-uartx4-00A0.dtbo' for board-name 'RS232C x4 Cape', version '00A0' [ 0.390696] bone-capemgr bone_capemgr.8: loader: check slot-4 BB-BONE-EMMC-2G:00A0 (prio 1) [ 0.390737] bone-capemgr bone_capemgr.8: loader: check slot-5 BB-BONELT-HDMI:00A0 (prio 1) [ 0.390775] bone-capemgr bone_capemgr.8: loader: before slot-6 BB-BONELT-HDMIN:00A0 (prio 2) [ 0.390798] bone-capemgr bone_capemgr.8: loader: check slot-6 BB-BONELT-HDMIN:00A0 (prio 2) [ 0.390823] bone-capemgr bone_capemgr.8: loader: check slot-6 BB-BONELT-HDMIN:00A0 (prio 2)
ここまでは認識してるのに、
[ 0.528866] davinci_mdio 4a101000.mdio: davinci mdio revision 1.6 [ 0.528890] davinci_mdio 4a101000.mdio: detected phy mask fffffffe [ 0.529890] libphy: 4a101000.mdio: probed [ 0.529920] davinci_mdio 4a101000.mdio: phy[0]: device 4a101000.mdio:00, driver SMSC LAN8710/LAN8720 [ 0.530135] Detected MACID = 90:59:af:56:ae:c8 [ 0.530248] cpsw 4a100000.ethernet: NAPI disabled [ 0.531798] omap_rtc 44e3e000.rtc: setting system clock to 2000-01-01 00:03:34 UTC (946685014) [ 0.539102] ALSA device list: [ 0.539124] No soundcards found. [ 0.539756] Waiting for root device /dev/mmcblk0p2... [ 60.501673] bone-capemgr bone_capemgr.8: failed to load firmware 'cape-bone-uartx4-00A0.dtbo' [ 60.510609] bone-capemgr bone_capemgr.8: loader: failed to load slot-3 cape-bone-uartx4:00A0 (prio 0) [ 60.520282] bone-capemgr bone_capemgr.8: loader: check slot-6 BB-BONELT-HDMIN:00A0 (prio 2) [ 60.520310] bone-capemgr bone_capemgr.8: loader: check slot-5 BB-BONELT-HDMI:00A0 (prio 1) [ 60.520327] bone-capemgr bone_capemgr.8: loader: after slot-5 BB-BONELT-HDMI:00A0 (prio 1) [ 60.520354] bone-capemgr bone_capemgr.8: slot #5: Requesting firmware 'cape-boneblack-hdmi-00A0.dtbo' for board-name 'Bone-Black-HDMI', version '00A0' [ 60.520378] bone-capemgr bone_capemgr.8: slot #5: dtbo 'cape-boneblack-hdmi-00A0.dtbo' loaded; converting to live tree [ 60.520736] bone-capemgr bone_capemgr.8: slot #5: #4 overlays [ 60.521835] bone-capemgr bone_capemgr.8: loader: check slot-4 BB-BONE-EMMC-2G:00A0 (prio 1) [ 60.521856] bone-capemgr bone_capemgr.8: loader: after slot-4 BB-BONE-EMMC-2G:00A0 (prio 1) [ 60.521878] bone-capemgr bone_capemgr.8: slot #4: Requesting firmware 'cape-bone-2g-emmc1.dtbo' for board-name 'Bone-LT-eMMC-2G', version '00A0' [ 60.521896] bone-capemgr bone_capemgr.8: slot #4: dtbo 'cape-bone-2g-emmc1.dtbo' loaded; converting to live tree [ 60.522475] bone-capemgr bone_capemgr.8: slot #4: #2 overlays [ 60.523096] of_get_named_gpio_flags: can't parse gpios property [ 60.523110] of_get_named_gpio_flags: can't parse gpios property [ 60.523120] of_get_named_gpio_flags: can't parse gpios property [ 60.523152] gpio-rctrl rstctl.3: gpio_rctrl_request eMMC_RSTn [ 60.523186] omap_hsmmc mmc.11: Got rstctl (gpio:#0 name eMMC_RSTn) label:eMMC_RSTn [ 60.523198] gpio-rctrl rstctl.3: gpio_rctrl_deassert eMMC_RSTn [ 60.523456] edma-dma-engine edma-dma-engine.0: allocated channel for 0:3 [ 60.523503] edma-dma-engine edma-dma-engine.0: allocated channel for 0:2
1分待ってエラーになってる。orz
今までは、開発用と考えてmicroSDカード上で開発していたので気付かなかった。
対応策が思いつかないので、今回はeMMCは諦め、microSDカードに環境を作ることにしたら、今まで通り問題なくSerialを認識して動作した。
nfs client
IOCファイルはローカルに置かずにnfs server上に置いておいて、起動時に nfs mount したファイルを実行するようにした。
デフォルトではnfs clientが入っていないので、パッケージをインストール。
root@beaglebone:~# opkg install nfs-utils-client
パッケージインストール後、fstabにnfs mountする箇所を記述。
root@beaglebone:~# more /etc/fstab rootfs / auto defaults 1 1 proc /proc proc defaults 0 0 devpts /dev/pts devpts mode=0620,gid=5 0 0 tmpfs /tmp tmpfs defaults 0 0 172.28.64.115:/raid0/data/_NAS_NFS_Exports_/cerl /cerl nfs defaults,nolock 0 0
実際にmountできるか実験。
root@beaglebone:~# mount -a root@beaglebone:~# df Filesystem 1K-blocks Used Available Use% Mounted on rootfs 3369444 1728320 1466636 55% / /dev/root 3369444 1728320 1466636 55% / devtmpfs 255148 0 255148 0% /dev tmpfs 255280 0 255280 0% /dev/shm tmpfs 255280 232 255048 1% /run tmpfs 255280 0 255280 0% /sys/fs/cgroup tmpfs 255280 232 255048 1% /etc/machine-id tmpfs 255280 0 255280 0% /tmp 172.28.64.115:/raid0/data/_NAS_NFS_Exports_/cerl 11707011072 1452805120 10254205952 13% /cerl
mount できた。
IOC
IOCは以前使っていたものをBBB上の環境でコンパイルしたら、そのまま動作した。
IOC の自動起動
BBB Serialx4 BOXが起動したら自動的にIOCが立ち上がってくれないと面倒なので、その設定を行う。
RedHatやcentosなどは、/etc/rc*に設定すると自動的に立ち上がってくれるが、BBBのdefault OSである Angstrom Linux はちょっと特殊で、systemctlというコマンドでシャットダウンやserviceの追加削除等を行うらしい。でも、設定ファイル自体は、/etc/init.dに書けば自動的に追加されるのでそこに記述。
#! /bin/sh # # epics cERLNFSMountFlag=`/bin/df | /bin/grep cerl | /usr/bin/wc -l` cERLmount(){ if [ $cERLNFSMountFlag -eq 0 ]; then echo -n "Mount cERL NFS disk:" /bin/mount -a echo "done" else echo "Already cERL NFS disk mountd." fi } startioc(){ echo -n "Starting ioc: " if [ -e /home/root/ioc_start.sh ]; then /home/root/ioc_start.sh fi echo "done" } stopioc(){ echo -n "Stopping ioc: " if [ -e /home/root/ioc_stop.sh ]; then /home/root/ioc_stop.sh fi echo "done" } case "$1" in start) cERLmount startioc ;; stop) stopioc ;; restart) stopioc cERLmount startioc ;; reload) stopioc cERLmount startioc ;; *) echo "Usage: epics { start | stop | restart | reload }" >&2 exit 1 ;; esac exit 0
もう一つの問題としては、通常/etc/fstabにnfs mountする記述があれば自動的にnfs mountされるはずだが、なぜかmountされないので同じスクリプトに入れておいた。
[ 0.552787] EXT4-fs (mmcblk0p2): INFO: recovery required on readonly filesystem [ 0.552804] EXT4-fs (mmcblk0p2): write access will be enabled during recovery [ 2.339425] EXT4-fs (mmcblk0p2): recovery complete [ 2.343749] EXT4-fs (mmcblk0p2): mounted filesystem with ordered data mode. Opts: (null) [ 2.343820] VFS: Mounted root (ext4 filesystem) readonly on device 179:2. [ 2.352313] devtmpfs: mounted [ 2.352594] Freeing init memory: 264K [ 2.585729] systemd[1]: systemd 196 running in system mode. (+PAM -LIBWRAP -AUDIT -SELINUX +IMA +SYSVINIT -LIBCRYPTSETUP +GCRYPT +ACL +XZ; angstrom) [ 2.633741] systemd[1]: Inserted module 'autofs4' [ 2.635073] systemd[1]: Set hostname to <beaglebone>. [ 2.637823] systemd[1]: Initializing machine ID from random generator. [ 2.638123] systemd[1]: Installed transient /etc/machine-id file. [ 2.880724] systemd[1]: Cannot add dependency job for unit nfs_client.service, ignoring: Unit nfs_client.service failed to load: No such file or directory. See system logs and 'systemctl status nfs_client.service' for details. [ 2.881977] systemd[1]: Starting Forward Password Requests to Wall Directory Watch. [ 2.882440] systemd[1]: Started Forward Password Requests to Wall Directory Watch. [ 2.882552] systemd[1]: Expecting device dev-ttyO0.device...
この起動スクリプトも実行はされているけどなぜかmountされていないので、しつこくcronに起動時のみ実行するように記述。
@reboot (/bin/sleep 20; /bin/systemctl restart epics.service)
これでやっと起動時にnfs mountされるようになった。
ちなみに、epicsの起動スクリプトは、
#!/bin/sh -x EPICS_EMBED_DIR="/cerl/epics/embed/BeagleBoneBlack" EPICS_EMBED_ENV=$EPICS_EMBED_DIR/etc/setenvR314.12.3-linux-arm-bbb.sh # set Boot IOC st.cmd IOC_ST_CMD_PATH=$EPICS_EMBED_DIR/app/radmon/iocBoot/iocAloka_MAR783 IOC_ST_CMD1=st1.cmd IOC_ST_CMD2=st2.cmd SCR_NAME1=radmon1 SCR_NAME2=radmon2 # set epics environment if [ -e $EPICS_EMBED_ENV ]; then . $EPICS_EMBED_ENV fi PWD = `pwd` cd $IOC_ST_CMD_PATH if [ -e $IOC_ST_CMD_PATH/$IOC_ST_CMD1 ]; then screen -AmdS $SCR_NAME1 ./$IOC_ST_CMD1 sleep 2 fi if [ -e $IOC_ST_CMD_PATH/$IOC_ST_CMD2 ]; then screen -AmdS $SCR_NAME2 ./$IOC_ST_CMD2 fi cd $PWD
これで、BBB Serialx4 BOXが起動すると自動的にIOCが起動するようになった。