<!--親の顔より見た光景-->

日々の発見を残していきます。

PICO-PI-IMX8 環境構築メモ

PICO-PI 環境構築メモ

目的:
 組み込みLinux Driver 開発勉強のため、PICO-PI-IMX8 環境構築を行う。
 環境構築後、driver 改造、新規 driver 作成が可能となる。
基本環境:
 Windows 上で動く VirtualBox(Ubuntu16.04) を host OS とする
必要なもの
 Ether ケーブル
 PICO-PI-IMX8

virtual box 導入

参考:https://qiita.com/ykawakami/items/4bae371932110b2e25e3
割当メモリ:2048MB
ハードディスク容量 120GB
以降の作業はVirtual Box 上での作業

i.MX8M ARM Toolchain DL

gcc-linaro-6.4.1-2017.11-x86_64_aarch64-linux-gnu.tar.xz を DL
参考:https://www.technexion.com/support/knowledgebase/preparing-a-toolchain-for-building-arm-binaries-on-x86-hosts/

DL後、
sudo tar xvf gcc-linaro-6.4.1-2017.11-x86_64_aarch64-linux-gnu.tar.xz -C /opt/

toolchain 環境変数設定

以下を ~/.bashrc に追記、source ~/.bashrc を実行

export ARCH=arm64
export CROSS_COMPILE=/opt/[toolchain directory]/bin/aarch64-linux-gnu-
export CC=/opt/[toolchain directory]/bin/aarch64-linux-gnu-

hello world 作成

hello world を行う test.cを作成
$ {CC}gcc test.c -o test
$ file test
ARM64 形式であることを確認

kernel source 取得

任意ディレクトリで
$ git clone https://github.com/TechNexion/linux.git

kernel build

$ cd ~/path/to/work/linux
$ make defconfig
$ make all

drivers/media/platform/mxc/capture/mx6s_capture.c
probe() 先頭に pr_info("20200831 test"); を追記
PICO-PI 起動時に以下の通りログが現れるため、ログを保存、検索をかける

参考:PICO-PI 起動時のログ
[ 1.787511] input: 30370000.snvs:snvs-powerkey as /devices/platform/30370000.snvs/30370000.snvs:snvs-powerkey/input/input0
[ 1.801515] snvs_rtc 30370000.snvs:snvs-rtc-lp: rtc core: registered 30370000.snvs:snvs- as rtc0
[ 1.811097] i2c /dev entries driver
[ 1.817608] 20200831 test
[ 1.820700] 20200831 test
[ 1.825344] mxc-mipi-csi2_yav 30a70000.mipi_csi1: mipi_csi2_probe
[ 1.831571] CSI: Registered sensor subdevice: mxc-mipi-csi2.0
[ 1.837429] mxc-mipi-csi2_yav 30a70000.mipi_csi: Remote device a

rootfs 取得

Ubuntu 20.04 file system を取得する。
参考:https://www.digikey.com/eewiki/display/linuxonarm/MCIMX8M-EVK#MCIMX8M-EVK-Ubuntu20.04LTS

以下を実行。
$ wget -c https://rcn-ee.com/rootfs/eewiki/minfs/ubuntu-20.04-minimal-armhf-2020-05-10.tar.xz

取得した tar.xz を /public/nfsroot で展開

$ ls /public/nfsroot
bin dev home media opt root sbin sys usr
boot etc lib mnt proc run srv tmp var

nfs server 構築

参考:https://qiita.com/salty-vanilla/items/5bc95ad47af6bf051bf7

$ sudo apt-get install nfs-kernel-server
/etc/exports に以下を追記
/public/nfsroot/ 192.168.4.200(rw,sync,no_subtree_check)

tftp server 構築

$ sudo apt install tftpd-hpa tftp-hpa
$ sudo systemctl enable tftpd-hpa
$ sudo systemctl restart tftpd-hpa
$ mkdir /tftpboot

/etc/default/tftpd-hpa に以下を追記
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/tftpboot"
TFTP_ADDRESS=":69"
TFTP_OPTIONS="--ipv4 --secure --create"

tftpserver を restart
$ sudo service tftpd-hpa restart

起動Image の配置

kernel build 成果物である Image, dtb を tftpserver に配置する
$ cd ~/path/to/work/linux
$ sudo cp arch/arm64/boot/Image /tftpboot
$ sudo cp arch/arm64/boot/dts/freescale/pico-8m.dtb /tftpboot

teraterm install

teratermWindows へ install する
windowsteraterm を install

PICO-PI-IMX8 起動

typeB USB, USB type C をPC と接続。type C 接続でボード電源が入る。
teraterm を起動、Serial 接続で port 3,4 (環境による)いずれかを選択してボードのリセットボタンを押下
起動ログが流れる port で、ボーレートを115200 に設定。再起動。
文字化けのない起動ログが現れたら成功。
User name: root
password: root
でログイン

工場出荷状態では eMMC boot 設定となっているため、uboot 環境変数を編集して NFS boot に切り替える必要アリ

virtual box ネットワーク設定

Virtual Box を終了
Virtual Box 起動画面 -> 設定
設定 -> ネットワーク ->
割り当て:ブリッジアダプター
名前:Realtek PCIe FE Familiy Controller
とする
名前の部分は環境によって変えること。今回はEther ポートに直接接続。

Ubuntu 起動
Ubuntu 側で network アドレスを 192.168.4.10 に設定

PICO-PI を起動、teraterm 上で ifconfig eth0 192.168.4.200 を実行
Ubuntu から ping 192.168.4.200 が通ればOK

uboot 環境変数に Ether boot 設定を追加

デフォルトで NFS boot が走るように uboot 環境変数を変更する
変更前に printenv で工場出荷状態の環境変数を確認、保存しておくこと

環境変数のバックアップ後、以下を実行。

setenv ipaddr 192.168.4.200
setenv serverip 192.168.4.10
setenv nfsroot /public/nfsroot
setenv fdt_addr 0x43000000
setenv loadaddr 0x40480000
setenv fdt_file pico-8m.dtb
setenv bootcmd 'run netboot'

setenv netargs 'setenv bootargs root=/dev/nfs rw ip=${ipaddr}:${serverip}:${serverip}:255.255.255.0:hostname::off nfsroot=${serverip}:${nfsroot},nolock,vers=4,tcp'

ログイン

PICO-PI 電源ON, ログイン画面で
username: ubuntu
pass: temppwd

ログインできれば成功。