赞
踩
下载虚拟机vm,然后建立一个虚拟机,我这边用的ubantu版本是16.04,正点原子的,很稳定这个版本,推荐!
链接:https://pan.baidu.com/s/1r6NEANYDDbs7bg_lmPMeXA?pwd=hsw1
提取码:hsw1
使用命令搭建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
下载上面链接中的 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
为什么要编译内核,因为驱动基于内核源码,我们要根据树莓派开发板厂家提供的内核源码对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/
至此我们就告一段落!
链接: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
我们需要挂载文件来加速我们的开发,使用需要打通开发板与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的目录。
在做这步之前我们先用命令查看一下树莓派出厂的内核版本
- 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
就变成我们编译的内核版本了。
这个错误就是因为没有更新板子上的内核
那你如果按照我的步骤一步一步来,就不会这样!
而是会成功加载进来,如下:
在树莓派执行./app 文件时报错:没有那个文件或者目录。
那就到/bin下面file一下bash,如图,是32位的,
在file一下app文件,如图,是64位的。
64位兼容32位,而32位不行,
所以我们的交叉编译工具要变成32位的。
问题的原因是切换内核版本后,驱动的加载出现了异常。
需要使用命令,进入到使用的内核版本目录,比如我的是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好了。
到此,我们就把驱动环境都搭建好了,下篇我们将讲驱动开发的实际操作了!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。