树莓派3b内核和驱动的交叉编译

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014695839/article/details/83720145

树莓派原本的系统为: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

猜你喜欢

转载自blog.csdn.net/u014695839/article/details/83720145