@[toc]
1.IMX6ULL开发板初次操作1.1100ask_imx6ull开发板硬件资源简介1.1.1100askimx6ullmini开发板
1.2100ask_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并口模块驱动
接好microusb数据线后,Windows会手动安装驱动(安装可能比较慢linux课程,等一分钟左右)。打开笔记本的“设备管理器”,在“端口(COM和LPT)”项下,可以见到如右图中的“(COM21)”。这儿的“COM21”可能与你笔记本上的不一样,记住你笔记本显示的数字。
假如笔记本没有显示出端标语,就须要自动安装驱动,从驱动精灵官网()下载一个驱动精灵,安装、运行、检测,会手动安装上并口驱动。
1.4.3使用MobaXterm软件打开并口
打开MobaXterm,点击左上角的“Session”,在弹出的界面选中“Serial”,如右图所示选择端标语(上面设备管理器显示的端标语COM21)、波特率(Speed115200)、流控(FlowControl:none),最后点击“OK”即可。步骤如右图所示。注意:流控(FlowControl)一定要选择none,否则你将难以在MobaXterm中向并口输入数据。
随即显示一个红色的窗口,此时打开板子的电源开关,将收到板子并口发过来的数据,如右图所示。
1.4.4开发板登陆名是rootubuntu nfs挂载开发板,无需密码
在并口见到“imx6ulllogin:”时,输入“root”并回车即可,如右图所示:
1.5通过并口操作开发板
在并口见到“imx6ulllogin:”这类登陆的提示信息时,输入“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在开发板上执行mountnfs命令
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目录,开发板mountnfs后就可以直接使用/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应用开发基础知识source1_hello
注意:假如早已使用GTI下载过源码,就不须要重复下载了,否则会有如右图提示:
hello.c的源码如下:
01 #include
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文件拷贝到Ubuntunfs服务目录下,备用:
$ cp hello /home/book/nfs_rootfs
2.4上传程序到开发板并运行
开发板启动后通过nfs挂载Ubuntu目录的形式,将相应的文件拷贝到开发板上。
假如你使用的是VMware桥接方法,假定UbuntuIP为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是一个链接文件,指向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/目录。IMX6ULLMINIEMMC版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编译内核模块
IMX6ULLMINIEMMC版步入内核源码目录后,就可以编译内核模块了:
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命令,假如提示没有该命令,须要执行“sudoaptinstalltree”命令安装tree工具(前提是Ubuntu能上网)。
IMX6ULLMINIEMMC版执行以下命令:
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桥接方法,假定UbuntuIP为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-fhello_drv.ko”这样的命令,它会提示说“内核早已被污染了”,并且不影响学习、不影响使用,如下:
若果不想见到这种提示污染的信息ubuntu nfs挂载开发板,就须要把在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所示,执行makeall命令就可以编译,编译完成后会生成100ask_led.koledtest两个文件。
此时,我们可以把这两个文件拷贝到Ubuntunfs服务目录下,备用:
cp 100ask_led.ko ledtest ~/nfs_rootfs
3.7开发板安装驱动模块3.7.1下载编译好的内核镜像和驱动模块到开发板
开发板启动后通过nfs挂载Ubuntu目录的方法,将相应的文件拷贝到开发板内。假如你使用的是VMware桥接方法,假定UbuntuIP为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在闪),我们须要将其关掉,才可以使用我们的驱动对其进行操作嵌入式linux培训,关掉方式如下所示:
[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 <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用SourceInsight编撰hello.c
启动SourceInsight,点击“File”->“New”,新建文件:
接出来编撰代码,保存文件,如右图所示:
hello.c的源码如下:
#include
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命令的用法在前面提到应用开发基础时再细讲,这儿只是体验一下:
文章评论