哈喽,大家好。我是小仲。板子在3.31号就收到了,但是,由于最近一直很忙,拖到了现在才开始搭建环境。接下来的一段时间,会基于野火IMX6ULL开发板写一系列教程,主要侧重于驱动和内核的调试技巧。这方面的文章,我也是第一次写,过程中可能会踩不少坑,可能更新时间间隔会很。如果有写的不好的,大家可以及时指出,有任何意见和建议也可以联系我。 今天分享的是本次测评的第一篇文章,开发板的搭建环境教程。 本文由嵌入式与Linux那些事创作,未经作者授权,禁止转载。
1. 开箱测评
1.1 资料下载
野火资料下载链接如下。
综合资料百度云:https://pan.baidu.com/s/1kJdJ6xc12Yg4rPby_MatDA 提取码:4u7d
在线文档:http://doc.embedfire.com/linux/imx6/base/
第一期-零基础入门篇-47集 :https://www.bilibili.com/video/BV1JK4y1t7io
第二期-内核编程篇-20集 :https://www.bilibili.com/video/BV1PK411T7MA
第三期-裸机开发篇-21集 :https://www.bilibili.com/video/BV1JK4y1Y7xQ
第四期-驱动开发篇-82集 :https://www.bilibili.com/video/BV1pf4y1974n
全部视频云盘下载:https://pan.baidu.com/s/1jp15pPk5gCF3q2IKDF_95A 提取码:wcfa
视频课件云盘下载:https://pan.baidu.com/s/1NM47YIOC6JWu95uCDZ0NyA 提取码:a0h9
视频课件仓库 :https://gitee.com/Embedfire-imx6/embed_linux_tutorial_ppt
建议观看在线文档。本地下载的pdf版本会有一些错误。
1.2 开发板简介
之前学习驱动开发一直使用的是韦老师的S3C2440,搭配韦老师的第二期视频一起学习,效果很不错。由于马上要工作了,所以,想换一个新一点的平台,熟悉下环境。正好看到了电子芯吧客的试用申请,于是,寒假在家的时候就提交了申请。今天终于收到了这块板子,话不多说,开箱测评。
这么大一个袋子,快递包裹的挺严实,里面塞了气泡膜,保护工作很到位。
精致的盒子,来一张全家福,包括开发板,电源,两根USB线。
本次使用的是野火的IMX6ULL的NAND版本,具有512MB的NAND-FLASH,主频为800MHZ。开发板的底板资源接口如下图所示。野火提供了丰富的资料,对照教程我们可以轻松的让开发板跑起来。
2. 环境搭建
2.1 烧写镜像到SD卡
由于本次使用的开发板为512M Nand 版本,因此,强烈建议大家准备一个2G以上的SD卡,将Debian镜像放在SD卡中,将开发板设置为SD卡启动。否则,只能烧写Debian镜像的纯净版。
烧写镜像文件,使用的是Etcher工具,在官网(https://www.balena.io/etcher/)可以根据自己电脑系统,进行下载。
野火的镜像分为四个版本,在百度网盘可以下载到。(http://products.embedfire.com/zh_CN/latest/linux/ebf_i.mx6ull.html#debian)
imx6ull-debian-buster-console-armhf-2020-04-09.img.xz:Debian 的纯净版固件,没有带桌面环境和野火的QT App。(解压后约340M)
imx6ull-debian-buster-desktop-armhf-2020-04-09.img.xz:带有桌面环境的Debian 固件,系统启动后会进入桌面环境。(解压后约1.1G)
imx6ull-debian-buster-full-qt-app-armhf-2020-04-09.img.xz::具有完整QT App 功能的Debian 固件, 系统启动后会进入QT App 的界面。 但是该固件体积超过了Nandflash 512M 的容量,因此不能烧录到Nandflash 中。只可烧录于eMMC。(解压后约900M)
imx6ull-debian-buster-part-qt-app-armhf-2020-04-09.img.xz:该固件移除了音视频播放功能的QT App,系统启动后会进入QT App 的界面。 该固件体积小于Nandflash 512M 的容量,可以分别烧录到Nandflash 和eMMC 中。(解压后约420M)
点击以下两个按钮,选择合适的镜像,烧录即可。
烧录完成后,将开发板上的拨码开关的2-5-8位拨到on,其他位拨到0,即可启动。
2.2 挂载NFS网络文件系统
2.2.1 本机和虚拟机互ping
本教程中,使用的是Ubuntu18.03,在野火的资料包中可以找到Ubuntu18.03版本,在虚拟机中安装好即可。
尝试将开发板,本机,虚拟机连接在同一网段,在本机使用ipconfig
命令,查看本机ip地址。记下这个地址,202.193.61.216。
在ubuntu18.04中,使用ifconfig
命令查看ip地址,但是报错了。
根据提示,使用 sudo apt install net-tools
命令,安装网络工具。
以上说明apt被某个进程锁住了,找到进程,kill 就完了,如下:
强制重新配置软件包,升级下apt,但是又报错。
使用指令sudo rm /var/lib/dpkg/lock-frontend
,sudo rm /var/lib/dpkg/lock
删除占用进程
使用指令sudo apt update
再次尝试更新apt,成功!
使用指令sudo apt install net-tools
安装网络工具。
使用ifconfig
,查看ip
注意:虚拟机的网络链接要设置成桥接模式,桥接到有线网卡。
尝试使用ping命令,本机和虚拟机互ping,成功ping通。
2.2.2 虚拟机和开发板互ping
将开发板通过路由器和本机相连,启动开发板,使用MobaXterm 配置一个串口与用户交互,串口配置如下所示:
启动开发板,通过串口就可以看到输出的启动信息。开发板出厂的默认账号为debian,密码为temppwd。
使用ifconfig
查看开发板的ip地址,开发板地址和虚拟机地址已经处于同一网段,不需要额外配置。尝试使用开发板ping虚拟机成功ping通。
开发板ping主机也可以ping通。
2.2.3 配置虚拟机NFS服务
为了方便测试驱动程序。通过NFS 给开发板共享开发主机编写的应用程序。开发板通过NFS与开发主机连接共享文件。开发主机生成的目标板应用程序放在NFS 的共享文件夹内,开发板访问该文件夹执行应用程序进行测试。在另一方面,开发主机与开发板通过串口连接,使用串口终端控制开发板。
安装NFS
ubuntu中默认没有安装NFS服务,所以,需要使用sudo apt install nfs-kernel-server
命令安装NFS。
使用sudo vim /etc/exports
修改配置文件,配置文件内容如下所示。
/home/zhongyi/workdir 202.193.61.0/24(rw,sync,all_squash,anonuid=1000,anongid=1000,no_subtree_check)
- /home/embedfire/workdir:要共享的开发主机目录,注意使用空格与后面的配置隔开。
- 202.193.61.0/24: 配置谁可以访问。/24表示 202.193.61.网段的所有机器都可以访问。
- rw: 表示客户机的权限,rw 表示可读写
- sync:资料同步写入到内存与硬盘中。
- anonuid=1000:将客户机上的用户映射成指定的本地用户ID的用户,此处1000是开发主机zhongyi用户的uid。
- anongid=1000:将客户机上的用户映射成属于指定的本地用户组ID,此处1000是开发主机zhongyi用户组gid。
- no_subtree_check:不检查子目录权限,默认配置。
使用id命令可以查看uid和gid。
本配置中的anonuid 和anongid 把客户机的用户映射成本地uid/gid 为1000的用户,即开发主机的embedfire,那么,当在开发板上使用与开发主机不同的用户访问NFS 共享目录时,都会具有zhongyi 的权限,方便互相访问。
修改完/etc/exports 文件并保存后,可使用sudo exportfs -arv
命令更新配置。
安装NFS客户端
开发主机开启NFS 服务后,我们还需要在ubuntu安装NFS 客户端。执行sudo apt install nfs-common -y
安装NFS 客户端。
查看NFS 服务器共享目录
在开发板上执行showmount -e 202.193.61.234
查看NFS共享目录。
2.2.4 临时挂载NFS文件系统
在开发板上,执行sudo apt install nfs-common -y
安装NFS客户端。
注意,如果你的板子是512M Nand 版本的,并且使用的是野火带qt的镜像。需要重新使用usb烧写纯净版系统镜像。否则会报错,提示磁盘空间不足!
USB烧写镜像教程:https://doc.embedfire.com/linux/imx6/quick_start/zh/latest/quick_start/install_debian/install_debian.html#usb
使用mount 命令挂载NFS 服务器的共享目录到开发板/mnt 目录下:
代码语言:javascript复制sudo mount -t nfs 202.193.61.234:/home/zhongyi/workdir /mnt
在NFS主机中,使用touch zhongyi.txt
命令创建一个文件,测试下。
在从机中,也显示出了我们创建的文件。
2.3 搭建交叉编译环境
在编译和装载驱动前,需要安装一些工具。工具的名称具体如下。
- gcc-arm-linux-gnueabihf 交叉编译器
- bison 语法分析器
- flex 词法分析器
- libssl-dev OpenSSL 通用库
- lzop LZO 压缩库的压缩软件
执行sudo apt install make gcc-arm-linux-gnueabihf gcc bison flex libssl-dev dpkg-dev lzop
安装即可。
2.3.1 获取内核源码
首先,使用以下命令安装git。
代码语言:javascript复制sudo apt-get install git
配置名字和邮箱。
代码语言:javascript复制git config --global user.name "xxx"
git config --global user.email xxx@xxx
使用git命令获取gitee上的源码。
代码语言:javascript复制git clone https://gitee.com/Embedfire/ebf-buster-linux.git
2.3.2 编译源码
野火已经配置好了脚本make_deb.sh,执行脚本就可以编译内核。编译好的内核存放在build_image/build。
代码语言:javascript复制./make_deb.sh
make_deb.sh脚本内容如下。
代码语言:javascript复制deb_distro=bionic
DISTRO=stable
build_opts="-j 6"
build_opts="${build_opts} O=build_image/build" # 指定编译好的内核放置位置
build_opts="${build_opts} ARCH=arm" # 编译出来的目标是针对ARM 体系结构的内核
build_opts="${build_opts} KBUILD_DEBARCH=${DEBARCH}" # 对于deb-pkg 目标,允许覆盖deb-pkg 部署的常规启发式
build_opts="${build_opts} LOCALVERSION=-imx-r1" # 使用内核配置选项“LOCALVERSION”为常规内核版本附加一个唯一的后缀。
build_opts="${build_opts} KDEB_CHANGELOG_DIST=${deb_distro}"
build_opts="${build_opts} KDEB_PKGVERSION=1${DISTRO}"
build_opts="${build_opts} CROSS_COMPILE=arm-linux-gnueabihf-" # 指定交叉编译器
build_opts="${build_opts} KDEB_SOURCENAME=linux-upstream"
make ${build_opts} npi_v7_defconfig # 生成配置文件
make ${build_opts}
make ${build_opts} bindeb-pkg # 编译文件进行打包
2.3.3 加载驱动程序
使用git克隆下例程,尝试将驱动加载到开发板。
代码语言:javascript复制git clone https://gitee.com/Embedfire/embed_linux_tutorial
将拷贝下的源码,放入内核源码的同一级目录中,如下图所示。
在hellomoudle中执行make
,命令,就可以编译模块。
下面,看下hellomodule的makefile是如何编写的,具体如下所示。
代码语言:javascript复制KERNEL_DIR=../../ebf-buster-linux/build_image/build # 指定编译内核存放位置
ARCH=arm # 针对ARM 体系结构
CROSS_COMPILE=arm-linux-gnueabihf- # 指定交叉编译工具链
export ARCH CROSS_COMPILE # 导入环境变量
obj-m := hellomodule.o # 表示以模块编译
all: # all 只是个标号,可以自己定义,是make 的默认执行目标。
$(MAKE) -C $(KERNEL_DIR) M=$(CURDIR) modules
.PHONE:clean copy
clean: # clean 就是删除后面这些由make 生成的文件。
$(MAKE) -C $(KERNEL_DIR) M=$(CURDIR) clean
copy:
sudo cp *.ko /home/embedfire/workdir
在开发板中,使用以下命令,挂载NFS网络文件系统。
代码语言:javascript复制sudo mount -t nfs 202.193.61.234:/home/zhongyi/workdir /mnt
进入hellomoudle中,加载模块即可。
代码语言:javascript复制cd /mnt/module/hellomodule
sudo insmod hellomodule.ko
sudo rmmod hellomodule.ko
3. 总结
至此,一个基本的驱动开发环境就搭载好了。下一节将开始介绍设备树的加载和编译方法。我想吐槽下野火的文档,有些地方是错误的,写的不够清楚。所以,大家在看的时候,注意下。我已经将不合适的地方,反馈给他们,希望后面可以修改。
本文参考:野火Linux开发实战指南
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。