嵌入式linux/鸿蒙开发板(IMX6ULL)开发(八)IMX6ULL开发板编译第一个程序以及驱动

1. IMX6ULL开发板初次操作

1.1 100ask_imx6ull开发板硬件资源简介

1.1.1 100ask imx6ull mini开发板

在这里插入图片描述在这里插入图片描述

1.2 100ask_imx6ull开发板软件资源简介

1.2.1 开发环境

在这里插入图片描述

1.2.2 核心软件

在这里插入图片描述

1.2.3 文件系统

在这里插入图片描述

7.2.4 各模块的详细内容
在这里插入图片描述在这里插入图片描述

1.3 启动方式选择

板子上的红色拨码开关用来设置启动方式,支持这3种方式:EMMC启动、SD卡启动、USB烧写。
板子背后画有一个表格,表示这3种方式如何设置。
表格如下:
在这里插入图片描述

这3种启动方式的设置示意图如下:
在这里插入图片描述

注意:设置为USB启动时,不能插上SD卡、TF卡;上电之后才可以插卡。
刚出厂的板子在EMMC上烧写了系统,你可以设置为EMMC启动方式。

1.4 串口连接

在后面的操作里,都是通过串口与板子进行“交流”。串口是串行接口的简称,是指数据一位一位地顺序传送,其特点是通信线路简单。

1.4.1 连接串口线和电源线、配置串口工具

如下图所示将串口线与电脑、板子连接,开发板插上电源。

在这里插入图片描述

其中特别需要注意的几点:
a) 板子的启动选择拨到正确的启动方式,保证该启动方式里面有系统可以运行;
b) 板子如图所示插上配套的电源到电源接口,电源开关暂时不用打开;

1.4.2 安装USB串口模块驱动

接好micro usb数据线后,Windows会自动安装驱动(安装可能比较慢,等一分钟左右)。打开电脑的“设备管理器”,在“端口 (COM和LPT)”项下,可以看到如下图中的“(COM21)”。这里的“COM21”可能与你电脑上的不一样,记住你电脑显示的数字。

在这里插入图片描述

如果电脑没有显示出端口号,就需要手动安装驱动,从驱动精灵官网(www.drivergenius.com)下载一个驱动精灵,安装、运行、检测,会自动安装上串口驱动。

1.4.3 使用MobaXterm软件打开串口

打开MobaXterm,点击左上角的“Session”,在弹出的界面选中“Serial”,如下图所示选择端口号(前面设备管理器显示的端口号COM21)、波特率(Speed 115200)、流控(Flow Control: none),最后点击“OK”即可。步骤如下图所示。
注意:流控(Flow Control)一定要选择none,否则你将无法在MobaXterm中向串口输入数据。

随后显示一个黑色的窗口, 此时打开板子的电源开关,将收到板子串口发过来的数据,如下图所示。
在这里插入图片描述在这里插入图片描述

1.4.4 开发板登录名是root,无需密码

在串口看到“imx6ull login:”时,输入“root”并回车即可,如下图所示:

在这里插入图片描述

1.5 通过串口操作开发板

在串口看到“imx6ull login:”这类登录的提示信息时,输入“root”并回车即可,然后就可以执行各种Linux命令了,如下图所示:
在这里插入图片描述

1.6 使用MobaXterm远程登录开发板

只要开发板上有sshd服务,那么就像远程访问Ubuntu一样,也可以使用MobaXterm远程登录开发板,使用FileZilla连接开发板、互传文件。
假设开发板的IP是192.168.1.123,运行MobaXterm后,如下建立Session:
在这里插入图片描述

按上图操作后,在MobaXterm左侧就可以看到这项,双击它就可以登录Ubuntu,然后就可以执行各种Linux命令了:
在这里插入图片描述

1.7 使用FileZilla在Windows和开发板之间传文件

双击打开FileZilla后,按下图操作:
在这里插入图片描述

在Filezilla中,左边是Windows文件,右边是开发板的文件,如下图:

在这里插入图片描述

1.8 开发板挂载Ubuntu的NFS目录

1.8.1 确定ubuntu的网卡和IP

开发板要想访问Ubuntu,要先确定ubuntu的桥接网卡获取到的IP,在Ubuntu终端下使用ifconfig命令来查看桥接模式获取到的网卡。
在这里插入图片描述

如上图可以看到桥接网卡的IP地址为192.168.5.11 ,这里的IP地址配置是参考了 前面 《第四章 使用USB网卡直连配置网络》设置的桥接网卡IP地址。

1.8.2 在开发板上执行mount nfs命令

ubuntu的IP是192.168.5.11,确保开发板能ping通ubuntu后,在开发板上执行以下命令挂载NFS:

mount -t nfs -o nolock,vers=3 192.168.5.11:/home/book/nfs_rootfs /mnt

mount命令用来挂载各种支持的文件系统协议到某个目录下。
mount成功之后,开发板在/mnt目录下读写文件时,实际上访问的就是Ubuntu中的/home/book/nfs_rootfs目录,所以开发板和Ubuntu之间通过NFS可以很方便地共享文件。
在开发过程中,在Ubuntu中编译好程序后放入/home/book/nfs_rootfs目录,开发板mount nfs后就可以直接使用/mnt下的文件。

2.开发板的第1个APP实验

2.1获取程序

请按上一章节使用GIT下载源码、使用repo下载工具链,并配置了交叉编译工具链。
从Git仓库驱动源码相关文件,在Ubuntu终端上执行如下命令。

git  clone  https://e.coding.net/weidongshan/01_all_series_quickstart.git

代码获取示意图如下所示。
在这里插入图片描述

使用GIT下载所有源码后,本节源码位于如下目录:

01_all_series_quickstart\
	04_嵌入式Linux应用开发基础知识\source\01_hello

注意:如果已经使用GTI下载过源码,就不需要重复下载了,否则会有如下图提示:
在这里插入图片描述

hello.c的源码如下:


01 #include <stdio.h>
02
03 /* 执行命令: ./hello weidongshan
04  * argc = 2
05  * argv[0] = ./hello
06  * argv[1] = weidongshan
07  */
08
09 int main(int argc, char **argv)
10 {
11      if (argc >= 2)
12              printf("Hello, %s!\n", argv[1]);
13      else
14              printf("Hello, world!\n");
15      return 0;
16 }
17

2.2 安装开发环境

假设你已经在Ubuntu中下载了源码、设置了交叉编译工具链。前面章节都已经提过。

2.3 编译程序

先进目录下编译:
在这里插入图片描述

在Ubuntu中可以执行以下命令编译、执行:

$ gcc -o hello hello.c
$ ./hello
Hello, world!
$ ./hello weidongshan
Hello, weidongshan!

上述命令编译得到的可执行程序hello可以在Ubuntu中运行,但是如果把它放到ARM板子上去,它是无法执行的。因为它是使用gcc编译的,是给PC机编译的,里面的机器指令是x86的。
我们要想给ARM板编译出hello程序,需要使用交叉编译工具链,比如:

$ arm-buildroot-linux-gnueabihf-gcc -o hello hello.c

这样编译出来的hello程序才可以在ARM板子上运行。
先把编译生成的 hello 文件拷贝到Ubuntu nfs服务目录下,备用:

$ cp  hello   /home/book/nfs_rootfs

2.4 上传程序到开发板并运行

开发板启动后通过nfs挂载Ubuntu目录的方式,将相应的文件拷贝到开发板上。

如果你使用的是VMware桥接方式,假设Ubuntu IP为192.168.1.100,在开发板上执行以下命令:

[root@imx6ull:~]# mount -t nfs -o nolock,vers=3 192.168.1.100:/home/book/nfs_rootfs /mnt
[root@imx6ull:~]# cp  /mnt/hello  ./hello

最后,执行如下操作添加可执行权限,并运行它:

[root@imx6ull:~]# chmod +x hello
[root@imx6ull:~]# ./hello

3.开发板的第1个驱动实验

3.1 前提

请按前面第八章使用GIT下载源码、使用repo下载工具链,并配置了交叉编译工具链。

为什么编译驱动程序之前要先编译内核?
① 驱动程序要用到内核文件:
比如驱动程序中这样包含头文件:#include <asm/io.h>,其中的asm是一个链接文件,指向asm-arm或asm-mips,这需要先配置、编译内核才会生成asm这个链接文件。

② 编译驱动时用的内核、开发板上运行到内核,要一致:
开发板上运行到内核是出厂时烧录的,你编译驱动时用到内核是你自己编译的,这两个内核不一致时会导致一些问题。
所以我们编译驱动程序前,要把自己编译出来到内核放到板子上去,替代原来的内核。

③ 更换板子上的内核后,板子上的其他驱动也要更换:
板子使用新编译出来的内核时,板子上原来的其他驱动也要更换为新编译出来的。

所以在编译我们自己的第1个驱动程序之前,要先编译内核、模块,并且放到板子上去。

3.2 获取led驱动源码

从Git仓库驱动源码相关文件,在Ubuntu终端上执行如下命令。

git  clone  https://e.coding.net/weidongshan/01_all_series_quickstart.git

代码获取示意图如下所示。
在这里插入图片描述

使用GIT获取到源码后,可查看本节源码所在目录,目录位置如下:

01_all_series_quickstart/05_嵌入式Linux驱动开发基础知识 \
/source/02_led_drv/02_led_drv_for_boards/100ask_imx6ull_src_bin

3.3 编译内核镜像

不同的开发板对应不同的配置文件,配置文件位于内核源码arch/arm/configs/目录。
IMX6ULL MINI EMMC版
kernel的编译过程如下(编译内核前需要先配置好工具链等一些环境变量):

book@100ask:~/100ask_imx6ull_mini-sdk/Linux-4.9.88$ make mrproper
book@100ask:~/100ask_imx6ull_mini-sdk/Linux-4.9.88$ make 100ask_imx6ull_mini_defconfig
book@100ask:~/100ask_imx6ull_mini-sdk/Linux-4.9.88$ make zImage -jN //N表示根据CPU个数,来加速编译系统
book@100ask:~/100ask_imx6ull_mini-sdk/Linux-4.9.88$ make dtbs
book@100ask:~/100ask_imx6ull_mini-sdk/Linux-4.9.88$ cp arch/arm/boot/zImage ~/nfs_rootfs
book@100ask:~/100ask_imx6ull_mini-sdk/Linux-4.9.88$ cp arch/arm/boot/dts	/100ask_myir_imx6ull_mini.dtb  ~/nfs_rootfs

编译成功后,可以得到这些文件:内核文件arch/arm/boot/zImage,设备树文件arch/arm/boot/100ask_imx6ull_mini.dtb。
把这2个文件复制到/home/book/nfs_rootfs目录下备用。
在这里插入图片描述

3.4 编译安装内核模块

3.4.1 编译内核模块

IMX6ULL MINI EMMC版
进入内核源码目录后,就可以编译内核模块了:

book@100ask:~$ cd  ~/100ask_imx6ull_mini-sdk/Linux-4.9.88/
book@100ask:~/100ask_imx6ull_mini-sdk/Linux-4.9.88$ make ARCH=arm CROSS_COMPILE=arm-buildroot-linux-gnueabihf- modules

在这里插入图片描述

3.4.2 安装内核模块到Ubuntu某个目录下备用

可以先把内核模块安装到nfs根文件系统(/home/book/nfs_rootfs为安装目录)。
注意:下面会执行tree命令,如果提示没有该命令,需要执行“sudo apt install tree”命令安装tree工具(前提是Ubuntu能上网)。

IMX6ULL MINI EMMC版
执行以下命令:

book@100ask:~$ cd ~/100ask_imx6ull_mini-sdk/Linux-4.9.88
book@100ask:~/100ask_imx6ull_mini-sdk/Linux-4.9.88$ sudo make  ARCH=arm INSTALL_MOD_PATH=/home/book/nfs_rootfs  modules_ins

在这里插入图片描述安装后的的/home/book/nfs_rootfs/目录结构如下图所示:
在这里插入图片描述

3.5 安装内核和模块到开发板上

注意:很多种更新开发板文件的方法,开发过程中最常用的是NFS。
假设:执行上述命令后,在Ubuntu的/home/book/nfs_rootfs目录下已经有了zImage、dtb文件,并且有lib/modules子目录(里面含有各种模块)。
下面,要把这些文件复制到开发板上。
如果你使用的是VMware桥接方式,假设Ubuntu IP为192.168.1.100,在开发板上执行以下命令:

mount -t nfs -o nolock,vers=3 192.168.1.100:/home/book/nfs_rootfs /mnt
cp  /mnt/zImage  /boot
cp  /mnt/*.dtb   /boot
cp  /mnt/lib/modules  /lib  -rfd

最后重启开发板,它就使用新的zImage、dtb、模块了。

3.6 编译led模块

注意:编译驱动程序前,需要先编译内核,因为驱动程序要用到内核中的一些文件。
注意:安装驱动程序前,需要先更新内核,就是把你编译出来的zImage放到开发板上去并重启。否则安装你新编译的驱动时,内核会提示如下错误:你的驱动会污染(taint)内核,版本不匹配不允许使用某些函数。
注意:编译内核,所以你要复制的是(参考第二篇)

/home/book/100ask_imx6ull-sdk/Linux-4.9.88/arch/arm/boot/zImage。

注意:如果要使用Buildroot目录中这个output/images/zImage文件时,驱动程序Makefile中要指定KERN_DIR为如下目录:

KERN_DIR = /home/book/100ask_imx6ull-sdk/Buildroot_2019.02/output/build/linux-origin_master

不更新内核时,会出现类似如下错误:

在这里插入图片描述

你当然可以强行安装驱动程序,比如使用“insmod -f hello_drv.ko”这样的命令,它会提示说“内核已经被污染了”,但是不影响学习、不影响使用,如下:
在这里插入图片描述

如果不想看到这些提示污染的信息,就需要把在Ubuntu上编译出来的zImage复制到开发板的/boot目录下,并且把Ubuntu上编译出来的各种模块复制到开发板的/lib/modules目录下。
之所以也要更新/lib/modules目录,是你更新了zImage,它就跟/lib/modules下的驱动不匹配了,所以/lib/modules也要用新编译出来的。

注意:编译led模块之前,先按上一小节设置交叉编译工具链,编译内核,把内核zImage和其他模块放到开发板上。
在这里插入图片描述

然后进入如下目录,修改Makefile文件KERN_DIR为自己的内核所在路径:

01_all_series_quickstart/05_嵌入式Linux驱动开发基础知识 \
/source/02_led_drv/02_led_drv_for_boards/100ask_imx6ull_src_bin

如下图红框所示,我的内核源码所在目录为 /home/book/100ask_imx6ull-sdk/Linux-4.9.88 (默认目录),如果你的内核源码不在此目录则根据你的实际情况进行修改。
在这里插入图片描述

修改完内核所在目录后,就可以编译led模块驱动了,如下图 红框1 所示,执行 make all命令就可以编译,编译完成后会生成 100ask_led.ko ledtest 两个文件。

在这里插入图片描述

此时,我们可以把这两个文件拷贝到 Ubuntu nfs服务 目录下,备用:

cp  100ask_led.ko   ledtest   ~/nfs_rootfs

3.7 开发板安装驱动模块

3.7.1 下载编译好的内核镜像和驱动模块到开发板

开发板启动后通过nfs挂载Ubuntu目录的方式,将相应的文件拷贝到开发板内。
如果你使用的是VMware桥接方式,假设Ubuntu IP为192.168.1.100,在开发板上执行以下命令:

[root@imx6ull:~]# mount -t nfs -o nolock,vers=3 192.168.5.11:/home/book/nfs_rootfs /mnt
[root@imx6ull:~]# cp  /mnt/100ask_led.ko   ./
[root@imx6ull:~]# cp  /mnt/ledtest        ./

3.7.2 关闭系统默认cpu状态灯

可能开发板上的led灯已被设置为 CPU地方状态灯(可以看到绿色LED在闪),我们需要将其关闭,才可以使用我们的驱动对其进行操作,关闭方法如下所示:

[root@imx6ull:~]# echo none >  /sys/class/leds/cpu/trigger

我们后面出厂的开发板,已经把CPU状态灯禁止了,所以上述命令可能出错:这没影响。

3.7.3 安装驱动模块

在开发板串口终端上执行如下命令,即可安装相应的驱动模块。

[root@imx6ull:~]# insmod 100ask_led.ko

安装完成后可以执行lsmod 命令来查看是否安装成功。
在这里插入图片描述
出现如下问题,上面所有步骤都是一样的:
在这里插入图片描述如何解决:

3.8 执行测试程序

驱动模块安装成功后,执行先前编译好的测试程序,来控制led灯的状态,如下图所示,操作led灯时可同时观察开发板串口旁的灯是否有亮灭的变化。

[root@imx6ull:~]# chmod  +x  ./ledtest
[root@imx6ull:~]# ./ledtest
Usage: ./ledtest <dev> <on | off>
[root@imx6ull:~]# ./ledtest /dev/100ask_led0 on    //打开led0灯
[root@imx6ull:~]# ./ledtest /dev/100ask_led0 off	//关闭led0灯

4. 编程示例:Ubuntu上的Hello程序

本节演示如何在Windows编写程序、上传到Ubuntu,在Ubuntu中编译、执行。只涉及一个简单的Hello程序,使用命令行编译,不涉及Makefile等知识,这些知识在后面的应用基础中讲解。

4.1 用Source Insight编写hello.c

启动Source Insight,点击“File”->“New”,新建文件:
在这里插入图片描述

接下来编写代码,保存文件,如下图所示:
在这里插入图片描述

hello.c的源码如下:

#include <stdio.h>

int main(int argc, char **argv)
{
	printf("hello, world!\n");
	return 0;
}

4.2 使用FileZilla上传源码

如下图操作:
在这里插入图片描述

4.3 使用MobaXterm远程登录Ubuntu

你当然可以直接在Ubuntu桌面启动终端,但是日常工作中使用MobaXterm会更方便。请参考前面《5.3 使用MobaXterm远程登录Ubuntu》。

4.4 编译、运行程序

如下图操作,对于gcc命令的用法在后面讲到应用开发基础时再细讲,这里只是体验一下:

在这里插入图片描述

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
IMX6ULL是一款高性能、低功耗的嵌入式系统芯片,它可以运行Linux操作系统。下面是IMX6ULL Linux编译的步骤: 1. 安装必要的软件包 在编译IMX6ULL Linux之前,需要安装一些必要的软件包,包括gcc、make、git、uboot等。可以使用以下命令在Linux系统上安装这些软件包: ``` sudo apt-get install gcc make git uboot-tools ``` 2. 获取源代码 可以从官方网站或者Github上获取IMX6ULLLinux源代码。以下是从Github上获取源代码的命令: ``` git clone https://github.com/Freescale/fsl-arm-yocto-bsp.git ``` 3. 配置编译环境 进入源代码目录,执行以下命令配置编译环境: ``` source setup-environment build ``` 该命令会在当前目录下创建一个名为build的目录,并在该目录中配置编译环境。 4. 编译Linux内核 在build目录中,执行以下命令编译Linux内核: ``` bitbake linux-imx ``` 该命令会启动编译器并开始编译内核。编译完成后,可以在build目录下的tmp/deploy/images/imx6ull目录中找到生成的内核文件。 5. 编译rootfs 执行以下命令编译rootfs: ``` bitbake core-image-minimal ``` 该命令会编译一个最小的rootfs,并在build目录下的tmp/deploy/images/imx6ull目录中生成rootfs镜像文件。 6. 烧录镜像文件 将生成的内核文件和rootfs镜像文件烧录到IMX6ULL开发板的存储设备中,即可完成IMX6ULL Linux系统的编译和烧录。 以上就是IMX6ULL Linux编译的基本步骤,具体的编译过程可能会因为不同的开发板、不同的Linux版本等因素而有所不同。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值