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