I.MX6U-0410学习

1)阅读文档 I.MX6U Linux驱动开发指南

要想进行 Linux 驱动开发,必须要先移植Uboot、然后移植 Linux 系统和根文件系统到你的开发平台上。

Linux 驱动有三大类:字符设备驱动、块设备驱动和网络设备驱动

系统信息查看命令 uname

I.MX6U-0410学习_第1张图片

显示和配置网络属性命令 ifconfig
主要参数如下:

interface
up
down
add
网络接口名称,比如 eth0 等。
开启网络设备。
关闭网络设备。
IP 地址,设置网络 IP 地址。

1、磁盘分区命令 fdisk
如果要对某个磁盘进行分区,可以使用命令 fdisk,命令格如下:

fdisk [参数]
主要参数如下:
-b<分区大小>
指定每个分区的大小。
-l 列出指定设备的分区表。
-s<分区编号> 将指定的分区大小输出到标准的输出上,单位为块。
-u 搭配“-l”参数,会用分区数目取代柱面数目,来表示每个分区的起始地址。

gcc 命令
在上一小节我们已经使用过 GCC 编译器来编译 C 文件了,我们使用到是 gcc 命令, gcc 命
令格式如下:
gcc [选项] [文件名字]
主要选项如下:
-c: 只编译不链接为可执行文件,编译器将输入的.c 文件编译为.o 的目标文件。
-o: <输出文件名>用来指定编译结束以后的输出文件名,如果不使用这个选项的话 GCC 默
认编译出来的可执行文件名字为 a.out。
-g: 添加调试信息,如果要使用调试工具(如 GDB)的话就必须加入此选项,此选项指示编
译的时候生成调试所需的符号信息。
-O: 对程序进行优化编译,如果使用此选项的话整个源代码在编译、链接的的时候都会进
行优化,这样产生的可执行文件执行效率就高。
-O2: 比-O 更幅度更大的优化,生成的可执行效率更高,但是整个编译过程会很慢。
 

GCC 编译器的编译流程是:预处理、编译、汇编和链接。

I.MX6U-0410学习_第2张图片

I.MX6U-0410学习_第3张图片

I.MX6U-0410学习_第4张图片

赋值符“:=“不会使用后面定义的变量,只能使用前面已经定义好的,这就是“=”和“:=”两个的区别。

赋值符“?=”
“?=”是一个很有用的赋值符,比如下面这行代码:
curname ?= zuozhongkai
上述代码的意思就是,如果变量 curname 前面没有被赋值,那么此变量就是“zuozhongkai”,
如果前面已经赋过值了,那么就使用前面赋的值

Makefile 自动化变量
上面讲的模式规则中,目标和依赖都是一系列的文件,每一次对模式规则进行解析的时候
都会是不同的目标和依赖文件,而命令只有一行,如何通过一行命令来从不同的依赖文件中生
成对应的目标?自动化变量就是完成这个功能的!所谓自动化变量就是这种变量会把模式中所
定义的一系列的文件自动的挨个取出,直至所有的符合模式的文件都取完,自动化变量只应该
出现在规则的命令中,常用的自动化变量如表 3.4.4.1:

自动化变量 描述
$@ 规则中的目标集合,在模式规则中,如果有多个目标的话,“$@”表示匹配模
式中定义的目标集合。
$% 当目标是函数库的时候表示规则中的目标成员名,如果目标不是函数库文件,
那么其值为空。
$< 依赖文件集合中的第一个文件,如果依赖文件是以模式(即“%” )定义的,那么
“$<”就是符合模式的一系列的文件集合。
$? 所有比目标新的依赖目标集合,以空格分开。
$^ 所有依赖文件的集合,使用空格分开,如果在依赖文件中有多个重复的文件,
“$^”会去除重复的依赖文件,值保留一份。
$+ 和“$^”类似,但是当依赖文件存在重复的话不会去除重复的依赖文件。
$* 这个变量表示目标模式中"%"及其之前的部分,如果目标是 test/a.test.c,目标模
式为 a.%.c,那么“$*”就是 test/a.test。

表 3.4.4.1 自动化变量
表 3.4.4.1 中的 7 个自动化变量中,常用的三种: $@、 $<和$^,我们使用自动化变量来完
成“示例代码 3.4.3.2”中的 Makefile,最终的完整代码如下所示
 

I.MX6U-0410学习_第5张图片

Makefile 伪目标


Makefile 有一种特殊的目标——伪目标,一般的目标名都是要生成的文件,而伪目标不代
表真正的目标名,在执行 make 命令的时候通过指定这个伪目标来执行其所在规则的定义的命
令。
使用伪目标主要是为了避免 Makefile 中定义的执行命令的目标和工作目录下的实际文件出
现名字冲突

Makefile 条件判断

在 C 语言中我们通过条件判断语句来根据不同的情况来执行不同的分支, Makefile 也支持田间判断


I.MX6U-0410学习_第6张图片

 

I.MX6U-0410学习_第7张图片

Makefile 函数使用


Makefile 支持函数,类似 C 语言一样, Makefile 中的函数是已经定义好的,我们直接使用,
不支持我们自定义函数。 make 所支持的函数不多,但是绝对够我们使用了,函数的用法如下:
$(函数名 参数集合)
或者:
${函数名 参数集合}
可以看出,调用函数和调用普通变量一样,使用符号“$”来标识。参数集合是函数的多个
参数,参数之间以逗号“,”隔开,函数名和参数之间以“空格”分隔开,函数的调用以“$”开
头。接下来我们介绍几个常用的函数,其它的函数大家可以参考《跟我一起写 Makefile》这份
文档

1、函数 subst
函数 subst 用来完成字符串替换,调用形式如下:
$(subst ,,)
此函数的功能是将字符串中的内容替换为,函数返回被替换以后的字符
串,比如如下示例:
$(subst zzk,ZZK,my name is zzk)

把字符串“my name is zzk”中的“zzk”替换为“ZZK”,替换完成以后的字符串为“my name
is ZZK”。

2、函数 patsubst
函数 patsubst 用来完成模式字符串替换,使用方法如下:
$(patsubst ,,)
此函数查找字符串中的单词是否符合模式,如果匹配就用
替换掉, 可以使用通配符“%”,表示任意长度的字符串,函数返回值就是替换后的字
符串。如果中也包涵“%”,那么中的“%”将是中的那个
“%”所代表的字符串,比如:
$(patsubst %.c,%.o,a.c b.c c.c)
将字符串“a.c b.c c.c”中的所有符合“%.c”的字符串,替换为“%.o”,替换完成以后的字
符串为“a.o b.o c.o”。

3、函数 dir
函数 dir 用来获取目录,使用方法如下:
$(dir )
此函数用来从文件名序列中提取出目录部分,返回值是文件名序列的目录
部分,比如:
$(dir )
提取文件“/src/a.c”的目录部分,也就是“/src”。

4、函数 notdir
函数 notdir 看名字就是知道去除文件中的目录部分,也就是提取文件名,用法如下:
$(notdir )
此函数用与从文件名序列中提取出文件名非目录部分,比如:
$(notdir )
提取文件“/src/a.c”中的非目录部分,也就是文件名“a.c”。

5、函数 foreach
foreach 函数用来完成循环,用法如下:
$(foreach , ,)
此函数的意思就是把参数中的单词逐一取出来放到参数中,然后再执行
包含的表达式。每次都会返回一个字符串,循环的过程中, 中所包含的每个字符串
会以空格隔开,最后当整个循环结束时, 所返回的每个字符串所组成的整个字符串将会是
函数 foreach 函数的返回值。

6、函数 wildcard
通配符“%”只能用在规则中,只有在规则中它才会展开,如果在变量定义和函数使用时,
通配符不会自动展开,这个时候就要用到函数 wildcard,使用方法如下:
$(wildcard PATTERN…)
比如:
$(wildcard *.c)
上面的代码是用来获取当前目录下所有的.c 文件,类似“%”。

                              裸机开发篇

本篇讲解 ARM 的裸机开发,也就是不带操作系统开发,就和我们开发 STM32 一样

1、裸机开发是了解所使用的 CPU 最直接、最简单的方法,比如本教程使用的 I.MX6U,跟
STM32 一样,裸机开发是直接操作 CPU 的寄存器。 Linux 驱动开发最终也是操作的寄存器,但
是在操作寄存器之前要先编写一个符合 Linux 驱动的框架。同样一个点灯驱动,裸机可能只需
要十几行代码,但是 Linux 下的驱动就需要几十行代码。
2、大部分 Linux 驱动初学者都是从 STM32 转过来的, Linux 驱动开发和 STM32 开发区别
很大,比如 Linux 没有 MDK、 IAR 这样的集成开发环境,需要我们自己在 Ubuntu 下搭建交叉
编译环境。

开启 Ubuntu 下的 FTP 服务
打开 Ubuntu 的终端窗口,然后执行如下命令来安装 FTP 服务:
sudo apt-get install vsftpd
等待软件自动安装,安装完成以后使用 VI 命令打开/etc/vsftpd.conf,命令如下:
sudo vi /etc/vsftpd.conf
打开 vsftpd.conf 文件以后找到如下两行:
local_enable=YES
write_enable=YES
修改完 vsftpd.conf 以后保存退出,使用如下命令重启 FTP 服务:
sudo /etc/init.d/vsftpd restart

windows下工具

I.MX6U-0410学习_第8张图片



 Ubuntu 交叉编译工具链安装

 交叉编译器安装

ARM 裸机、 Uboot 移植、 Linux 移植这些都需要在 Ubuntu 下进行编译,编译就需要编译
器。

I.MX6U-0410学习_第9张图片

很多种 GCC 交叉编译工具链,因为我们所使用的 I.MX6U-ALPHA 开发板
是一个 Cortex-A7 内核的开发板,因此选择 arm-linux-gnueabihf,点击后面的“Binaries”进入可
执行文件下载界面,
I.MX6U-0410学习_第10张图片

在写本教程的时候最新的编译器版本是 7.3.1,但是笔者在测试 7.3.1 版本编译器的时候发
现编译完成后的 uboot 无法运行。所以这里不推荐使用最新版的编译器。笔者测试过 4.9 版本的
编 译 器 可 以 正 常 工 作 , 所 以 我 们 需 要 下 载 4.9 版 本 的 编 译 器 , 下 载 地 址 为 :
https://releases.linaro.org/components/toolchain/binaries/4.9-2017.01/arm-linux-gnueabihf/ , 如 图

I.MX6U-0410学习_第11张图片

只需要关注这两种: gcc-linaro-4.9.4-2017.01-
i686_arm-linux-gnueabihf.tar.tar.xz 和 gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz,
第一个是针对 32 位系统的,第二个是针对 64 位系统的。大家根据自己所使用的 Ubuntu 系统类
型选择合适的版本,比如我安装的 Ubuntu 16.04 是 64 位系统,因此我要使用 gcc-linaro-4.9.4-
2017.01-x86_64_arm-linux-gnueabihf.tar.xz。
这两种交叉编译器我们已经下载好放到了开发板光盘中,路径: 5、开发工具->1、交叉编
译器。我们要先将交叉编译工具拷贝到 Ubuntu 中,在 4.2.1 小节中我们在当前用户根目录下创
建了一个名为“linux”的文件夹,在这个 linux 文件夹里面再创建一个名为“tool”的文件夹,
用来存放一些开发工具。使用前面已经安装好的 FileZilla 将交叉编译器拷贝到 Ubuntu 中刚刚
新建的“tool”文件夹中

板子结构


 

正点原子 I.MX6U-ALPHA 开发板底板板载资源如下:
◆ 1 个核心板接口,支持 I.MX6UL/6ULL 等核心板
◆ 1 个电源指示灯(蓝色)
◆ 1 个状态指示灯(红色)
◆ 1 个六轴(陀螺仪+加速度)传感器芯片, ICM20608
◆ 1 个高性能音频编解码芯片, WM8960
◆ 1 路 CAN 接口,采用 TJA1050 芯片
◆ 1 路 485 接口,采用 SP3485 芯片
◆ 1 路 RS232 串口(母)接口,采用 SP3232 芯片
◆ 1 个 ATK 模块接口,支持正点原子蓝牙/GPS/MPU6050/手势识别等模块
◆ 1 个光环境传感器(光照、距离、红外三合一)
◆ 1 个摄像头模块接口
◆ 1 个 OLED 模块接口
◆ 1 个 USB 串口,可用于代码调试
◆ 1 个 USB SLAVE(OTG)接口,用于 USB 从机通信
◆ 1 个 USB HOST(OTG)接口,用于 USB 主机通信
◆ 1 个有源蜂鸣器
◆ 1 个 RS232/RS485 选择接口
◆ 1 个串口选择接口
◆ 1 个 TF 卡接口(在板子背面)
◆ 2 个 10M/100M 以太网接口(RJ45)
◆ 1 个录音头(MIC/咪头)
◆ 1 路立体声音频输出接口
◆ 1 路立体声录音输入接口
◆ 1 个小扬声器(在板子背面)
◆ 2 个扬声器外接接口,左右声道。
◆ 1 组 5V 电源供应/接入口
◆ 1 组 3.3V 电源供应/接入口
◆ 1 个直流电源输入接口(输入电压范围: DC6~18V)
◆ 1 个启动模式选择配置接口
◆ 1 个 RTC 后备电池座,并带电池
◆ 1 个复位按钮,可用于复位 MPU 和 LCD
◆ 1 个功能按钮
◆ 1 个电源开关,控制整个板的电源
◆ 1 个 Mini PCIE 4G 模块接口
◆ 1 个 Nano SIM 卡接口
◆ 1 个 SDIO WIFI 接口

sudo apt-get autoremove open-vm-tools

sudo apt-get install open-vm-tools

sudo apt-get install open-vm-tools-desktop

在虚拟机安装vm-tools

你可能感兴趣的:(杂谈笔记,运维,linux)