rtl8192移植以及802.11相关概念

工作内容

原理介绍

根据realtek提供的SDK移植到我们的mdm9640平台 。

文件介绍

RTL8192软件SDK中包含如下的文件:

  1. configuration-scripts 初始化wifi的相关脚本
  2. DriverSrcPkg/Driver对应内核模块代码
  3. DriverSrcPkg/Users对应realtek芯片控制用的相关程序

修改编译环境

详细修改参数请参考:RTL819x_AIO_porting_guide.pdf

platform.mk中添加如下平台相关选项:

1
2
3
4
5
6
7
8
9
10
ifeq ($(CONFIG_PLATFORM),ARM_QUALCOMM_9x15)
EXTRA_CFLAGS += -D_LITTLE_ENDIAN_ -DSMP_SYNC
ARCH := arm
KSRC ?= ${ANDROID_KERN_DIR}
CROSS_COMPILE ?= arm-oe-linux-gnueabi-
EXTRA_CFLAGS += -DCONFIG_RTL_80211D_SUPPORT
EXTRA_CFLAGS += -DCONFIG_RTL_CLIENT_MODE_SUPPORT
EXTRA_CFLAGS += -DCONFIG_RTL_REPEATER_MODE_SUPPORT -DSDIO_2_PORT
RTL8192CD_NUM_VWLAN := 1
endif

内置PA,外置PA配置

修改config.mk中的如下选项:

1
2
3
4
5
6
# If Use External PA, LNA ?
CONFIG_EXT_PA :=y
CONFIG_EXT_LNA :=y
# If not Use External PA, LNA ?
CONFIG_EXT_PA :=n
CONFIG_EXT_LNA :=n

驱动加载及测试

加载驱动

insmod rtl8192es.ko

启动端口

ifconfig wlan0 up
搜索wifi,如果能正常搜索到,则说明驱动正常

ssid消失

调试过程中出现ssid经常消失的情况,为外部PA配置问题,参照驱动编译中的PA配置即可

测试

通过configuration-scripts中的脚本可以测试相关功能

编译到工程

当wifi驱动 工作正常后可以将其添加到工程,添加方法如下:oe-core/meta-msm/recipes/images/mdm9607-image.inc 中添加 IMAGE_INSTALL += “rtl8192”

802.11

相关概念

BSS:基本服务集,一个AP + client STAs
DSS:分布式系统服务
ESS:扩展服务集,多个共享ESSID的BSS
IBSS:独立BSS
ESSID :网络名称,同SSID
BA :块确认,对多个MPDU进行确认
MESH: 无线网格网络
ad-hoc: 点对点连接
CCA:clear channel assessment 空闲信道评估
OFDM:正交频分复用每个子载相互正交
802.11n使用OFDM,子载波间隔31.25k
QAM :正交振幅调制,Quadrature Amplitude Modulation的缩写
GI: 保护间隔
short GI: 400ns
long GI : 800ns
A-MPDU :MAC层PDU包聚合打包多个802.11帧到一个MPDU ,最大64KB
A-MSDU :MAC层SDU包聚合硬件实现,打包多个ethernet 帧到一个MSDU,最大8KB
当使用A-MPDU时,最大A-MSDU子帧不能大于4KB,因为每个A-MPDU子帧的最大长度是4KB

支持的速率

影响速率的因素:编码方式 调制方式 保护间隔 带宽

802.11b

1, 2, 5.5, 11
(11Mchip/s) / 8chip * 8bit = 11Mbit/s

802.11g

6, 9, 12, 18, 24, 36, 48, 54
(1秒/4微秒)×(6bit×48×3/4)= 54Mbit/s

802.11n 20Mhz

400 ns GI : 7.2, 14.4, 21.7, 28.9, 43.3, 57.8, 65, 72.2
(1秒/3.6微秒)×(6bit×52×5/6)= 72.2Mbit/s
800 ns GI : 6.5, 13, 19.5, 26, 39, 52, 58.5, 65
(1秒/4微秒)×(6bit×52×5/6)= 65Mbit/s

802.11n 40MHz

400 ns GI : 15, 30, 45, 60, 90, 120, 135, 150
(1秒/3.6微秒)×(6bit×108×5/6)= 150Mbit/s
800 ns GI : 13.5, 27, 40.5, 54, 81, 108, 121.5, 135
(1秒/4微秒)×(6bit×108×5/6)= 135Mbit/s

802.11n MIMO

1×1 支持MCS0 – MSC7 150Mbps
2×2 支持MCS0 – MSC15 300Mbps
3×3 支持MCS0 – MSC23 450Mbps
4×4 支持MCS0 – MSC31 600Mbps

802.ac

最高可达6.9Gbps

802.11包格式

PPDU : PLCP + PSDU
PLCP :  PLCP Preamble + PLCP Header
PSDU : MPDU or A-MPDU
MPDU : MAC Header + MSDU
PSDU最大长度65535字节
MSDU最大长度2304字节
A-MSDU最大长度7935字节

数据帧

-Data
-Data + CF-Ack
-Data + CF-Poll
-Data + CF-Ack + CF-Poll

控制帧

-BAQ
-BA
-RTS
-CTS
-ACK
-CF-End
-CF-End+CF-Ack

管理帧

-Beacon
-Probe request
-Probe response
-Authentication
-Association Request
-Association Response
-ReassociationRequest
-ReassociationResponse
-Disassociation
-Deauthentication
-ATIM

AP 接入过程

STA 传输方向 AP
< Beacon
Probe request >
< Probe Response
Auth Request >
< Authentication Response
Association Request >
< Association Response
Data >
< Data
><

SFE

sfe 介绍

全称:Shortcut Forward Engine,快捷转发引擎
用于加速LAN和WAN端口之间的数据转发,当以太网包匹配到一个SFE实体时,
将不会进行Linux kernel网络栈的路由而直接发送,从而减少CPU的使用

sfe包聚合功能 

sfe的在接收到的包数量达到一定的阈值或定时器超时时才会进行数据包的发送
相关代码如下:

1
2
3
4
5
6
7
8
if(aggr_params[cm->index].skb_head)
dev_queue_xmit_list(aggr_params[cm->index].skb_head);
elsLibreOffice Writer,在窗口右e
dev_queue_xmit(new_skb);
/* Reset the params. */
aggr_params[cm->index].curr_dl_skb_num = 0;
aggr_params[cm->index].skb_head = NULL;
aggr_params[cm->index].skb_tail = NULL;

当包数量大于一个时会调用dev_queue_xmit_list,当包数量为1时,会调用
dev_queue_xmit,dev_queue_xmit_list发送整条以太网帧数据链表,需要特殊的驱动支持。

关闭sfe的包聚合功能

echo 1 > /proc/sys/debug/sfe/threshold
echo 10000 > /proc/sys/debug/sfe/timeout_value