安装 linux 发行版至 RDA NAND
这篇文章基于 OrangePi 2G-IOT,教我们如何在 NAND 上面构建 linux,通过自定义的 bootloader 去启动它,烧写工具是由 Github user“aib”写的。Orange Pi 2G-IOT 采用 RDA8810 作为 soc,具备 2G 的通话功能,内置 256 DDR,512 NAND FLASH(Toshiba TC58NYG2S0H 4G 1.8V 8-bit)。
这里首先感谢 Github user “aib” 和 “txurtxil” 帮助解决这个问题。
- 烧写Dietpi Image 至 TF 卡,并扩容分区
- 安装mtd-utils
- 烧写Dietpi Image 至 TF 卡,并扩容分区
镜像下载地址:
http://pan.baidu.com/s/1skUxIX3
密码:嗯e
解压得到 dietpi_OrangePi-2G-IOT_sdcard.img
准备一张 8G 的 class10 的 TF 卡,注意因为电流问题 8G 以上的 TF 卡无法启动。
$ sudo dd bs=1M if=dietpi_OrangePi-2G-IOT_sdcard.img of=/dev/sd* && sync
使用 Gparted 对 TF 卡进行分区扩容,具体步骤如下:
注意:
1.用户名 dietpi 密码 dietpi 管理员用户 root 密码 dietpi 。
2.网络配置在/boot/network下,由于/boot是fat分区,所以可以把sd卡插到电脑/手机上进行修改。
3.串口调试波特率为921600 。
- 安装mtd-utils
$ sudo apt-get update
$ sudo apt-get install -y mtd-utils
- 拷贝镜像本身的文件系统,并同步
$ vim ~/nandfs/mknandfs.sh
#!/bin/bash
set -euo pipefail
set -x
SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
SRC="$SCRIPT_DIR"
DEST_ROOT="$SCRIPT_DIR"/nandroot
rsync -a -x --delete --delete-excluded / /boot "$DEST_ROOT" -f "merge $SRC/cpfs.filter" -v
cp "$SRC"/fstab "$DEST_ROOT"/etc/fstab
$ vim ~/nandfs/cpfs.filter
+ /home/orangepi/.bash_logout
+ /home/orangepi/.bashrc
+ /home/orangepi/.profile
+ /home/orangepi/**
+ /var/backup/**
+ /var/cache/**
+ /var/lib/apt/lists/**
+ /var/log/**
+ /var/tmp/**
+ /usr/share/doc/**
+ /usr/share/man/**
+ __pycache__
+ *.pyc
$ chmod +x mknandfs.sh
$ sudo ~/nandfs/mknandfs.sh
我们可以得到 nandroot 的目录,里面是原生的文件系统
- 需要修改/etc/fstab这个文件,和重新写 boot.scr 的启动文件
$ vim ~/nandfs/fstab
ubi0:nandroot / ubifs defaults 0 1
tmpfs /tmp tmpfs nodev,nosuid,mode=1777 0 0
此外我们还要修改启动参数:
$ vim /boot/boot-nand.cmd
setenv ubiargs "ubi.mtd=1"
setenv rootdev "ubi0:nandroot"
setenv rootfstype "ubifs"
setenv bootargs "${ubiargs} ${mtdparts} root=${rootdev} rootwait rootfstype=${rootfstype} console=ttyS0,921600 panic=10 consoleblank=0 loglevel=8 ${extraargs} ${extraboardargs}"
ubifsload ${initrd_addr} "/boot/uInitrd"
ubifsload ${kernel_addr} "/boot/zImage"
ubifsload ${modem_addr} "/boot/modem.bin"
mdcom_loadm ${modem_addr}
mdcom_check 1
bootz ${kernel_addr} ${initrd_addr}
用下面的命令生成 boot-nand.scr
$ sudo mkimage -C none -A arm -T script -d /boot/boot-nand.cmd /boot/boot-nand.scr
重新生成了 boot-nand.scr 和 fstab,我们需要重新执行一次 mknandfs.sh
$ sudo ~/nandfs/mknandfs.sh
- 制作 ubi 的 镜像文件
我们需要用 mkfs.ubifs 制作 nandroot.img 的 img 镜像文件
$ vim ~/nandfs/mkubifs.sh
#!/bin/bash
set -euo pipefail
set -x
SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
DEST_ROOT="$SCRIPT_DIR"/nandroot
DEST_FS_IMG="$SCRIPT_DIR"/nandroot.img
MAX_LEB=2000
mkfs.ubifs -e 248KiB -m 4096 -c $MAX_LEB -r "$DEST_ROOT" -o "$DEST_FS_IMG"
$ chmod +X /nandfs/mkubifs.sh
$ sudo ~/nandfs/mkubifs.sh
用 ubinize 去创建一个 UBI image
$ vim ubinize.ini
[nandroot-volume]
mode=ubi
image=/home/orangepi/nandfs/nandroot.img
vol_id=0
vol_name=nandroot
vol_size=480MiB
vol_type=dynamic
vol_alignment=1
$ vim ~/nandfs/mkubi.sh
#!/bin/bash
set -euo pipefail
set -x
SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
SRC="$SCRIPT_DIR"
DEST_UBI_IMG="$SCRIPT_DIR"/ubi.img
ubinize -p 256KiB -m 4096 "$SRC"/ubinize.ini -o "$DEST_UBI_IMG"
$ sudo ~/nandfs/mkubi.sh
得到 ubi.img 这个镜像文件
- 制作 u-boot.rda 和 pdl1.bin 和 pdl2.bin
下载源码编译
$ git clone https://github.com/aib/u-boot-RDA8810.git
$ cd u-boot-RDA8810
$ git checkout nand-boot
编译得到 pdl.bin
$ make CROSS_COMPILE=arm-none-eabi- clean rda8810_config
$ make CROSS_COMPILE=arm-none-eabi- pdl=1 PDL
会生成 pdl1.bin 和 pdl2.bin
编译得到 u-boot.rda
$ make CROSS_COMPILE=arm-none-eabi- clean rda8810_config
$ make CROSS_COMPILE=arm-none-eabi-
- 使用 opi2g_nand_write.py 烧录 ubi.img 和 bootloader
先把拨码开关拨成1234上,5678下,拨成 nand 启动,上电按住按键5S,就可以看到/dev/ttyACM0,也就是 OTG MODE。
记住把生成的 pdl1.bin pdl2.bin u-boot.rda ubi.img,放在和opi2g_nand_write.py统计目录下
$ sudo python3 opi2g_nand_write.py -p /dev/ttyACM0 --format-flash --pdl1 pdl1.bin --pdl2 pdl2.bin bootloader:u-boot.rda nandroot:ubi.img
执行会先擦除,再烧录