文章目录

  • 前言
  • 一、对开发板烧写镜像
    • 1.镜像烧写
    • 2.串口测试
  • 二、搭建交叉编译环境
    • 1.Ubuntu下搭建交叉编译环境
    • 2.WSL下搭建交叉编译环境
  • 三、编译Linux内核源码
    • 1.Ubuntu下编译Linux内核源码
    • 2.WSL下编译Linux内核源码
  • 四、驱动的加载和卸载
    • 1.开发板的连接方式
    • 2.Ubuntu下的驱动加载和卸载
      • (1)代码的撰写
        • helloworld.c文件
        • Makefile文件
      • (2)编译驱动
      • (3)网络设置及互ping
      • (4)发送驱动文件
    • 3.WSL下的驱动加载和卸载
      • (1)代码的撰写
        • helloworld.c文件
        • Makefile文件
      • (2)编译驱动
      • (3)网络设置及互ping
      • (4)发送驱动文件
  • 五、一些错误的解决办法
    • 1.gcc命令找不到
    • 2.Permission denied, please try again. 问题
    • 3.Resource temporarily unavailable lost connection.问题
    • 4.no symbol version for module_layout... Invaild module format.问题
  • 总结

前言

本文的主要内容为:开发板烧写镜像、编译Linux内核源码、搭建交叉编译环境以及驱动的加载和卸载,其中编译Linux内核源码、搭建交叉编译环境以及驱动的加载和卸载都从Ubuntu系统和WSL下分别做了说明,这个过程中还会涉及到本人在实操过程中遇到的一些问题及解决办法,适合刚入门Linux开发的小白参考。


一、对开发板烧写镜像

1.镜像烧写

开发板各端口介绍如下图。

开发板的连接方式如下。
这里只需要用USB数据线把开发板的OTG口和电脑主机连接起来,然后给板子供电即可。
注意图中四个拨挡开关的位置,OTG模式下开关为:1口ON,2,3,4口均OFF。下图为各模式对应的拨码位置。

镜像烧写用到的工具:mfgtools
烧写工具文件夹内包含的文件如下:

烧写前要确保Profiles\Linux\OS Firmware\files\okmx6-c下有以下文件:

mfgtool2-mx6qdl-c-sabresd-emmc.vbs用于1G内存的烧写,mfgtool2-mx6qdl-2g-c-sabresd-emmc.vbs用于2G内存的烧写,我这里选的是mfgtool2-mx6qdl-c-sabresd-emmc.vbs。
给开发板上电后,打开开关,双击mfgtool2-mx6qdl-c-sabresd-emmc.vbs打开如下对话框:

等烧写工具的设备被识别以后,点击"Start"按钮开始烧写,最后显示"Done"烧写完成后,先点击"Stop",再"Exit"退出。
至此镜像烧写完成,复位或重新上电即可。

2.串口测试

打开MobaXterm工具(下载地址为:https://mobaxterm.mobatek.net/download.html),新建一个Session,各参数的设置如下图:

将开发板通过USB转RS232线和电脑相连,记得将拨挡开关调成EMMC模式,EMMC模式下,1口OFF,2,3,4口均ON。给板子上电之后就会在电脑上识别出串口,选择新出现含USB的那个串口即可。

打开新建的这个Session,复位或重新上电后就会打印出板子的相关信息,登录的用户名是root,重新烧写镜像后一定记得设置密码,在命令行输入passwd命令回车即可设置,如下图所示。(如果不设置密码,后续在Ubuntu下发送驱动文件到开发板时会报错)

上电后板子一切正常且打印了信息,说明我们镜像烧写成功了,这样我们在开发板端的工作就完成了,接下来只要静待后面发来的驱动文件编译就行了。


二、搭建交叉编译环境

1.Ubuntu下搭建交叉编译环境

用到的文件:fsl-imx-x11-glibc-x86_64-meta-toolchain-qt5-cortexa7hf-neon-toolchain-4.1.15-2.1.0.sh
打开Ubuntu终端,输入ifconfig命令查看虚拟机下的IP地址,如下图:

复制该IP然后打开FileZilla Client软件(下载网址:https://www.filezilla.cn/download),在文件——>站点管理器下设置各项参数如下图,其中主机那里就填写虚拟机下的IP,即上图中通过ifconfig命令查到的,用户和密码就是你的Ubuntu下的用户名和密码。(注意:确认虚拟机已经连接网络,否则会连接失败)

连接成功后就可以看到虚拟机下的文件目录了,选择虚拟机下的某个文件夹,在windows端找到交叉编译器fsl-imx-x11-glibc-x86_64-meta-toolchain-qt5-cortexa7hf-neon-toolchain-4.1.15-2.1.0.sh的存放路径并拖动到Ubuntu虚拟机下即可。

在Ubuntu上找到该文件的存放路径,若该文件是白色的,使用如下命令修改其权限即可变为绿色。

chmod u+x fsl-imx-x11-glibc-x86_64-meta-toolchain-qt5-cortexa7hf-neon-toolchain-4.1.15-2.1.0.sh


使用以下命令直接执行该文件,输入密码后使用其默认的路径安装即可。

./fsl-imx-x11-glibc-x86_64-meta-toolchain-qt5-cortexa7hf-neon-toolchain-4.1.15-2.1.0.sh


安装完成后使用如下命令使能环境变量。不过要注意,每个人的文件名可能不一样,不要直接复制粘贴此条代码,可以先敲前几个字母按Tab键补全,这样就不会出现文件名称错误的问题了。(后文中凡是执行该条代码时也不要粘贴,最好自己敲一下)

source /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi

用下面这条代码也可使能环境变量,注意 . 和 / 之间有空格。

. /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi

用户也可以使用如下命令查看gcc的版本信息。

arm-poky-linux-gnueabi-gcc --version


接着使用下面命令更新软件列表。

sudo apt-get update

安装lzop。

sudo apt-get install lzop

在后续需要通过make menuconfig命令显示menuconfig菜单窗口时需要安装下面的库,这里也一并安装,命令如下。

sudo apt-get install libncurses*

到这里,Ubuntu下交叉编译环境的搭建就完成了。

2.WSL下搭建交叉编译环境

用到的文件:fsl-imx-x11-glibc-x86_64-meta-toolchain-qt5-cortexa7hf-neon-toolchain-4.1.15-2.1.0.sh
WSL下搭建交叉编译环境与Ubuntu下搭建交叉编译环境大同小异,用到的命令和流程也没有什么变化,直接参考Ubuntu下搭建交叉编译环境部分进行操作即可。
我把该文件存放在了/mnt/c/linux/tool文件夹下,你也可以直接在根目录下新建一个文件夹将该文件复制进去。(如果存放该文件的文件夹在Windows下可以打开,采用直接拖放复制的方法就行,如若没有权限打开,使用cp命令复制即可)

其实把存放的文件夹建在与mnt文件夹同级目录下更方便,因为涉及的路径短,不容易出错,如下图,我在该目录下新建了一个work文件夹,后面我也会把上述/mnt/c/linux/tool下的文件复制到work文件夹下执行相关的操作。

接着使能环境变量。

查看gcc版本信息。

更新软件列表。

安装lzop。

安装libncurses库。

到这里,WSL下交叉编译环境的搭建就完成了。


三、编译Linux内核源码

1.Ubuntu下编译Linux内核源码

用到的文件:linux-4.1.15.tar.bz2
将Linux内核源码linux-4.1.15.tar.bz2文件传到Ubuntu中的方式与交叉编译工具fsl-imx-x11-glibc-x86_64-meta-toolchain-qt5-cortexa7hf-neon-toolchain-4.1.15-2.1.0.sh传到Ubuntu中的方式相同,这里不再赘述。
注意:上传时最好使用安装包文件,不要使用Windows下解压后的文件。
在Ubuntu下找到该文件上传存放的路径,使用如下命令解压。

tar jvxf linux-4.1.15.tar.bz2

解压完成后会在同级目录下生成linux-4.1.15文件,进到该目录下。我这里存放的路径是:/home/lyx/linux/imx6ull/linux-4.1.15

如果脚本文件build.sh是白色的,说明没有可执行权限,这里要使用chmod指令修改其权限,命令如下:

chmod u+x build.sh

同样这里再次使用source 指令使能环境变量,命令如下:

source /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi

使用如下命令打开menuconfig对话框

make menuconfig

如果显示的是x86 而不是arm,需要使用如下命令更改:

export ARCH=arm

使用键盘上右键移动到Exit,然后按下Enter键退出即可。
在当前路径下执行该脚本进行编译内核与多个设备树,命令如下:

./build.sh

这个过程耗时较长,耐心等待编译完成即可。

2.WSL下编译Linux内核源码

用到的文件:linux-4.1.15.tar.bz2
WSL下编译Linux内核源码与Ubuntu下差别不大,尤其要注意的是不要在Windows下解压然后直接使用解压后的文件夹,同样使用如下命令解压。

tar jvxf linux-4.1.15.tar.bz2

我第一次就是因为直接使用了Windows下解压后的文件导致了后面的驱动文件加载不了,重新解压编译后才成功。
其他的步骤同样参考上面Ubuntu下编译Linux内核源码部分。


四、驱动的加载和卸载

1.开发板的连接方式

开发板的连接方式如下图,拨挡开关的模式仍为EMMC,连接好了之后上电。

这里连接网口的原因是后面将通过网络发送驱动文件到开发板上。

2.Ubuntu下的驱动加载和卸载

(1)代码的撰写

helloworld.c文件

#include <linux/init.h>   //包含宏定义的头文件
#include <linux/module.h> //包含初始化加载模块的头文件
static int hello_init(void)
{printk("hello world!\n"); //内核模块加载的时候打印hello world!return 0;
}
static int hello_exit(void)
{printk("unload successful!\n"); //内核模块卸载的时候打印unload successful!
}
module_init(hello_init); //驱动模块的入口
module_exit(hello_exit); //驱动模块的出口
MODULE_LICENSE("GPL");  //声明模块拥有开源许可证//内核打印函数不能用printf,要用printk,因为内核没有办法使用C语言库

Makefile文件

obj-m += helloworld.o
KDIR:=/home/lyx/linux/imx6ull/linux-4.1.15  # Ubuntu下Linux内核的实际路径,这个路径就是你解压后生成的那个文件路径
PWD?=$(shell pwd)
all:make -C $(KDIR) M=$(PWD) modules  #编译成模块
clean:make -C $(KDIR) M=$(PWD) clean

(2)编译驱动

将上面的helloworld.c文件和Makefile文件存放在同一文件夹下,先通过如下命令使能环境变量。

source /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi

然后再用make直接编译即可。

生成的helloworld.ko文件就是我们发向开发板的文件。

(3)网络设置及互ping

虚拟机端先在编辑——>虚拟网络编辑器下更改设置如下图,确定。


然后在设置——>网络设置下的IPv4 Settings下更改如下,其中Address要与你开发板上的前三个网段相同。

比如我的开发板IP是192.168.0.232,按照网段的计算方法:

192.168.0.232 & 255.255.255.0 = 192.168.0.0

而我设置的IPv4是192.168.0.3

192.168.0.3 & 255.255.255.0 = 192.168.0.0

两者是相等的,这样才能互相ping通。
IPv4设置完成后保存,最好关闭网络再打开,否则设置的IP好像不能即时更改,至少我的是这样,查看的方法就是在终端输入ifconfig命令查看你的IP是否已经更改为你刚才设置的网段,如下图,我的IP就更改成功了。

开发板按照上面的连接方式连接成功上电后,先登录然后查看开发板的IP,确保其和虚拟机的IP网段相同。

接下来就可以互ping了,先在开发板上ping一下虚拟机网络。

没问题,是通的,按Ctrl+C键停止,然后我们再到虚拟机端ping一下开发板网络。

也没有问题,是通的,按Ctrl+C键停止。这样,网络设置及互ping就完成了。

(4)发送驱动文件

接下来在虚拟机上将helloworld.ko文件通过网络传到开发板上。先在开发板上建一个文件夹用来接收从虚拟机传过来的文件,我这里建了一个名为lyx的文件夹,如下图。

在虚拟机端进到存放有helloworld.ko文件的文件夹下,使用如下命令将文件传到开发板上。

scp helloworld.ko root@192.168.0.232:/lyx

这里的lyx即为上面开发板新建的文件夹名称,输入的密码就是在开发板上电后通过passwd指令设置的密码,所以说,开发板如果没有设置密码,文件是传不过去的。

然后我们再来看看开发板收到了没有。

显然有了,然后使用如下命令加载驱动。

insmod helloworld.ko

打印的是“hello world!”
也可以使用如下命令查看模块的详细信息。

lsmod

使用如下命令卸载驱动。注意:在卸载的时候没有.ko后缀。

rmmod helloworld

打印的是“unload successful!” 这与我们写在代码中的打印内容一致,所以Ubuntu下的模块加载卸载功能就成功完成了。

3.WSL下的驱动加载和卸载

(1)代码的撰写

helloworld.c文件

#include <linux/init.h>   //包含宏定义的头文件
#include <linux/module.h> //包含初始化加载模块的头文件
static int hello_init(void)
{printk("hello world!\n"); //内核模块加载的时候打印hello world!return 0;
}
static int hello_exit(void)
{printk("unload successful!\n"); //内核模块卸载的时候打印unload successful!
}
module_init(hello_init); //驱动模块的入口
module_exit(hello_exit); //驱动模块的出口
MODULE_LICENSE("GPL");  //声明模块拥有开源许可证//内核打印函数不能用printf,要用printk,因为内核没有办法使用C语言库

Makefile文件

obj-m += helloworld.o
KDIR:=/work/linux-4.1.15  # WSL下Linux内核的实际路径,这个路径就是你解压后生成的那个文件路径
PWD?=$(shell pwd)
all:make -C $(KDIR) M=$(PWD) modules  #编译成模块
clean:make -C $(KDIR) M=$(PWD) clean

(2)编译驱动

将上面的helloworld.c文件和Makefile文件存放在同一文件夹下,使用make命令编译。

哦?发生错误了。。。怎么办?
使能环境变量。使能环境变量。使能环境变量。重要的事情一定要多强调几遍。命令如下:

source /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi

然后再用make直接编译即可,这不就成功了嘛!

生成的helloworld.ko文件就是我们发向开发板的文件。

(3)网络设置及互ping

打开网络设置,设置各参数如下,保存。

一定是在开发板通过网口连接到主机,开发板上电以后未识别的网络下设置,切勿在已连接的网络中进行上面的设置。设置成功后如下图所示。

这里的手动网络地址设置还是要和开发板前三位网段相同,比如我的开发板IP是192.168.0.232,按照网段的计算方法:

192.168.0.232 & 255.255.255.0 = 192.168.0.0

而我设置的IPv4是192.168.0.2

192.168.0.2 & 255.255.255.0 = 192.168.0.0

两者是相等的,这样才能互相ping通。
使用ifconfig命令看看是不是设置成功了。

成功了,接下来就可以互ping了,先在开发板上ping一下WSL下的网络。

没问题,是通的,按Ctrl+C键停止,然后我们再到WSL下ping一下开发板网络。

也没有问题,是通的,按Ctrl+C键停止。这样,网络设置及互ping就完成了。

(4)发送驱动文件

接下来在WSL下将helloworld.ko文件通过网络传到开发板上。先在开发板上建一个文件夹用来接收从虚拟机传过来的文件,我这里建了一个名为lyx的文件夹,如下图。

在WSL下进到存放有helloworld.ko文件的文件夹下,使用如下命令将文件传到开发板上。

scp helloworld.ko root@192.168.0.232:/lyx

这里的lyx即为上面开发板新建的文件夹名称,输入的密码就是在开发板上电后通过passwd指令设置的密码,所以说,开发板如果没有设置密码,文件是传不过去的。

然后我们再来看看开发板收到了没有。

显然有了,然后使用如下命令加载驱动。

insmod helloworld.ko

打印的是“hello world!”
也可以使用如下命令查看模块的详细信息。

lsmod

使用如下命令卸载驱动。注意:在卸载的时候没有.ko后缀。

rmmod helloworld

打印的是“unload successful!” 这与我们写在代码中的打印内容一致,所以WSL下的模块加载卸载功能就成功完成了。


五、一些错误的解决办法

1.gcc命令找不到

make编译时出现错误,提示gcc命令没有找到。

解决办法:使能环境变量,这个代码要常使用,贴在下面,使用make编译前用一下就不会报错了。

source /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi

不过要注意,每个人的文件名可能不一样,不要直接复制粘贴此条代码,可以先敲前几个字母按Tab键补全,这样就不会出现文件名称错误的问题了。

2.Permission denied, please try again. 问题

从虚拟机向开发板发送文件时出现“Permission denied, please try again.”问题。

解决办法:我出现这个问题的原因就是在开发板上没有设置密码,设置密码成功后就可以传了,如果你设置了密码,确保密码输入正确,且注意该密码是开发板上的密码,不是你Ubuntu上的密码,如果这些都对还有问题,试试修改文件权限。

3.Resource temporarily unavailable lost connection.问题

从虚拟机向开发板发送文件时出现“Resource temporarily unavailable lost connection.”问题。

解决办法:确保自己的连线没问题,没有接口松动等问题,这种情况大概率就是开发板和虚拟机的IP网段不同,你可以试试互相ping一下,这个时候应该是ping不通的,设置开发板和虚拟机的IP网段,使其相同,设置方法参考上文。

4.no symbol version for module_layout… Invaild module format.问题

驱动文件发送到开发板了,在加载驱动时出现“no symbol version for module_layout… Invaild module format.”问题。

解决办法:我出现该问题找了好多办法解决都不太行,其实就是编译Linux内核时出了问题,我当时应该是在Windows下直接解压后使用其解压后的文件夹的,没有在终端通过解压命令解压安装包。我的解决办法是删除了旧的存放Linux内核源码的文件,然后重新解压编译内核源码,再次执行,错误就消失了。编译内核源码的方式参见上文。


总结

以上就是IMX6开发板从镜像的烧写、内核源码编译到第一个驱动运行的全过程。可以说这是我目前为止遇到过打印 helloworld 最难的一次,中间遇到的问题层出不穷,需要自己一点一点摸索解决,如果正在看这篇文章的你也是个刚入手Linux开发的小白,不要轻易放弃,坚持下去,一步一步解决出现的错误,相信这个过程中你一定可以学到很多的知识和技能。

Linux下imx6dl开发板从镜像的烧写、内核源码编译到第一个驱动运行的详细步骤相关推荐

  1. 【linux内核-源码编译之centos7】

    linux内核-源码编译之centos7 一. 为什么要编译内核 二.疑难杂症 三.演示环境 四.下载源码 4.1.两者源码区别 4.2.将获取到的源码放在/usr/src/kernels/ 下 五. ...

  2. anaconda tensorflow 2.3_TensorFlow开发环境搭建(Ubuntu16.04+GPU+TensorFlow源码编译)

    1 安装选择 1.1 平台 目前TensorFlow已支持Mac.Ubuntu和Windows三个主流平台(64位平台), 1.2 GPU vs CPU 在安装时可以选择安装版本是否支持GPU, 1. ...

  3. mysql5.1编译安装centos7_CentOS7下 Nginx1.13.5 + PHP7.1.10 + MySQL5.7.19 源码编译安装

    在CentOS7下 Nginx1.13.5 + PHP7.1.10 + MySQL5.7.19 源码编译安装过程记录. 一.安装Nginx 1.安装依赖扩展 # yum -y install wget ...

  4. 编译linux源码报错,记录一次Linux内核源码编译实验

    记录一次Linux内核源码编译实验 文章目录 记录一次Linux内核源码编译实验 0. 实验环境 1. 选择.下载内核源码 2. 安装必要的依赖软件以及性能要求 3. 解压.配置和编译内核源码 3.1 ...

  5. 迅为IMX6开发板Mfgtools工具单独烧写镜像-设备树Qt系统

    烧写设备树版本 Qt 系统要使用 iMX6Q 设备树光盘里的烧写工具,将文件夹下的 cfg.ini 修改成如下图所示: 打开"android_m6.0.1_2.0.0_ga_tool_201 ...

  6. 干货|TensorFlow开发环境搭建(Ubuntu16.04+GPU+TensorFlow源码编译)

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自|机器学习算法工程师 安装平台 1 平台 目前Tensor ...

  7. xilinx linux内核,Xilinx-Zynq Linux内核源码编译过程

    本文内容依据http://www.wiki.xilinx.com网址编写,编译所用操作系统为ubuntu 14 1.交叉编译环境的安装配置 2.uboot的编译 1)下载uboot源代码 下载uboo ...

  8. 针对linux系统中/usr/src/kernels中找不到内核源码的问题

    在安装系统后,发现没有安装当前系统的内核源码在/usr/src/kernels目录下,其实我们是少安装了一个rpm包: 首先在配置好自己电脑的源后,然后针对不同系统安装下面提示的包就可以了: 针对ce ...

  9. linux下s3c2440开发板,SAMSUNG S3C2440 ARM LINUX 开发板 上手初体验 --开发环境搭建

    1,linux开发环境搭建 2,程序测试 easyOpentag驱动安装,打开连接,选择ARM-linux 1,环境搭建 我的系统版本 root@ubuntu:~# lsb_release -a No ...

最新文章

  1. SQL性能优化之索引优化法
  2. R-Bioconductor安装
  3. 3.实战HTML+CSS布局(实例入门篇)
  4. Reactor学习笔记
  5. Linux的网络类型
  6. sersync+rsync+inotify-tools集中日志,实时同步
  7. 【C++】C++中你不了解的类型转换
  8. 损失函数、tensorflow2实现——Python实战
  9. 图:广州南洋理工职业学院管理系“相聚南洋”朗诵(演讲)比赛尘埃落定
  10. 时间序列平稳性的判断
  11. 在html5水平边距属性hspace,响应式网页设计(html5+css3+cms)教学课件作者李文奎第2章html基础.pptx...
  12. 身体不同部位锻炼相关英语表达
  13. XP的故障恢复控制台
  14. 极客兔兔 TensorFlow入门教程
  15. 服务器系统对比、数据库对比、后台开发语言对比
  16. 对接阿里云内容安全服务(机审视频检测)
  17. 图像编辑、图像修饰及修补_如何增强和修饰图像[Photoshop教程]
  18. 清华生命学院 2017 就业报告:就业率仅 51%
  19. 猴子都能懂得Git(入门篇汇总版)持续更新中~~~
  20. Unity中用Shader实现镜子效果

热门文章

  1. 求最小公倍数或最大公约数
  2. ATFX:周一荷兰TTF天然气期货再大涨13%
  3. 在python中、使用( )语句导入模块_Python导入模块,Python import用法(超级详细)...
  4. Java爬虫抓取豆瓣读书信息
  5. 2021OPPO开发者大会召开 中手游获颁双料大奖
  6. 【新日语(2)】第4課 人びとの生活をもっと豊かにしなければなりません
  7. spring生命周期管理-初始化与销毁
  8. java直播教学开发接口,大量教程
  9. Ubuntu/centos网络接口没有eth0但是有eth1或eth2的问题
  10. OA系统渠道为王 华天动力OA布局全国20个城市分公司