配置VMWARE使用双网卡连接开发板

使用网卡连接开发板后在此电脑->设置->设备管理器->网络适配器中查看是否有连接

在虚拟网络适配器中的桥接模式选择指定的开发板网卡

Linux配置ip

在虚拟机中setting设置网络,ip为192.168.5.11

Windows配置ip

在网络适配器中指定ip

连接串口

用usb线将开发板与电脑连接起来,在设备管理器中显示了串口后在MobaXterm中添加串口,首先点击Session,在里面点击Serial,将波特率改为115200,之后选择高级选项Advance Serial setting选择8N1控制流为None,完成后点击ok,进入连接后用户名为root,输入root即可登录

开发板挂在ubuntu的NFS目录

NFS(Net File System)

在前面配置环境时已经开启了访问权限并启动了NFS服务

通过网络访问Ubuntu目录

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

使用该命令即可挂载Ubuntu目录

开发板的第一个APP

首先在虚拟机中进行交叉编译arm-buildroot-linux-gnueabihf-gcc -o hello hello.c

编译完成后将目标文件拷贝至nfs服务目录中cp hello /home/book/nfs_rootfs

开发板挂载nfs服务目录

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

将目录中的目标文件拷贝到开发板目录中cp /mnt/hello ./hello

将目标文件添加可执行命令chmod +x hello

执行目标文件**./hello**

将文件交叉编译后复制到Ubuntu的nfs服务目录下,开发板经过nfs挂载Ubuntu的目录后将相应的文件拷贝到开发板上,通过chmod添加可执行权限后执行程序即可。

开发板的第一个驱动

编译替换内核

根据Linux开发手册中提供的指令依次执行

首先编译内核,然后编译设备树,编译完成后将设备树拷贝到对应目录。

编译完成后更换开发板上原有的驱动程序

GCC编译过程

预处理

-E 生成.i文件,具体工作为将程序中的头文件和宏定义进行展开

编译

-s 生成.s文件,将预处理文件编译成汇编码

汇编

-c 生成.o文件,将汇编码文件编译成机器指令文件

链接

-o 将若干个.o文件连接成一个可执行文件

反汇编

将链接生成的文件进行反汇编生成汇编码文件

常用选项

-I 指定查找头文件路径

压缩成静态库

ar crs xxx.a xxx.o

链接时将静态库和目标文件链接到一起即可

Makefile

规则

目标文件:依赖文件

TAB 命令

当目标文件不存在或者目标文件最近有过更改时,执行目标命令

语法

通配符

%

命令中的$@表示目标文件

$<表示第一个依赖文件

$^表示所有的依赖文件

clean清除指定文件

变量

使用变量时$(x),x为变量

即使变量

即简单变量,A := XXX ,A的值即刻确定

延时变量

B = XXX , B的值使用到时才确定

其他

?=,如果第一次定义才起效,如果在前面该变量已定义则忽略这句

+=, 附加,它是即使变量还是延时变量取决于前面的定义

函数

$(foreach f, var1, var2)

功能类似于foreach

$(filter pattern, text)

在text中取出符合pattern格式的值

$(filter-out pattern, text)

在text中取出不符合pattern格式的值

$(wildcard pattern)

取出文件名格式为pattern的文件

$(patsubst, src, dst, src_file)

在src_file变量中取出src的数值替换成dst

实例

生成依赖文件

gcc -M -MF x.d x.c

x.d为x.c所需要的依赖文件

在Makefile文件中添加的参数为 -MD -MF .$@.d

文件IO

访问虚拟文件需要先进行挂载

通用IO模型

open/read/write/lseek/close

内核接口实现

在使用open/read/write此类函数时会触发异常,调用内核层级的 sys_open,sys_read函数

字符编码方式

Unicode

每个汉字都对应一个数值

字符设备驱动程序

块设备驱动程序

交叉编译程序

编译程序时如何寻找头文件

链接时如何寻找头文件

运行时如何寻找头文件

找不到头文件时可以将缺少的头文件放入系统目录

网络通信

三要素

源、目的、长度

两个相同的客户端连接同一个服务器时,连接时客户端的IP是相同的,但端口是不同的,服务器根据源端口

来区分一个IP下的两个连接

服务器创建连接

创建套接字

绑定自己的IP和端口号

开始监听数据

监听到之后进行建立连接

send和recv进行收发

UDP没有监听数据和建立连接的操作

客户端建立连接

创建套接字

connect与服务器建立连接

send和recv进行收发

串口

打印信息

外接模块

波特率

格式:数据位,停止位,校验位

发送时双方约定波特率,即每一位占用的时间

在起始电平为高电平时,ARM拉低,保持1bit时间,即为开始位,PC在低电平处开始处计时,ARM根据数据驱动TXD电平,逐位发送数据,PC机在数据位的中间读取引脚状态来接收数据,传输数据完成后传输停止位结束本次数据传输。

使用8n1数据传输方式时传输一字节需要10位,一秒钟可以传输11520个字节

TTY体系

tty通过调制解调器或无线连接串口接入计算机

tty0为当前前台运行的虚拟终端

terminal和console的差别

console是某一个terminal

terminal并不都是console

权限比终端大

TTY驱动程序框架

PC机通过UART发送字符给ARM板,ARM板先使用UART进行接收,随后上传给驱动层,驱动层将字符上传至行规程,行规程将数据经由ARM板发送回PC机进行回显。

IIC

传输过程

发数据

发出起始信号,发出地址和方向,等待回应,发送数据,等待回应,结束发送

接收数据

发送起始信号,发送地址和方向,等待回应,传输数据,等待回应,结束发送

IIC信号

开始信号:SCL为高电平时,SDA产生高电平到低电平的跳变,开始传输数据

停止信号:SCL为高电平时,SDA产生低电平到高电平的跳变,结束传输数据

响应信号:接收器在接收到8位数据后,在第9个时钟周期,拉低SDA

SMBus

该协议是IIC的子集,对IIC中的硬件和软件有更严格的要求,包括时钟频率,地址回应,数据格式和重复发送START信号

VDD极限不同:SMBus要求1.8~5V,IIC范围很广,可高达12V

IIC结构体

i2c_adapter

驱动开发基础知识

file_operations结构体在内核中存放在一个数组中,编号即为主设备号,注册驱动时需要该主设备号。

驱动分层思想

led_resource结构体中左边分配资源,右边编写硬件通用代码

总线设备驱动模型

平台device结构体和平台driver结构体通过.name成员变量进行匹配

平台设备device指定资源,平台driver用来做驱动程序相关的事情

总线驱动分为dev和drv两个链表,注册硬件资源时放入dev链表,注册驱动程序时放入drv链表,在调用驱动程序时从dev链表中一一对比结构体中的name,匹配成功后被调用,分配/设置/注册file_operations结构体,根据dev确定硬件,使用ioremap映射寄存器,操作寄存器。

一些疑惑和个人理解

为何要进行三网ping通

个人理解为嵌入式Linux编程传输文件需要使用nfs文件目录,和使用tftp进行文件的传输,所以需要三网ping通用于传输文件

用于将虚拟机上的nfs挂载到开发板上