DIGIのConnectCore i.MX6UL スターターキットをチップワンストップで購入した。
このボードはラズベリーパイシリーズの40ピンのGPIOヘッダと互換のピンヘッダを搭載している。 つまりハードウェアレベルではラズベリーパイのHATやLCDなどのデバイスが使用できるだろうということ。
カーネルやドライバなどをどうにかして、その手のデバイスを動かしてみるのも面白そうだと思い購入することにした。
ボード立ち上げの基本的な作業はここを参考にしている。
yoctoの入手
このボードは標準でYoctoProjectのBSPが提供されている。
$ mkdir -p ~/yocto/dey-2.0 $ cd ~/yocto/dey-2.0 $ repo init -u https://github.com/digi-embedded/dey-manifest.git -b refs/tags/2.0-r4 $ repo sync -j4 --no-repo-verify
プロジェクトの作成
$ source ./mkproject.sh -l ccimx6sbc ccimx6ulsbc ccimx6ulstarter $ mkdir build && cd build $ source ../mkproject.sh -p ccimx6ulstarter
BitBake実行
$ bitbake core-image-base
u-boot
ccimx6ul starterは出荷時点でNANDフラッシュにu-bootが書き込まれており、 シリアルコンソールの設定を行って電源をいれると、それが起動するようになっている。
初期状態の環境変数
arch=arm
baudrate=115200
board=ccimx6ulstarter
board_id=129
board_name=ccimx6ulstarter
board_version=2
boot_fdt=yes
bootargs_linux=cma=96M
bootargs_nand_linux=setenv bootargs console=${console},${baudrate} ${bootargs_linux} ${mtdparts} ubi.mtd=${mtdlinuxindex} ubi.mtd=${mtdrootfsindex} root=ubi1_0 rootfstype=ubifs rw ${bootargs_once} ${extra_bootargs}
bootargs_recovery=setenv bootargs console=${console},${baudrate} androidboot.hardware=ccimx6ulstarter androidboot.console=${console}${mtdparts} ${bootargs_once} ${extra_bootargs}
bootcmd=if run loadscript; then source ${loadaddr};fi;
bootdelay=1
bscantest=PASS
btaddr=00:40:9D:98:A0:51
console=ttymxc4
cpu=armv7
eth1addr=00:40:9D:98:A0:4F
ethact=FEC0
ethaddr=00:40:9D:98:A0:4E
ethprime=FEC
fdt_addr=0x83000000
fdt_file=zImage-imx6ul-ccimx6ulstarter.dtb
fdt_high=0xffffffff
initrd_addr=0x83800000
initrd_file=uramdisk.img
initrd_high=0xffffffff
install_linux_fw_sd=if load mmc 0 ${loadaddr} install_linux_fw_sd.scr;then source ${loadaddr};fi;
ipaddr=192.168.42.30
linux_file=core-image-base-ccimx6ulstarter.boot.ubifs
loadaddr=0x80800000
loadscript=if ubi part linux; then if ubifsmount ubi0:linux; then ubifsload ${loadaddr} ${script};fi;fi;
module_variant=0x02
mtddevname=bootloader
mtddevnum=0
mtdids=nand0=gpmi-nand
mtdlinuxindex=3
mtdparts=mtdparts=gpmi-nand:3m(bootloader),1m(environment),1m(safe),14m(linux),14m(recovery),128m(rootfs),-(update)
mtdrootfsindex=5
netmask=255.255.0.0
partition=nand0,0
recovery_file=recovery.img
recoverycmd=if ubi part recovery; thenif ubifsmount ubi0:recovery; thenubifsload ${loadaddr} ${zimage};ubifsload ${fdt_addr} ${fdt_file};ubifsload ${initrs_addr} ${initrd_file};run bootargs_recovery;bootz ${loadaddr} ${initrd_addr} ${fdt_addr};fi;fi;
rootfs_file=core-image-base-ccimx6ulstarter.ubifs
rootpath=/exports/nfsroot-ccimx6ulstarter
script=boot.scr
serverip=192.168.42.1
soc=mx6
stderr=serial
stdin=serial
stdout=serial
uboot_file=u-boot.imx
vendor=digi
verifyaddr=88400000
wlanaddr=00:04:f3:ff:ff:fb
zimage=zImage-ccimx6ulstarter.bin
カーネルやデバイスツリーをロードするために使用するDDR上のアドレスやファイル名などもあらかじめ、次のように変数として定義してある。
| 変数 | 値 | 説明 |
|---|---|---|
| loadaddr | 0x80800000 | カーネルのロードアドレス |
| zimage | zImage-ccimx6ulstarter.bin | カーネルのファイル名 |
| fdt_addr | 0x83000000 | デバイスツリーのロードアドレス |
| fdt_file | zImage-imx6ul-ccimx6ulstarter.dtb | デバイスツリーのファイル名 |
初期状態へ戻す
下記のコマンドで初期状態へ戻すことができる。
env default -a
カーネル、rootfsの書き込み
Digiのi.MX6UL Starter kitのu-bootは高機能なため、rootfsやカーネルなどの書き込み手順を一本化したupdateコマンドが用意されている。
updateコマンドはtftpサーバからイメージを取得するようになっているため、予め下記の設定をしておく必要がある。
setenv ipaddr x.y.z.w setenv serverip a.b.c.d saveenv
| 変数 | 説明 |
|---|---|
| ipaddr | ccimx6ulstarterのIPアドレス |
| serverip | tftpサーバのIPアドレス |
書き込みは次のように実行する。
update linux tftp core-image-base-ccimx6ulstarter.boot.ubifs update rootfs tftp core-image-base-ccimx6ulstarter.ubifs boot
最後のbootで書き込んだlinuxを起動している。
u-bootのbootcmdなどを見ると、NANDフラッシュにカーネルやルートファイルシステムをインストールし使用することを前提としているように見えるが、 内蔵のフラッシュロムには書き込み回数の上限、つまり寿命があるため、マイクロSDやNFSなどを使用し、なるべく内蔵のフラッシュロムを使用しない方法を検討する。