作者:杨文
在树莓派的系统中,提供了很多的现成的驱动程序和资源,尽管这样,还是远远不能适用于大部分情况下的设计使用,所以在使用某些设备时,需要自行编写或者修改一些驱动,以适用于想要控制的设备。编写linux驱动,需要内核源码树,所以编写驱动的第一步就是移植内核,以获得内核源码树。
1.1开发环境系统ubuntu 16(64位),在PC上安装虚拟机。
1.2树莓派系统为 ubuntu 16.04,(官方的系统为Raspbian,不过树莓派支持很多系统,这里用ubuntu因为UI看着更爽),树莓派官网下载。
1.3下载源码:https://github.com/raspberrypi
Linux:树莓派内核源码
tools:树莓派的交叉编译工具
注意:要下载系统对应的源码,我现在系统是4.4.38,所以下载4.4.y。
下载方式:
(1)网页下载
直接下载zip
(2)命令下载
Git clone --depth=1 https://github.com/raspberrypi/linux
git clone https://github.com/raspberrypi/tools
保存路径为~/Raspberry/下
2.1查看当前树莓派编译器的信息
root@raspberrypi:~# cat /proc/version
linux version 4.4.38-v7+ (dc4@dc4-XPS13-9333) (gcc version 4.9.3 (crosstool-NG crosstool-ng-1.22.0-88-g8460611) ) #894 SMP Mon Jun 13 13:13:27 BST 2016
2.2 确定交叉编译工具
root@ubuntu:~/Raspberry/tools-master/arm-bcm2708# ls
arm-bcm2708hardfp-linux-gnueabi
arm-bcm2708-linux-gnueabi
arm-rpi-4.9.3-linux-gnueabihf
gcc-linaro-arm-linux-gnueabihf-raspbian
gcc-linaro-arm-linux-gnueabihf-raspbian-x64
此目录下有5个目录,是不同版本的交叉编译工具。其中arm-rpi-4.9.3-linux-gnueabihf和gcc-linaro-arm-linux-gnueabihf-raspbian-x64是64位机器用的。
每一个交叉编译工具的目录下都有bin目录进入,执行./arm-linux-gnueabihf-gcc -v可查看gcc版本。
这里我使用arm-rpi-4.9.3-linux-gnueabihf,因为目前板子上的gcc版本是4.9.3
3.1 进入linux内核目录:
$ cd ~/Raspberry/linux-rpi-4.4.y
$ 修改内核根目录的Makefile文件,修改下面的这两行
ARCH ?=arm
CROSS_COMPILE ?=/home/xxx/Raspberry/tools-master/arm-bcm2708/arm-rpi-4.9.3-linux-gnueabihf/bin/arm-linux-gnueabihf-
(xxx表示你自己的用户名)
$ KERNEL=kernel7
$ make bcm2709_defconfig
Note:如果是多处理系统可以添加选项-j n ,n为数字,表示多处理器的数量*1.5。可以加快编译速度
$ make -j4 zImage modules dtbs
3.2 创建目录modules
在linux内核目录顶层下创建modules目录。
$ mkdir modules
$ make INSTALL_MOD_PATH=modules modules_install
3.3 将SD卡插入读卡器,插入电脑,在虚拟机读取SD卡。
在/media/xxx/ 目录下会出现两个目录 PI_BOOT/ PI_ROOT/
执行命令
sudo
scripts
/mkknlimg
arch/arm/boot/zImage /media/xxx/PI_BOOT/$KERNEL.imgsudo cp arch/arm/boot/dts/*.dtb /media/xxx/PI_BOOT/
sudo cp arch/arm/boot/dts/overlays/*.dtb* /media/xxx/PI_BOOT/overlays/
sudo cp arch/arm/boot/dts/overlays/README /media/xxx/PI_BOOT/overlays/
sudo cp -r modules/lib/ /media/xxx/PI_ROOT/
联系客服