wiki:epics/bbb/epics_ioc

Version 1 (modified by michkawa, 11 years ago) (diff)

--

BeagleBone Black Serialx4 BOXを使ったMAR-782用IOC

BeagleBone Black Serialx4 CapeEPICSをインストールし、その上で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が起動するようになった。