目录
一、WiFi开发流程
二、计算机网络
(一)HTTP报文格式
(二)TCP报文格式
(三)UDP(User Datagram Protocol)报文
(四)IP报文格式
三、总线与通信协议
(一)基本概念
(二)GPIO
(三)I2C
(四)PCIe
(五)UART
(六)SPI
(七)MIPI
(八)USB
四、Linux内核无线子系统
(一)相关术语
(二)Linux无线子系统整体结构
五、WLAN/BT协议栈
(一)WLAN协议
(二)BT协议栈
六、WiFi概述
(一)WLAN与WiFi
(二)WiFi协议
(三)WiFi数据包
(四)设备安全接入过程
(五)漫游
(六)相关技术
七、WLAN概述
(一)Wireless tools for Linux
(二)wpa_supplicant
(三)热点Hotspot
(四)Green Tx(GTx)
(五)WiFi Sniffer
(六)WCNSS_qcom_cfg.ini常用参数
八、BT概述
(一)Bluetooth 4.0 on Android KitKat
(二)Bluetooth 4.1 on Android Lollipop
(三)Bluetooth 4.2 on Android Marshmallow and Nougat
(四)Bluetooth 5.0 on Android Oreo
九、其他无线通信技术
(一)UWB
(二)Sub-GHz
一、WiFi开发流程
1、硬件部分评估
(1)项目是基于高通的哪一个硬件平台设计的(确定与WiFi芯片连接的SOC芯片)
(2)项目硬件平台是否支持项目使用的WIFI/BT模组
(3)对比项目与高通参考设计的变更点
- 电源供电部分
- Enable(使能引脚),Reset(重置),Wakeup,Uart GPIO pin → 电路图中找
- 天线部分
- 时钟部分
2、软件部分评估:项目基线代码是否支持项目所使用的模组选型(需要与高通确认)
- 私码部分
- 高通提供的相关bin文件是否完整(Firmware,BDF,Micro Code,Regulatory database)
- host驱动,platform驱动,etc.
3、软件bring up(启动起来)
(1)根据原理图配置项目使用module的defconfig ymn config/kconfig/defconfig/menuconfig/.config对比
(2)配置kernel Device Tree
- xxx-pinctrl.dtsi 定义连接GPIO管脚,主芯片管脚
- wifi:xxx-pcie.dtsi 定义PCIE管脚
- bt:xx-qupv3.dtsi 定义uart管脚 QUP:可以配置好几种通信协议总线
- xx-hsp.dtsi(芯片名.dtsi)
(3)编译WIFI、BT驱动,及相应的附属驱动(PCIE, SDIO,RFKILL …),检查驱动正确加载
(4)检查FW(固件)文件(amss.bin, m3.bin, bdwaln.elf (BDF), regdb.bin)
(5)编译debug工具(wpa_cli, iw, ifconfig …)
(6)WIFI、BT上层服务确认
(7)Setting 确认扫描连接基本功能
4、RF(射频)Team 测试优化:校准,优化参数写入bdwlan.elf文件
- 各个channel(频道)功率校准
- NV校准值,天线配置
- 软件配置
5、软件功能QA测试
- 压力稳定性测试
- 传输速率,吞吐率测试
- Feature测试以及Bug修复
二、计算机网络
数据的传输过程
协议数据单元在应用层、表示层和会话层被称做数据(Data),在传输层被称做分段(Segment),在网络层被称做包(Packet),在数据链路层被称做帧(Frame),在物理层被称做比特(Bit)。
PC1执行OSI七层的封装,然后把比特流传到集线器;集线器在物理层把信号简单放大后,把比特流传到路由器R1;R1执行OSI下三层的处理后,再把比特流传到R2;R2执行OSI下三层的处理后,再把比特流传到交换机;交换机执行OSI下二层的处理后,再把比特流传到服务器
物理层的设备不改变帧的格式,广播式转发;数据链路层的设备也不改变帧的格式,但可以根据数据帧中的目的MAC地址进行转发;网络层的设备改变帧的格式,要执行帧的解封装和再封装,但不改变数据包中的源和目的IP地址。
(一)HTTP报文格式
请求报文主要由三部分组成:起始行、头部字段、消息正文。起始行描述请求或响应的基本信息,由请求方法、URI 、HTTP 版本三个字段组成;头部字段使用key-value形式详细地说明报文;消息正文是实际传输的数据,不一定是纯文本,也可以是图片、视频等二进制数据。起始行和头部字段并称为请求头或响应头 Header,消息正文称为实体 body。HTTP 协议规定每次发送的报文必须有 Header,但可以没有 body,header 和 body 之间必须要有一个空行 CRLF
(二)TCP报文格式
1、源端口和目的端口:标识发送/接收数据的应用程序,不同的应用程序占用不同的端口号
2、序列号Seq:标识从TCP源端向目的端发送的字节流,解决包乱序问题,发起方发送数据时对此进行标记。初始序列号是一个 32 位的随机生成的计数器,每 4 微秒 + 1,每一个 TCP 连接都会有一个不同的初始序列号,防止出现序列号重叠的情况
3、确认号Ack:只有 ACK 标志位为1时,确认序号字段才有效,Ack=Seq+1;目的是确认发出去对方是否有收到,解决丢包问题
4、偏移offset:4位,实际指出了 TCP 报文段的首部长度。它指出了 TCP报文段的数据起始处距离TCP报文的起始处有多远。一个数据偏移量为4 byte,4 位二进制数能表示的最大数字是 15,因此数据偏移的最大值是 60 byte,这也侧面限制了 TCP 首部的最大长度
5、保留字段reserved
6、标志位flags:6位
- URG:值为1时,表示紧急指针 urgent pointer 有效。告诉系统此报文段中有紧急数据,应尽快传送,而不要按原来的排队顺序来传送。
- ACK:确认序号有效
- PSH:当 PSH = 1 的时候,表示该报文段高优先级,接收方 TCP 应该尽快推送给接收应用程序,而不用等到整个 TCP 缓存都填满了后再交付。
- RST(reset the connection):重置连接,用于复位因某种原因引起出现的错误连接,也用来拒绝非法数据和请求。出现的原因包括没有识别正确的 IP 端口、请求超时、取消一个已存在的连接等
- SYN:发起一个新连接
- FIN:释放一个连接
7、窗口:16位,指的是接收通告窗口,是 TCP 流量控制的一个手段,用于告诉对方本端的 TCP 接收缓冲区还能容纳多少字节的数据,对方可据此控制发送数据的速度
8、校验和:16 位,由发送端填充,接收端对TCP报文段执行 CRC 算法以检验TCP报文段在传输过程中是否损坏
9、紧急指针:16 位,一个正的偏移量,和序号字段的值相加表示最后一个紧急数据的下一字节的序号,因此,这个字段是紧急指针相对当前序号的偏移。TCP的紧急指针是发送端向接收端发送紧急数据的方法
(三)UDP(User Datagram Protocol)报文
每个 UDP 报文分为 UDP 报头和 UDP 数据区两部分。报头由 4 个 16 位的字段组成,分别说明该报文的源端口、目的端口、报文长度和校验值
- 源端口号 Source Port:通常包含发送数据报的应用程序所使用的 UDP 端口。
- 目标端口号 Destination Port:表示接收端端口
- 长度 Length:表示 UDP 数据报长度,包含 UDP 报文头和 UDP 数据长度。最小 8 字节(只有报头),最大 65535 字节。
- 校验和 Checksum:保证数据安全性,也提供差错检测(用于校验报文段从源到目标主机的过程中,数据的完整性是否发生了改变)功能。保存的是报头前三个字段和的反码,丢弃溢出位,当报头四个字段和的比特位全为 1 时,表示无差错
(四)IP报文格式
在TCP/IP协议中,使用IP协议传输数据的包被称为IP数据包,每个数据包都包含IP协议规定的内容。IP 协议规定的内容被称为IP数据报文(IP Datagram)或IP数据报。IP数据报文由首部(称为报头)和数据两部分组成。首部的前一部分是固定长度,共20字节,是所有IP数据报必须具有的。在首部的固定部分的后面是一些可选字段,其长度是可变的。
- 版本(version):4位,表示IP协议的版本。通信双方使用的 IP 协议版本必须一致
- 首部长度:4 位,可表示的最大数值是15。这个字段所表示数的单位是32位字长(4字节)。因此,首部长度最大值为60字节。当IP分组的首部长度不是4字节的整数倍时,必须利用最后的填充字段加以填充。
- 区分服务(tos):也称服务类型,占8位,用来获得更好的服务。在使用区分服务时才起作用
- 总长度(totlen):首部和数据之和,单位为字节。总长度字段为16位,因此数据报的最大长度为 2^16-1=65535字节
- 标识(identification):用来标识数据报,占16位。IP 协议在存储器中维持一个计数器。每产生一个数据报,计数器就加 1,并将此值赋给标识字段。当数据报的长度超过网络的 MTU而必须分片时,这个标识字段的值就被复制到所有的数据报的标识字段中。具有相同的标识字段值的分片报文会被重组成原来的数据报。
- 标志(flag):占3位。第一位未使用,值为 0。第二位称为 DF(不分片),表示是否允许分片,取值为 0 时,表示允许分片;取值为 1 时,表示不允许分片。第三位称为 MF(更多分片),表示是否还有分片正在传输,值为 0 时表示没有更多分片需要发送,或数据报没有分片
- 片偏移(offsetfrag):占13位。当报文被分片后,该字段标记分片在原报文中的相对位置。片偏移以8个字节为偏移单位,除最后一个分片,其他分片的偏移值都是8字节的整数倍
- 生存时间(TTL):表示数据报在网络中的寿命,占8位,由发出数据报的源主机设置。其目的是防止无法交付的数据报无限制地在网络中传输,从而消耗网络资源。路由器在转发数据报之前,先把 TTL 值减 1,若 TTL 值减少到 0,则丢弃这个数据报,不再转发。因此,TTL 指明数据报在网络中最多可经过多少个路由器。TTL 的最大数值为 255。若把 TTL 的初始值设为 1,则表示这个数据报只能在本局域网中传送。
- 协议:表示该数据报文所携带的数据所使用的协议类型,占8位。不同的协议有专门不同的协议号,该字段可以方便目的主机的 IP 层知道按照什么协议来处理数据部分。TCP 的协议号为 6,UDP 的协议号为 17,ICMP 的协议号为 1。
- 首部检验和(checksum):用于校验数据报的首部,占16位。数据报每经过一个路由器,首部字段都可能发生变化(如TTL),需要重新校验。数据部分不发生变化,不用重新生成校验值
- 源地址:表示数据报的源 IP 地址,占 32 位。
- 目的地址:表示数据报的目的 IP 地址,占 32 位。该字段用于校验发送是否正确。
- 可选字段:用于一些可选的报头设置,主要用于测试、调试和安全。选项包括严格源路由(数据报必须经过指定的路由)、网际时间戳(经过每个路由器时的时间戳记录)和安全限制
- 填充:由于可选字段中的长度不是固定的,使用若干个0填充该字段,可以保证整个报头的长度是32位的整数倍
- 数据部分:表示传输层的数据,如保存TCP、UDP、ICMP或 IGMP 的数据,长度不固定
三、总线与通信协议
(一)基本概念
1、串行与并行
- 串行:数据按位顺序传输,同一时刻只可以传输一个bit。仅使用一根数据线,适用于计算机与计算机之间、计算机与外设之间的远距离传输,但传输速度相对较慢,且控制复杂
- 并行:数据各个位同时传输,可以以字节/字为单位进行传输。数据传输速率较快,但占用引脚资源较多,故不适合远距离传输(一般同时传输几个位就需要几根数据线)
2、同步与异步(串行)
- 同步:发送端和接收端使用同一时钟,使双方完全同步,一次可以传多个字符数据,传输信息量大、传输速率高,但技术要求高。如I2C、SPI
- 异步:发送端和接收端使用各自的时钟控制数据的发送和接收,是一种不连续的传输方式,一次只能传输一个字符数据。不需要同步时钟,通信实现简单,但传输速率不高。如UART
3、单工、半双工、全双工(串行)
- 单工:数据只能沿一个方向传输,不能反向
- 半双工:允许数据在两个方向传输,但同一时刻,只能沿一个方向传输
- 全双工:允许数据同时在两个方向传输
4、总线:一组信号线的集合,是系统中各功能部件之间进行信息传输的公共通道,一般由数据线、地址线、控制线等构成,主要分为内部总线、系统总线和外部总线/IO总线三种
- 内部总线是微机内部各外围芯片与处理器之间的总线,用于芯片级的互连
- 系统总线是微机中各插件板与系统板之间的总线,用于插件板级的互连
- 外部总线则是微机和外部设备之间的总线,用于设备一级的互连
5、上拉电阻与下拉电阻
- 上拉电阻:通过电阻与电源相连,将不确定的信号钳位到高电平;是向设备输入电流
- 下拉电阻:通过电阻与地相连,将不确定的信号钳位到低电平;是从器件输出电流
(二)GPIO
GPIO(General Purpose Input Output):通用输入/输出,简称IO口或总线扩展器,由引脚和功能寄存器组成,通过在驱动层读写GPIO口的功能寄存器来改变连接在此GPIO上的外设状态
- 推挽输出(push–pull output):一种使用一对选择性地从相连负载灌电流或者拉电流的器件的电路,通常使用一对参数相同的功率三极管或MOSFET管,以推挽方式存在于电路中。电路工作时,两只对称的开关管每次只有一个导通,输出既可以向负载灌电流,也可以从负载抽取电流,即既可以输出高电平,又可以输出低电平
- 开漏输出(Open drain output):不输出电压,控制输出低电平时引脚接地,控制输出高电平时引脚既不输出高电平,也不输出低电平,为高阻态。如果外接上拉电阻,则在输出高电平时电压会拉到上拉电阻的电源电压。
(三)I2C
I2C(Inter Integrated Circuit):双向二线制同步串行总线(串行数据线SDA和串行时钟线SCL),主要用于SOC与外设的连接通讯。串行、同步、非差分、低速率、半双工通信总线
- 采用主从模式,主的一方可以读写数据,从的一方没有主动权,只能等待被读写
- 接口输出模式为开漏输出,且要求外设的输出模式也是开漏输出。SDA与SCL都外接了上拉电阻,所以当SDA空闲时输出的永远是高电平
- I2C为每个设备提供了一个地址,可以通过这个地址找到不同的设备,只有从设备收到是自己的地址时才响应。I2C上可连接多个设备,因此,从设备需要设置自己的地址(地址不能超过7个bit),但主设备不用,因为主设备负责读写其它设备,不会被从设备读写的
- 开始信号:SCL为高电平,而SDA由高到低跳变;结束信号:SCL为高电平,而SDA由低到高跳变
- 传输过程:每次传输时的数据/地址以9位bit进行传输,前8位是数据,最后一位是应答位;传输时高位在前,低位在后
(四)PCIe
PCIe(peripheral component interconnect express):一种高速串行点对点双通道高带宽全双工传输的计算机扩展总线标准,所连接的设备分配独享通道带宽,不共享总线带宽。
- 通道lane:由两个差分信号对组成,一对用于接收数据,一对用于发送数据,因此每条通道都由四根线组成,每条通道都可用于全双工通信
- 链路/互连link:两个端口之间点对点通信的通道。一条链路由一条或多条通道组成,链路包含的通道数称为链路宽度
- 分层结构:物理层PHY、数据链路层(data link layer)、事务层(transaction layer)
(五)UART
UART(Universal Asynchronous Receiver Transmitter):通用异步收发器,一种串行、异步、全双工的通信协议
- 硬件连接仅需要3条线:TX(发送数据端,接对面设备的RX)、RX(接收数据端,接对面设备的TX)、GND(保证两设备共地,有统一的参考平面)
- 有两线、四线的UART模式,两线的UART模式只有TX、RX两个数据线(其实还有GND地线、电源线等),而四线的UART模式,除了TX和RX外,还有RTS和CTS,RTS表示request/ready to send,CTS表示 clear to send
引脚号 | 缩写符 | 信号方向 | 说明 |
1 | DCD | 输入 | 载波检测 |
2 | RXD | 输入 | 接收数据 |
3 | TXD | 输出 | 发送数据 |
4 | DTR | 输出 | 数据终端准备好 |
5 | GND | 公共端 | 信号地 |
6 | DSR | 输入 | 数据装置准备好 |
7 | RTS | 输出 | 请求发送 |
8 | CTS | 输入 | 允许发送 |
9 | RI | 输入 | 振铃指示 |
- 空闲位:当总线处于空闲状态时,信号线的状态为‘1’,即高电平
- 起始位:开始进行数据传输时发送方要先发出一个低电平’0’来表示传输字符的开始
- 数据位:起始位之后就是要传输的数据,数据可以是5,6,7,8,9位,构成一个字符,一般都是8位。先发送最低位最后发送最高位。
- 奇偶校验位:数据位传送完成后,要进行奇偶校验,校验位其实是调整个数。串口校验分几种方式:无校验(no parity);奇校验(odd parity,如果数据位中1的数目是偶数,则校验位为1,否则为0);偶校验(even parity,如果数据为中1的数目是偶数,则校验位为0,否则为1);mark parity(校验位始终为1);space parity(校验位始终为0)
- 停止位:数据结束标志,可以是1位,1.5位,2位的高电平。
(六)SPI
SPI(Serial Peripheral Interface):,串行外设接口,高速、同步、全双工通信总线
- SPI总线的4条逻辑线:
MOSI(SOMI/DIN/DI/SDI/SI):master output slave input,主机输出,从机输入(数据来自主机)
MISO(SIMO/DOUT/DO/SDO/SO):master input slave output,主机输入,从机输出
SCLK(SCK):serial clock,串行时钟信号,由主机产生发送给从机
CS(CE/SSEL/CSN/SS):chip select,片选信号,主要用于发送片选CS信号,即选择从设备,由主机发送,通常低电平是有效信号
- SPI可能有多个设备,但只能有一个主设备,主设备通过SS线控制选择设备。默认情况下,SS线是低电平,主设备通过选择连接在对应SS线下的设备,然后使其发送高电平,当连接在对应SS线上的设备收到高电平时会做出响应,开始接收SDO或SDI的数据。SS线可以有多个,外接多个设备,但SCK、SDO、SDI只有一个,其它设备都接在上面
- 优点:全双工高速通信;推免输出接口(减少走线分叉,保证在高速传输下信号的完整性);无需上拉电阻,功耗低;外围电路和软件配置简单
缺点:单一主设备;传输距离短,一般仅适合板内传输;缺少硬件级别的错误检查协议;无法内部寻址,多从设备时,需要额外的片选信号线
(七)MIPI
MIPI(Mobile Industry Processor Interface):是MIPI Alliance制订接口标准,旨在把手机内部的接口如摄像头、显示屏接口、射频/基带接口等标准化。不是一个单一的接口或协议,而是包含了一套协议和标准,以满足各种子系统独特的要求。
- DSI(Display Serial Interface)定义了一个位于处理器和显示模组之间的高速串行接口。
- CSI(Camera Serial Interface)定义了一个位于处理器和摄像模组之间的高速串行接口。
- SLIMBUS(Serial Low-power Inter-chip Media Bus):异步2线(DATA和CLK)音频接口,用于连接基带/应用处理器和音频芯片,总线协议保证既能发控制信息,又能发数据信息,从而替换传统的数据和控制两种接口(如I2S和I2C)。
(八)USB
USB(Universal Serial BUS):通用串行总线,
四、Linux内核无线子系统
(一)相关术语
MLME:MAC Sublayer Management Entity,MAC子层管理实体,管理物理层MAC状态机
FullMAC:使用硬件管理MLME的无线网卡类型。
SoftMAC:使用软件管理MLME的无线网卡类型。SoftMAC设备允许对硬件有更精细的控制,允许通过软件来替硬件完成802.11帧的管理,允许解析和生成802.11无线帧,现在大部分无线设备都是softMAC设备文章来源:https://www.toymoban.com/news/detail-459157.html
mac80211:一个无线设备驱动开发框架,驱动开发者可以使用mac80211文章来源地址https://www.toymoban.com/news/detail-459157.html
到了这里,关于Android底层驱动开发(十一)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!