みつきんのメモ

組み込みエンジニアです。Interface誌で「Yocto Projectではじめる 組み込みLinux開発入門」連載中

ConnectCore i.MX6UL スターターキットで遊ぶ

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などを使用し、なるべく内蔵のフラッシュロムを使用しない方法を検討する。