目前我是在 Ubuntu 16 的虚拟机环境下做树莓派相关的开发,以下命令用来安装开发必需的环境:
sudo apt-get update
sudo apt-get install bc build-essential git unzip
sudo apt-get install kernel-package libncurses5-dev
接下来,我会在用户目录下创建Rpi目录来存放内核源码以及编译工具
mkdir Rpi
cd Rpi
从GitHub上获取树莓派的内核源码,以 kernel-4.14 内核为例:
git clone --depth=1 -b rpi-4.14.y https://github.com/raspberrypi/linux.git
从GitHub获取树莓派的交叉编译工具:
git clone https://github.com/raspberrypi/tools
目前,在 ~/Rpi 目录下已经有了 linux.tar.bz2 以及 tools.tar.bz2 两个压缩包,解压出来即可。最终内核源码以及编译工具的目录分别为:
~/Rpi/linux
~/Rpi/tools
sudo vi ~/.bashrc
编辑用户目录下的 .bashrc,把编译工具的执行路径加入到 PATH变量中,即在文件末尾加入以下两行:
export PATH=$PATH:$HOME/Rpi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
export PATH=$PATH:$HOME/Rpi/tools/arm-bcm2708/arm-bcm2708-linux-gnueabi/bin
为使环境变量即时生效,可执行:
source .bashrc
当你用树莓派的GPIO连接外设时,通过修改设备树,可以把相关的硬件信息“传给”内核驱动。
树莓派3b+的设备树文件为:
arch/arm/boot/dts/bcm2710-rpi-3-b-plus.dts
首先,可以对内核进行默认的配置
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfig
在此基础上,如果你想要做进一步的配置,可执行:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
在配置界面进行配置并保存退出即可。
你可以把内核镜像、内核模块和设备树一起编译出来:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs -j8
也可以单独编译各个部分:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage -j8
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- modules -j8
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- dtbs
首先需要一张已经写入树莓派系统的内存卡,我们将在内存卡上替换相关的镜像或者文件。
为了知道你的SD卡的对应的dev节点,可以在SD卡的插入前后使用 lsblk 命令来查看以及确定。
在挂接之前需要先建立两个挂接点:
mkdir /mnt/fat32
mkdir /mnt/ext4
接下来把SD卡挂接到虚拟机系统中:
sudo mount /dev/sdb1 /mnt/fat32
sudo mount /dev/sdb2 /mnt/ext4
sudo scripts/mkknlimg arch/arm/boot/zImage /mnt/fat32/kernel7.img
sudo cp arch/arm/boot/dts/*.dtb /mnt/fat32/
sudo cp arch/arm/boot/dts/overlays/*.dtb* /mnt/fat32/overlays/
sudo cp arch/arm/boot/dts/overlays/README /mnt/fat32/overlays/
sudo make ARCH=arm INSTALL_MOD_PATH=/mnt/ext4 modules_install
sudo umount /mnt/fat32
sudo umount /mnt/ext4
完成这些之后,从电脑上拔出SD卡,重新插回树莓派,重新启动树莓派即可。