IMX6ULL驱动开发实战连载-01搭建开发环境

本文是IMX6ULL驱动开发的首篇文章,详细介绍了如何搭建开发环境,包括:烧写Debian镜像到SD卡,设置开发板启动;使用Etcher工具烧录镜像;配置NFS网络文件系统,实现本机、虚拟机与开发板的互ping;安装和配置NFS服务及客户端;最后讲解了交叉编译环境的搭建,包括获取内核源码和编译内核模块。
摘要由CSDN通过智能技术生成

哈喽,大家好。我是小仲。板子在3.31号就收到了,但是,由于最近一直很忙,拖到了现在才开始搭建环境。接下来的一段时间,会基于野火IMX6ULL开发板写一系列教程,主要侧重于驱动和内核的调试技巧。这方面的文章,我也是第一次写,过程中可能会踩不少坑,可能更新时间间隔会很。如果有写的不好的,大家可以及时指出,有任何意见和建议也可以联系我。

今天分享的是本次测评的第一篇文章,开发板的搭建环境教程。

本文由嵌入式与Linux那些事创作,未经作者授权,禁止转载。

CSDN:嵌入式与Linux那些事

IMX6ULL驱动开发实战连载系列总目录

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线。

image-20210404160221417

本次使用的是野火的IMX6ULL的NAND版本,具有512MB的NAND-FLASH,主频为800MHZ。开发板的底板资源接口如下图所示。野火提供了丰富的资料,对照教程我们可以轻松的让开发板跑起来。

2. 环境搭建

2.1 烧写镜像到SD卡

由于本次使用的开发板为512M Nand 版本,因此,强烈建议大家准备一个2G以上的SD卡,将Debian镜像放在SD卡中,将开发板设置为SD卡启动。否则,只能烧写Debian镜像的纯净版。

烧写镜像文件,使用的是Etcher工具,在官网(https://www.balena.io/etcher/)可以根据自己电脑系统,进行下载。

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。

查看本机ip地址

在ubuntu18.04中,使用ifconfig命令查看ip地址,但是报错了。

使用ifconfig命令查看ip地址

根据提示,使用 sudo apt install net-tools 命令,安装网络工具。

成功安装,但仍有错误

以上说明apt被某个进程锁住了,找到进程,kill 就完了,如下:

删除占用进程

强制重新配置软件包,升级下apt,但是又报错。

升级apt报错

使用指令sudo rm /var/lib/dpkg/lock-frontendsudo rm /var/lib/dpkg/lock删除占用进程

删除占用

移除锁定文件

使用指令sudo apt update再次尝试更新apt,成功!

成功更新apt

使用指令sudo apt install net-tools安装网络工具。

成功安装网络工具

使用ifconfig,查看ip

查看虚拟机ip地址

注意:虚拟机的网络链接要设置成桥接模式,桥接到有线网卡。

尝试使用ping命令,本机和虚拟机互ping,成功ping通。

本机和虚拟机互ping

2.2.2 虚拟机和开发板互ping

将开发板通过路由器和本机相连,启动开发板,使用MobaXterm 配置一个串口与用户交互,串口配置如下所示:

MobaXterm配置

启动开发板,通过串口就可以看到输出的启动信息。开发板出厂的默认账号为debian,密码为temppwd。

成功启动

使用ifconfig查看开发板的ip地址,开发板地址和虚拟机地址已经处于同一网段,不需要额外配置。尝试使用开发板ping虚拟机成功ping通。

开发板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。

id命令查看uid

本配置中的anonuid 和anongid 把客户机的用户映射成本地uid/gid 为1000的用户,即开发主机的embedfire,那么,当在开发板上使用与开发主机不同的用户访问NFS 共享目录时,都会具有zhongyi 的权限,方便互相访问。

修改完/etc/exports 文件并保存后,可使用sudo exportfs -arv 命令更新配置。

更新exporfts配置文件

安装NFS客户端

开发主机开启NFS 服务后,我们还需要在ubuntu安装NFS 客户端。执行sudo apt install nfs-common -y安装NFS 客户端。

安装NFS客户端

查看NFS 服务器共享目录

在开发板上执行showmount -e 202.193.61.234查看NFS共享目录。

查看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 目录下:

sudo  mount -t nfs 202.193.61.234:/home/zhongyi/workdir /mnt

成功挂载

在NFS主机中,使用touch zhongyi.txt命令创建一个文件,测试下。

在主机上touch一个文件

在从机中,也显示出了我们创建的文件。

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。

sudo apt-get install git

配置名字和邮箱。

git config --global user.name "xxx"
git config --global user.email xxx@xxx

使用git命令获取gitee上的源码。

git clone https://gitee.com/Embedfire/ebf-buster-linux.git

2.3.2 编译源码

野火已经配置好了脚本make_deb.sh,执行脚本就可以编译内核。编译好的内核存放在build_image/build。

./make_deb.sh

make_deb.sh脚本内容如下。

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克隆下例程,尝试将驱动加载到开发板。

git clone https://gitee.com/Embedfire/embed_linux_tutorial

将拷贝下的源码,放入内核源码的同一级目录中,如下图所示。

同级目录编译

在hellomoudle中执行make,命令,就可以编译模块。

编译hello模块

下面,看下hellomodule的makefile是如何编写的,具体如下所示。

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网络文件系统。

sudo  mount -t nfs 202.193.61.234:/home/zhongyi/workdir /mnt  

进入hellomoudle中,加载模块即可。

cd /mnt/module/hellomodule
sudo insmod hellomodule.ko
sudo rmmod hellomodule.ko

加载和卸载测试模块

3. 总结

至此,一个基本的驱动开发环境就搭载好了。下一节将开始介绍设备树的加载和编译方法。我想吐槽下野火的文档,有些地方是错误的,写的不够清楚。所以,大家在看的时候,注意下。我已经将不合适的地方,反馈给他们,希望后面可以修改。

本文参考:野火Linux开发实战指南

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_16933601/article/details/115577406

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式与Linux那些事

您的鼓励将使我写出更好的文章

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值