《Linux驱动开发(一)—环境搭建与hello world》
《Linux驱动开发(二)—驱动与设备的分离设计》
《Linux驱动开发(三)—设备树》
继续宣传一下韦老师的视频
70天30节Linux驱动开发快速入门系列课程【实战教学、技术讨论、直播答疑】
不过受限于没有钱的烦恼,没去买那么贵的开发板,我决定用树莓派来继续驱动开发的学习。所以需要先搭建一个树莓派的开发环境,能够编译内核模块,并且能够修改DTS,才能进行下一步的学习。
我这里的宿主机安装的ubuntu18,64位的。安装好系统之后,需要安装一些必要软件
sudo apt update
sudo apt install net-tools
sudo apt-get install openssh-server
sudo apt-get install git
sudo apt install git bc bison flex libssl-dev make libc6-dev libncurses5-dev
编译32位系统
sudo apt install crossbuild-essential-armhf
编译64位系统
sudo apt install crossbuild-essential-arm64
git clone --depth=1 https://github.com/raspberrypi/linux
我用的是3b+的板子,首先要生成配置文件,其实就是把默认配置拷贝过来。
cd linux
KERNEL=kernel7
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfig
如果是其他的,
树莓派 1, Zero and Zero W, 树莓派 Compute Module 1:
cd linux
KERNEL=kernel
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcmrpi_defconfig
树莓派 2, 3, 3+ and Zero 2 W, and 树莓派Compute Modules 3 and 3+:
cd linux
KERNEL=kernel7
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfig
树莓派 4 and 400, and 树莓派 Compute Module 4:
cd linux
KERNEL=kernel7l
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2711_defconfig
然后根据配置文件进行编译全部内容
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs
到此,编译内核的过程就完毕了。
首先需要把SD卡通过读卡器接入ubuntu这个编译服务器,然后能看到sdb设备
pgg@ubuntu:~$ ls /dev/sd
sda sda1 sdb sdb1 sdb2
其中,sdb1是FAT文件系统(引导)分区,sdb2是ext4文件系统(根)分区。
然后分别挂载这两个设备,我这里用了绝对路径,和官方的不太一样。
mkdir -p /home/pgg/mnt
mkdir -p /home/pgg/mnt/fat32
mkdir -p /home/pgg/mnt/ext4
sudo mount /dev/sdb1 /home/pgg/mnt/fat32
sudo mount /dev/sdb2 /home/pgg/mnt/ext4
通过mount命令可以查看
然后将编译好的kernel模块安装到SD卡
32位系统安装命令:
sudo env PATH=$PATH make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=/home/pgg/mnt/ext4 modules_install
64位系统安装命令
sudo env PATH=$PATH make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- INSTALL_MOD_PATH=/home/pgg/mnt/ext4 modules_install
最后,拷贝内核和设备树,
32位系统安装命令
sudo cp /home/pgg/mnt/fat32/$KERNEL.img /home/pgg/mnt/fat32/$KERNEL-backup.img
sudo cp arch/arm/boot/zImage /home/pgg/mnt/fat32/$KERNEL.img
sudo cp arch/arm/boot/dts/*.dtb /home/pgg/mnt/fat32/
sudo cp arch/arm/boot/dts/overlays/*.dtb* /home/pgg/mnt/fat32/overlays/
sudo cp arch/arm/boot/dts/overlays/README /home/pgg/mnt/fat32/overlays/
sudo umount /home/pgg/mnt/fat32
sudo umount /home/pgg/mnt/ext4
64位系统安装命令
sudo cp /home/pgg/mnt/fat32/$KERNEL.img /home/pgg/mnt/fat32/$KERNEL-backup.img
sudo cp arch/arm64/boot/Image /home/pgg/mnt/fat32/$KERNEL.img
sudo cp arch/arm64/boot/dts/broadcom/*.dtb /home/pgg/mnt/fat32/
sudo cp arch/arm64/boot/dts/overlays/*.dtb* /home/pgg/mnt/fat32/overlays/
sudo cp arch/arm64/boot/dts/overlays/README /home/pgg/mnt/fat32/overlays/
sudo umount /home/pgg/mnt/fat32
sudo umount /home/pgg/mnt/ext4
另一种选择是将内核复制到同一个位置,但使用不同的文件名,例如kernel-a.img,并不是覆盖内核。
然后可以config.xt文件来选择Raspberry Pi将引导的内核:
例如
kernel=kernel-a.img
这样做的好处是将自定义内核与系统和任何自动更新工具管理的库存内核映像分开,并允许您在内核无法启动时轻松还原到库存内核。
就是一个内核选择启动
最后插回SD卡,重启。
一个好消息,系统成功启动,基本正常。
一个坏消息,无线网卡没有了,只能用有线连接网络。这个问题后边再查。不能耽误学习进度。
今天的热门应该是前某大公司DD被罚了80个亿,理由是各种违法违规的操作,手机用户信息啥的,不过试想手机里哪个APP不是如此,连手机本身都成了窃听器了。
不过人家也是无利不起早,只要我够穷,就不会被他们利用。