Harmony鸿蒙南向外设驱动开发-WLAN

功能简介

无线局域网数据传输是端侧设备不可或缺的一部分,用户可以方便地接入到无线网络进行数据传输和共享,并且在无线网络覆盖区域自由移动,彻底摆脱有线的束缚。基于HDF(Hardware Driver Foundation)驱动框架开发的WLAN驱动,能够屏蔽硬件器件差异,为上层WLAN服务提供稳定的基础能力接口,包括启动扫描、关联/取消关联热点、获取MAC地址、设置MAC地址、获取链路信息等。

基本概念

开发前,开发者应了解一下WLAN涉及的基本概念:

  • AP

    无线接入点(Access Point,简称AP),是网络的中心节点,提供无线接入服务。其它无线设备接入后,可以进行数据访问。

  • STA

    站点(Station,简称STA),是无线局域网的最基本组成单元。每一个连接到无线网络中的终端(如笔记本电脑、PDA及其它可以联网的用户设备)都可称为一个站点。

  • ssid

    无线网络的名称,用来标识一个无线网络,每个无线网络都有自己的ssid。

  • bssid

    用于标识WLAN中的基本服务集,是唯一的48位MAC地址。

  • Scan

    终端设备扫描环境中的无线网络,获取到周围的无线网络信息。包括热点名称(ssid)、工作频带和信号强度等。

  • Associate

    终端设备指定有效的热点进行连接,成功后即可与AP端数据通信。终端同一时刻只可以和一个AP建立链路。

运作机制

本文主要介绍基于HDF(Hardware Driver Foundation)驱动框架开发的WLAN功能。WLAN整体框架:

image

  1. 上层服务基于业务需要调用HDI接口,将用户态消息通过WPA层或HAL层下发至Client层。WPA层接口提供设置加密方式、关联热点、设置信道、隐藏热点等功能,HAL层接口作为WPA接口的补充,提供设置国家码、设置MAC地址、获取信道信息等功能。

  2. Message模块将用户态的消息按组件分发至AP、STA等模块。

  3. Hdf_Mac80211定义底层驱动相关的MAC层接口。命令字段下发至Hdf_Mac80211,再通过Bus模块发送到WLAN芯片固件侧。

  4. Bus模块向上提供统一的总线抽象接口。通过向下调用Platform层提供的SDIO接口和封装适配USB、PCIE接口,屏蔽不同内核的差异;通过对不同类型的总线操作进行统一封装,屏蔽不同芯片差异,能够对不同芯片厂商提供完备的总线驱动能力,不同厂商共用此模块接口,从而使厂商的开发更为便捷和统一。

  5. EAPOL(Extensible Authentication Protocol Over LAN),基于局域网的扩展认证协议,主要用于在客户端和设备(接入设备、服务器)之间传送EAP协议报文,以允许EAP协议报文在LAN上传送,完成认证流程,实现设备上线功能。

  6. NetDevice用于建立专属网络设备,屏蔽不同OS的差异,对WiFi驱动提供统一接口,提供统一的HDF NetDevice数据结构,及其统一管理、注册、去注册能力;对接轻设备及富设备上的Linux的网络设备层。

  7. NetBuf为WLAN驱动提供Linux或者LiteOS原生的网络数据缓冲的统一数据结构的封装以及对网络数据的操作接口的封装。

  8. 协议栈与NetDevice模块、NetBuf模块共同协同完成数据流交互。

约束与限制

WLAN驱动为上层WLAN服务提供稳定的基础能力接口,HDI接口适用于标准系统,HAL接口适用于小型系统及轻量系统。

开发指导

场景介绍

WLAN驱动的主要工作是为上层WLAN服务提供稳定的基础能力接口,保证用户可以方便地接入到无线网络,实现数据传输和共享。不同WLAN模组需要适配OpenHarmony时,请参考如下的接口说明和开发步骤。

接口说明

WLAN模块有三部分对外开放的API接口:

  1. 对上层服务提供HDI以及HAL能力接口。

  2. 提供给各厂商实现的能力接口。

  3. 驱动直接调用WLAN模块能力接口。

  • WLAN驱动模块对上层服务提供的能力接口,主要功能有:创建/销毁IWiFi对象、设置MAC地址、设置发射功率等。以下接口列举的为IDL接口描述生成的对应C语言函数接口,如表1、表2所示。接口声明见idl文件(/drivers/interface/wlan/v1_1/)。

    表1 wifi_hal.h

    接口名称 功能描述
    int32_t WifiConstruct(struct IWiFi **wifiInstance) 创建IWiFi对象,提供IWiFi基本能力。
    int32_t WifiDestruct(struct IWiFi **wifiInstance) 销毁IWiFi对象。
    int32_t (*start)(struct IWiFi *) 创建HAL和驱动之间的通道及获取驱动支持的网卡信息。
    int32_t (*stop)(struct IWiFi *) 销毁通道。

    表2 wifi_hal_base_feature.h

    接口名称 功能描述
    int32_t (*getFeatureType)(const struct IWiFiBaseFeature *) 获取特性的类型。
    int32_t (*setMacAddress)(const struct IWiFiBaseFeature *, unsigned char *, uint8_t) 设置MAC地址。
    int32_t (*getDeviceMacAddress)(const struct IWiFiBaseFeature *, unsigned char *, uint8_t) 获取设备持久化的MAC地址。
    int32_t (*setTxPower)(const struct IWiFiBaseFeature *, int32_t) 设置发射功率。
  • WLAN驱动模块提供了需要驱动开发人员自行去填充具体实现内容的能力接口,主要功能有:初始化/注销NetDevice、打开/关闭NetDevice、获取NetDevice的状态等。提供的部分接口说明如表3所示:

    表3 net_device.h

    接口名称 功能描述
    int32_t (*init)(struct NetDevice *netDev) 初始化NetDevice。
    struct NetDevStats *(*getStats)(struct NetDevice *netDev) 获取NetDevice的状态。
    int32_t (*setMacAddr)(struct NetDevice *netDev, void *addr) 设置Mac地址。
    void (*deInit)(struct NetDevice *netDev) 注销NetDevice。
    int32_t (*open)(struct NetDevice *netDev) 打开NetDevice。
    int32_t (*stop)(struct NetDevice *netDev) 关闭NetDevice。
  • WLAN驱动模块提供给驱动开发人员可直接调用的能力接口,主要功能有:创建/释放WifiModule、关联/取消关联、申请/释放NetBuf、lwip的pbuf和NetBuf的相互转换等。

    可直接调用的接口如表4、表5和表6所示。

    表4 wifi_module.h

    接口名称 功能描述
    struct WifiModule *WifiModuleCreate(const struct HdfConfigWifiModuleConfig *config) 基于HDF开发WLAN驱动时,创建一个WifiModule。
    void WifiModuleDelete(struct WifiModule *module) 基于HDF开发WLAN驱动时,删除并释放WifiModule所有数据。
    int32_t DelFeature(struct WifiModule *module, uint16_t featureType) 基于HDF开发WLAN驱动时,从WifiModule删除一个功能组件。
    int32_t AddFeature(struct WifiModule *module, uint16_t featureType,
     struct WifiFeature *featureData)
    基于HDF开发WLAN驱动时,注册一个功能组件到WifiModule。

    表5 wifi_mac80211_ops.h

    接口名称 功能描述
    int32_t (*startAp)(NetDevice *netDev) 启动AP。
    int32_t (*stopAp)(NetDevice *netDev) 停止AP。
    int32_t (*connect)(NetDevice *netDev, WifiConnectParams *param) 开始关联。
    int32_t (*disconnect)(NetDevice *netDev, uint16_t reasonCode) 取消关联。

    表6 hdf_netbuf.h

    接口名称 功能描述
    static inline void NetBufQueueInit(struct NetBufQueue *q) 初始化NetBuf队列。
    struct NetBuf *NetBufAlloc(uint32_t size) 申请NetBuf。
    void NetBufFree(struct NetBuf *nb) 释放NetBuf。
    struct NetBuf *Pbuf2NetBuf(const struct NetDevice *netdev, struct pbuf *lwipBuf) lwip的pbuf转换为NetBuf。
    struct pbuf *NetBuf2Pbuf(const struct NetBuf *nb) NetBuf转换为lwip的pbuf。

开发步骤

WLAN驱动基于HDF框架和Platform框架开发,不区分OS和芯片平台,为不同厂商的WLAN模组提供统一的驱动模型,各WLAN模组厂商根据如下开发流程适配WLAN驱动框架。示例以Hi3881WLAN芯片为例。

配置Driver的HCS文件

HCS文件配置包括:device相关配置和组件配置。

  • device相关配置

    配置文件内容包括:电源配置、复位配置和总线配置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值