前言:树莓派的环境搭建关系到之后的驱动开发,故一个好的环境能让你顺手完成驱动开发!我使用的是64位树莓派4b!有显示屏的前提!!!(因为wifi连接太刁钻了)
一、ubantu相关
1.1、虚拟机环境搭建
下载虚拟机vm,然后建立一个虚拟机,我这边用的ubantu版本是16.04,正点原子的,很稳定这个版本,推荐!
链接:https://pan.baidu.com/s/1r6NEANYDDbs7bg_lmPMeXA?pwd=hsw1
提取码:hsw1
1.2、 ssh、nfs、ftp搭建
使用命令搭建ssh
sudo apt-get install openssh-server
按步骤使用命令搭建nfs
sudo apt-get install nfs-kernel-server rpcbind
sudo vi /etc/exports
#打开/etc/exports 以后在后面添加如下所示内容:
#/home/zuozhongkai/linux/nfs *(rw,sync,no_root_squash)
#/home/zuozhongkai/linux/nfs 改成你想挂载的目录路径
sudo /etc/init.d/nfs-kernel-server restart
ftp使能ubantu使用文件传输软件,快捷传输文件
这个软件自行安装
按步骤使用命令搭建ftp
sudo apt-get install vsftpd
sudo vi /etc/vsftpd.con
#打开 vsftpd.conf 文件以后找到如下两行:
#local_enable=YES
#write_enable=YES
#确保上面两行前面没有“#”,有的话就取消掉
sudo /etc/init.d/vsftpd restart
1.3、交叉编译链的搭建
下载上面链接中的 gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz
使用文件传输软件传到ubantu
然后使用命令解压
tar -xvf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz
使用命令创建一个目录专门存放编译工具
sudo mkdir /usr/local/arm
将解压好的工具改名且cp到该目录下,然后修改环境变量
sudo vi /etc/profile
export PATH=$PATH:/usr/local/arm/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin
#这个export的gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu要根据你的来改
修改好以后就保存退出,重启 Ubuntu 系统,交叉编译工具链(编译器)就安装成功了。
使用前安装依赖
sudo apt-get install lsb-core lib32stdc++6
验证
aarch64-linux-gnu-gcc -v
1.4、内核编译+内核模块编译加载
为什么要编译内核,因为驱动基于内核源码,我们要根据树莓派开发板厂家提供的内核源码对Linux源码进行修剪配置,来适应我们的板子,说白了就是,根据树莓派厂家的描述文件bcm2711_defconfig生成一个适应该板子的配置文件.config,供顶层Makefile使用,Makefile根据这个配置来修剪得到一个适应我们使用的板子的内核,只有使用这个内核,才能正确让树莓派驱动运行,那为什么要加载内核模块,板子使用新编译出来的内核时,板子上原来的其他驱动也要更换为新编译出来的,才能适应我们的板子。所以在编译我们自己的第 1 个驱动程序之前,要先编译内核、模块,并且放到板子上去。
参考:韦东山
使用命令安装编译环境所需的依赖
sudo apt-get install git bison flex libssl-dev zip libncurses-dev make
获取内核源码,建议使用这个
mkdir pi_kernel #创建一个目录存放内核源码
git clone --depth=1 --branch rpi-5.15.y https://github.com/raspberrypi/linux
#如果报错,就多试几次就好了,网络就是这样的
按顺序执行
#获取后得到一个源码目录,改名为linux
cd linux
make distclean #或者make mrproper
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- KERNEL=kernel8 bcm2711_defconfig
make -j3 ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- KERNEL=kernel8
#开始编译
其中,KERNEL=kernel8参考:
编译大概持续40分钟。
编译完成后,在内核源码目录下执行命令加载更新内核模块
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- INSTALL_MOD_PATH=/home/hsw/pi_kernel/linux/ modules_install
#INSTALL_MOD_PATH=/home/hsw/pi_kernel/linux/ 改成自己的路径
得到5.15.92-v8+这个内核模块版本!
这步完成后,我们就得到了3个要更新到树莓派上的东西
(1)Image;内核 位于内核目录/arch/arm64/boot/
(2)dtb;设备树 位于内核目录/arch/arm64/boot/dts/broadcom/
(3)内核模块; 位于INSTALL_MOD_PATH/lib/modules/
至此我们就告一段落!
二、树莓派相关
2.1、镜像烧写
链接:https://pan.baidu.com/s/1La93Og_kUzVTPRlsVPEiAQ?pwd=hsw1
提取码:hsw1
建议使用这个镜像,因为能无显示屏连接wifi
连接WiFi只需2文件和一个读卡器
链接:https://pan.baidu.com/s/1oreylGMvZHX1DwRdy7wD-A?pwd=hsw1
提取码:hsw1
其中wpa_supplicant.conf里面的内容
country=CN
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
ssid="hsw" #换成你的WiFi名称
psk="12345678" #换成你的WiFi密码
}
ssh是使能树莓派的ssh服务
烧好后就插卡上电,电脑开热点,得到ip后使用软件
ssh登录连接 账户:pi 密码:raspberry
2.2、树莓派环境搭建 nfs
我们需要挂载文件来加速我们的开发,使用需要打通开发板与u版图的nfs通信;
按顺序使用命令
sudo apt-get install nfs-kernel-server rpcbind
sudo vi /etc/exports
#打开/etc/exports 以后在后面添加如下所示内容:
/mnt *(rw,sync,no_root_squash)
sudo /etc/init.d/nfs-kernel-server restart
过程如报错
问题根源:源在国外,解决方法:更换源
按顺序执行
sudo nano /etc/apt/sources.list
#将初始化中的代码中默认的官方软件源注释掉#
#添加下面的软件源
deb http://mirrors.aliyun.com/raspbian/raspbian/ buster main contrib non-free rpi
deb-src http://mirrors.aliyun.com/raspbian/raspbian/ buster main contrib non-free rpi
然后,
sudo apt-get update
再去执行我们的命令,就成功了
最后,成功了后,就能挂载了。
挂载测试
mount -t nfs -o nolock,vers=3 192.168.16.128:/home/hsw/linux_tools/nfs /mnt
#192.168.16.128是我u版图的wifi ip地址 换成你的
使用命令进入su,密码我们要换一个
sudo passwd root
在执行
su
进入root,然后再执行挂载命令,会显示卡住,别急,回到u版图执行命令
sudo sudo mount -t nfs 192.168.137.50:/mnt /home/hsw/linux_tools/nfs -o nolock
#192.168.137.50是我的开发板树莓派的ip 换成你的
#/home/hsw/linux_tools/nfs是我的ubantu挂载目录路径 换成你的
此时,已经挂载成功,可以在ubantu挂载路径下mkdir一个目录,然后回到开发板会发现出现mkdir的目录。
2.3、更新内核及内核模块
在做这步之前我们先用命令查看一下树莓派出厂的内核版本
uname -r
uname -a
这个是有依据的
pi4加载默认是这个5.10.63-v7l+,且是armv7l模式。
接下来,我们用读卡器吧树莓派sd卡插回电脑。
先在虚拟机~目录下创建2个空文件
cd ~
mkdir data1
mkdir data2
然后挂载,
sudo mount /dev/sdb1 ~/data1
sudo mount /dev/sdb2 ~/data2
复制boot所需文件,安装内核模块
sudo cp linux/arch/arm64/boot/dts/broadcom/*.dtb ~/data1
sudo cp linux/arch/arm64/boot/dts/overlays/*.dtb* ~/data1/overlays/
sudo cp linux/arch/arm64/boot/dts/overlays/README ~/data1/overlays/
# 复制内核
sudo cp linux/arch/arm64/boot/Image ~/data1/kernel8.img
#以上路径改成自己的内核下的xxx
sudo cp -r lib/modules/ ~/data2/lib/
#lib/modules/改成 INSTALL_MOD_PATH的值,这个是内核模块加载时的路径
卸载sd卡
sudo umount ~/data1
sudo umount ~/data2
插回树莓派。
打开终端,编写config.txt
sudo vi /boot/config.txt
# 在末尾!!!添加内容并保存退出
arm_64bit=1
kernel=kernel8.img
重启树莓派,reboot
打开终端,再输入
uname -r
uname -a
就变成我们编译的内核版本了。
三、常见错误
3.1、加载内核模块
这个错误就是因为没有更新板子上的内核
那你如果按照我的步骤一步一步来,就不会这样!
而是会成功加载进来,如下:
3.2、
在树莓派执行./app 文件时报错:没有那个文件或者目录。
那就到/bin下面file一下bash,如图,是32位的,
在file一下app文件,如图,是64位的。
64位兼容32位,而32位不行,
所以我们的交叉编译工具要变成32位的。
3.3、
问题的原因是切换内核版本后,驱动的加载出现了异常。
需要使用命令,进入到使用的内核版本目录,比如我的是5.15.92-v8+,进入后,使用命令
sudo depmod
重新加载一下内核驱动模块。
这时可能报错
这怎么解决?
回到u版图的内核源码目录,重新下载驱动模块
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- INSTALL_MOD_PATH=/home/hsw/pi_kernel/linux/ modules_install
#INSTALL_MOD_PATH=/home/hsw/pi_kernel/linux/ 改成自己的路径
再弄到树莓派上,再去sudo depmod这次就不会报错了,完成后,reboot就可以发现WiFi好了。
四、总结
到此,我们就把驱动环境都搭建好了,下篇我们将讲驱动开发的实际操作了!