环境介绍
最近在学习 ARM Linux 驱动开发,由于手头的 ARM 开发板版本太老,和教程里用的驱动内核相差太多,于式打算用树莓派 3B 来进行学习。
要用树莓派开发内核,就必须先让树莓派跑上自己编译的内核,否则 insmod 会执行失败
教程介绍了如何交叉编译树莓派 3B 内核并运行 ko 模块, 本教程不再使用虚拟机,而是使用 win10 的 WSL 搭配 vscode 进行开发
硬件:WIN10 电脑 、树莓派
WSL 安装
参考:win10 安装 WSL
注意:我安装的是 Ubuntu18.4,使用的是 WSL1,WSL1 完全够用。当然 WSL2 也是可以的。
安装 VSCode
很简单,下载安装就行了,然后安装 Remote WSL 插件,喜欢折腾的朋友可以再装几个插件。
主要是配置方面需要介绍,文章后面会进行补充。
连接树莓派
连接树莓的方法多种多样,有树莓派的朋友应该都会吧。我采用的是 ssh 的方式,树莓派通过 wifi 连接路由器,电脑也是通过 wifi 连接同一个路由器。
- 树莓派系统烧录: 资源下载
- 连接 SSH 树莓派默认是关闭 SSH 的,打开方法:烧录好后在 boot 目录下新建一个 SSH 文件
为树莓派安装 sz、rz
开发过程中需要频繁地在 PC 和树莓派间传输文件,传输方法也很多,这里使用 sz 和 rz
使用方法:
下载内核源码与工具
- 查看当前树莓派内核版本 uanme -a
- 下载对应版本的内核,比如我的是 4.19.97
注意:这里有很多版本,一定要选对版本,否则编译后可能开不了机
如何找到自己版本内核呢?可以看树莓派官网的 raspberrypi OS 的 release note 点这里打开
比如我的是 4.19.79,可以看出日期是 2020-02-13 和 2020-02-05
下载对应的代码即可
下载前可以看下 Makefile 的 log 是不是对的
配置交叉编译环境
- 打开 wsl,把内核源码和工具拷贝到 wsl 中
- 配置交叉编译环境
~/tools/raspberrypi-tools/arm-bcm2708
目录下有几个交叉编译工具,我们使用的 WSL 是 64 位的,所以使用gcc-linaro-arm-linux-gnueabihf-raspbian-x64
- 下载一些依赖 (这是我从其它教程里抄的,不一定全,大家编译出错以后百度一下,一般很容易搜到少了哪个依赖)
编译内核
- 进入内核源码目录,修改 Makefile
这一步的作用:我们在 make 后需要带上两个参数 如:make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- ,这两个参数最后传递给 Makefile,如果我们在 Makefile 中直接写死,就可以直接输入 make 就行了。
2. 从树莓派获取 config 文件
内核编译执行 make menuconfig 时会默认读取. config 文件,里面配置了内核会编译哪些模块,不编译哪些模块
- 执行
make menuconfig
并重新保存. config
虽然已经有了. config 文件,但最好还是执行下 make menuconfig,然后重新保存一下(原因我也不清楚。。。)
这一步和下一步一般第一次编译都会出错,原因是系统有些东西没有安装,百度很容易找到答案
- 编译内核
- 拷贝内核到树莓派
- 树莓派重启后
uname -a
看下日期,如果没问题的话应该已经是自己编译的内核了
用 VSCode 编译内核驱动
- 先写个驱动小 demo
- Makefile 文件
- led.c 文件
- 打开 VSCode,点击左下角图标,选择 WSL
- 用 VSCode 打开自己驱动的文件夹
WSL 系统路径:
C:\Users\liujh\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs\root
- VSCode 配置
打开后会显示很多头文件找不到,编写代码的时候也不会有补全,使用下面的配置方法可以解决大部分问题。
文件:
驱动代码路径/.vscode/Settings.json
另外还可以直接再 VSCODE 中打开一个 WSL 终端,非常方便。
> 本文由简悦 SimpRead 转码