把当年Google送的Android Things开发板变成“树莓派”

By | 2024-11-26

当年google赠送的android iot设备不好玩,安装一个Linux当标准系统用,以下内容参考了英文一些嵌入式社区,以及自己的摸索实现。
截止到2022年10月本文有效。目前linux内核部分现在已经更新到6.x可尝试自己实现。
1、编译服务器准备
我选择debian,需要安装的插件或者说是库文件,为了避免问题,需要请自行解决内网问题。并且在非root环境下进行

sudo apt install libusb-dev gawk wget git-core diffstat unzip texinfo build-essential chrpath libsdl1.2-dev xterm curl libusb-1.0-0-dev device-tree-compiler bison flex lzop bc lzma gettext libmpc-dev u-boot-tools libncurses5-dev:amd64 libssl-dev:amd64

2、编译usb_loader

git clone https://github.com/boundarydevices/imx_usb_loader
cd imx_usb_loader/
make

3、gcc环境

wget -c https://releases.linaro.org/components/toolchain/binaries/6.5-2018.12/arm-linux-gnueabihf/gcc-linaro-6.5.0-2018.12-x86_64_arm-linux-gnueabihf.tar.xz
tar xf gcc-linaro-6.5.0-2018.12-x86_64_arm-linux-gnueabihf.tar.xz
export CC=`pwd`/gcc-linaro-6.5.0-2018.12-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-

检查交叉编译器

user@localhost:~$ ${CC}gcc --version

arm-linux-gnueabihf-gcc (Linaro GCC 6.5-2018.12) 6.5.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

注意版本
4、编译uboot

git clone -b v2019.07-rc4 https://github.com/u-boot/u-boot --depth=1
git clone -b v2020.10 https://github.com/u-boot/u-boot --depth=1
cd u-boot/
make ARCH=arm CROSS_COMPILE=${CC} distclean
make ARCH=arm CROSS_COMPILE=${CC} pico-pi-imx7d_defconfig
make ARCH=arm CROSS_COMPILE=${CC}

将开发板调成bootload usb模式
image

lsusb | grep Freescale
Bus 00x Device 00y: ID 15a2:0076 Freescale Semiconductor, Inc

查看是否有以上设备,imx7d的开发板使用了一个microusb来进行debug,系统中会出现一个ttyUSBX的串口可以用minicom来操作,一个usbc进行传输数据, 以上操作可以把两个端口全部连接到电脑上。

5、在u-boot目录下操作

sudo ~/imx_usb_loader/imx_usb SPL
sudo ~/imx_usb_loader/imx_usb u-boot-dtb.img

打开minicom的端口,中断usbbootloader的运行。
minicom串口请自行配置

Loading Environment from MMC... OK
In:    serial
Out:   serial
Err:   serial
Net:   FEC0
Hit any key to stop autoboot:  0 
=> 
=> env default -f -a
=> saveenv
=> mmc partconf 0 0 7 0
=> dfu 0 mmc 0

以上几步为重置配置,保存分区mmc存储进入dfu准备下载

user@localhost:~/u-boot$ 下进入下载配置模式
sudo dfu-util -D SPL -a spl
sudo dfu-util -R -D u-boot-dtb.img -a u-boot

下载uboot。
以上我们梳理一下流程,
1、先编译imx-bootloader工具。
2、把设备的设备的uboot更新。
3、在uboot下把设备的mmc分区,并使用dfu工具把更新后的uboot写入mmc**

6、好的,完成以上操作以后就可以下载内核了,把设备重置为emmc boot模式

Loading Environment from MMC... OK
In:    serial
Out:   serial
Err:   serial
Net:   FEC0
Hit any key to stop autoboot:  0 
=> ums 0 mmc 0

uboot启动后中断,把mmc设置成u盘模式
此时linux系统会有如下设备被挂载

lsusb | grep Netchip
Bus 00x Device 00y: ID 0525:a4a5 Netchip Technology, Inc. Pocketbook Pro 903

7、编译Linux内核
在~目录下

git clone https://github.com/RobertCNelson/armv7-lpae-multiplatform
cd armv7-lpae-multiplatform/

这里使用了lpae支持内核,不开启lpae的内核,可自行尝试。

git checkout origin/v5.1.x -b tmp

切换到5.1内核,虽然是stable的,但是我觉得其实可以找找一个Ltsc内核比如5.4
然后直接编译.

./build_kernel.sh

没有软件缺失的话会自动编译出内核。
7、rootfs系统处理
可选择https://rcn-ee.com处理好的文件系统 用户名称密码如下
Debian 10
debian temppwd
root root

wget -c https://rcn-ee.com/rootfs/eewiki/minfs/debian-10.4-minimal-armhf-2020-05-10.tar.xz
tar xf debian-10.4-minimal-armhf-2020-05-10.tar.xz

ubuntu 20.04
ubuntu temppwd

wget -c https://rcn-ee.com/rootfs/eewiki/minfs/ubuntu-20.04-minimal-armhf-2020-05-10.tar.xz
tar xf ubuntu-20.04-minimal-armhf-2020-05-10.tar.xz

然后在第6中系统的MMC在linux系统下会被挂载为一个存储分区,使用lsblk来查看是否有这个分区,注意区分是sdX设备还是mmcblpX设备。
用lsblk找到磁盘,如果是sdX设备

export DISK=/dev/sdb

mmcblkX设备

export DISK=/dev/mmcblk0

擦除磁盘

sudo dd if=/dev/zero of=${DISK} bs=1M count=10

再写一遍uboot的img文件。

sudo dd if=./u-boot/SPL of=${DISK} seek=1 bs=1k
sudo dd if=./u-boot/u-boot-dtb.img of=${DISK} seek=69 bs=1k

重新分区,注意这里使用sfdisk
sudo sfdisk —version 如果版本大于等于2.26使用脚本

sudo sfdisk ${DISK} <<-__EOF__
1M,,L,*
__EOF__

小于2.25

sudo sfdisk --unit M ${DISK} <<-__EOF__
1,,L,*
__EOF__

不同挂载设备用不同方法注意

for: DISK=/dev/mmcblkX
sudo mkfs.ext4 -L rootfs ${DISK}p1
for: DISK=/dev/sdX
sudo mkfs.ext4 -L rootfs ${DISK}1

挂载设备拷贝文件

udo mkdir -p /media/rootfs/
for: DISK=/dev/mmcblkX
sudo mount ${DISK}p1 /media/rootfs/
for: DISK=/dev/sdX
sudo mount ${DISK}1 /media/rootfs/

上一部编译内核的时候完成后会有提示

Script Complete
eewiki.net: [user@localhost:~$ export kernel_version=5.X.Y-Z]

设定环境变量
在~$路径下

export kernel_version=5.X.Y-Z

拷贝根文件系统,并设定文件权限

sudo tar xfvp ./*-*-*-armhf-*/armhf-rootfs-*.tar -C /media/rootfs/
sync
sudo chown root:root /media/rootfs/
sudo chmod 755 /media/rootfs/

设置引导

sudo mkdir -p /media/rootfs/boot/extlinux/
sudo sh -c "echo 'label Linux ${kernel_version}' > /media/rootfs/boot/extlinux/extlinux.conf"
sudo sh -c "echo '    kernel /boot/vmlinuz-${kernel_version}' >> /media/rootfs/boot/extlinux/extlinux.conf"
sudo sh -c "echo '    append root=/dev/mmcblk2p1 ro rootfstype=ext4 rootwait quiet' >> /media/rootfs/boot/extlinux/extlinux.conf"
sudo sh -c "echo '    fdtdir /boot/dtbs/${kernel_version}/' >> /media/rootfs/boot/extlinux/extlinux.conf"

拷贝内核
sudo cp -v ./armv7-lpae-multiplatform/deploy/${kernel_version}.zImage /media/rootfs/boot/vmlinuz-${kernel_version}
拷贝驱动

sudo mkdir -p /media/rootfs/boot/dtbs/${kernel_version}/
sudo tar xfv ./armv7-lpae-multiplatform/deploy/${kernel_version}-dtbs.tar.gz -C /media/rootfs/boot/dtbs/${kernel_version}/

拷贝内核模块

sudo tar xfv ./armv7-lpae-multiplatform/deploy/${kernel_version}-modules.tar.gz -C /media/rootfs/

设定磁盘挂载

sudo sh -c "echo '/dev/mmcblk2p1  /  auto  errors=remount-ro  0  1' >> /media/rootfs/etc/fstab"

完成后卸载挂载磁盘

sync
sudo umount /media/rootfs

debug的端口停止磁盘Usb挂载模式,重启设备

Loading Environment from MMC... OK
In:    serial
Out:   serial
Err:   serial
Net:   FEC0
Hit any key to stop autoboot:  0 
=> ums 0 mmc 0
UMS: LUN 0, dev0, hwpart 0, section 0x0, count 0x720000
Ctrl+C to exit ...
=> reset

如果正常系统会进入操作系统,然后删除不必要的模块和软件,保证4G存储可用容量。