树莓派原本的系统为:ubuntu-mate-16.04.2-desktop-armhf-raspberry-pi,系统安装后没有附带内核的库。
为了可以在树莓派上使用自己编译的内核程序,我升级了树莓派的系统内核,并用升级时编译的内核库来编译树莓派上的驱动程序(用的是虚拟机Ubuntu16.04 amd64进行交叉编译)。
0、获取源码和编译器
资源链接:https://github.com/raspberrypi
将inux和tools两部分下载(此处内核源码的分支:linux-rpi-4.4.y)
1、生成.config
方法1:使用树莓派的.config
在树莓派上使用命令:
$ sudo modprobe configs
将生成的config.gz拷贝到源码目录下,执行命令:
$ zcat config.gz > .config
方法2:生成一个.config
在源码目录下执行:
$ make ARCH=arm CROSS_COMPILE=../tools-master/arm-bcm2708/arm-linux-gnueabihf/bin/arm-linux-gnueabihf- bcm2709_defconfig
如果生成.config时报错:
curses.h:No such file or directory
执行:$ sudo apt-get install libncurses5-dev libncursesw5-dev
2、编译内核
$ KERNEL=kernel7
$ make ARCH=arm CROSS_COMPILE=../tools-master/arm-bcm2708/arm-linux-gnueabihf/bin/arm-linux-gnueabihf- -j4 zImage modules dtbs
如果编译内核时报错:
fatal error: openssl/opensslv.h: No such file or directory
执行:
$ sudo apt-get install libssl-dev
3、更新树莓派内核
插入树莓派的存储卡,查看分区
$ lsblk
挂载分区
$ cd..
$ mkdir mnt
$ mkdir mnt/fat32
$ mkdir mnt/ext4
$ sudo mount /dev/sdb1 mnt/fat32
$ sudo mount /dev/sdb2 mnt/ext4
3、安装模块
$ cd xxxx(源码目录)
$ sudo make ARCH=arm CROSS_COMPILE=../tools-master/arm-bcm2708/arm-linux-gnueabihf/bin/arm-linux-gnueabihf- INSTALL_MOD_PATH=../mnt/ext4 modules_install
4、拷贝内核文件
$ scripts/mkknlimg arch/arm/boot/zImage ../mnt/fat32/$KERNEL.img//将zImage格式转成树莓派需要的img格式,并复制到SD卡
$ 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 umount ../mnt/fat32
$ sudo umount ../mnt/ext4
5、取出SD卡插入树莓派,启动
6、参考
大神教程:https://blog.csdn.net/u010833052/article/details/78481973#commentBox
官网教程:https://www.raspberrypi.org/documentation/linux/kernel/building.md
7、编译驱动
编译驱动需要使用与内核版本相同的、编译过的库(交叉编译的树莓派内核库,可用于交叉编译驱动,但将这个库拷贝到树莓派上编译驱动(即非交叉编译)会报错。因此,我又用树莓派重新编译了一次内核,成功编译了驱动。)
驱动的编写在另一篇博客上:https://blog.csdn.net/u014695839/article/details/83513710
在x86机器上交叉编译树莓派(arm)驱动时,将Makefile修改为:
KERN_DIR = $(用于交叉编译的内核源码路径)
all:
make -C $(KERN_DIR) M=`pwd` modules ARCH=arm CROSS_COMPILE=/xxx/xxx/tools-master/arm-bcm2708/arm-linux-gnueabihf/bin/arm-linux-gnueabihf-
clean:
make -C $(KERN_DIR) M=$(shell pwd) modules clean
rm -rf modules.order
obj-m := hello.o