1. 初始化WiFi HAL模块

初始化WiFi HAL模块 学习卡片

任务说明

本案例目标是在Android系统源码环境中,完成WiFi HAL模块的初始化流程。具体任务为:实现一个符合Android HAL接口规范的WiFi HAL模块,提供初始化入口函数,完成HAL模块的加载、版本校验及基础状态初始化,并通过HAL模块接口获取当前WiFi芯片支持的功能集合。

实现方案

WiFi HAL模块在Android系统中以共享库形式存在(wifi.so),通过标准HAL机制加载。本案例实现核心初始化函数wifi_hal_initialize,该函数负责:创建HAL上下文结构体、初始化互斥锁、设置HAL版本号、调用底层芯片能力探测回调。为保持案例独立可复现,芯片能力探测通过读取系统属性ro.boot.wifi_chip_type模拟,实际硬件平台中该属性由Bootloader写入。

// wifi_hal.c
#include <string.h>
#include <pthread.h>
#include <cutils/properties.h>
#include "wifi_hal.h"

static wifi_hal_context_t g_hal_ctx;
static pthread_mutex_t g_init_lock = PTHREAD_MUTEX_INITIALIZER;

/* 模拟芯片能力探测:根据系统属性返回支持的功能位图 */
static uint32_t probe_chip_capability(void) {
    char chip_type[PROPERTY_VALUE_MAX] = {0};
    property_get("ro.boot.wifi_chip_type", chip_type, "generic");

    if (strcmp(chip_type, "bcm43455") == 0) {
        return WIFI_FEATURE_802_11AC | WIFI_FEATURE_WPA3;
    } else if (strcmp(chip_type, "qca6174") == 0) {
        return WIFI_FEATURE_802_11AX | WIFI_FEATURE_WPA3 | WIFI_FEATURE_DFS;
    }
    return WIFI_FEATURE_802_11N;  // 默认能力
}

int wifi_hal_initialize(wifi_hal_context_t **out_ctx) {
    if (out_ctx == NULL) return WIFI_HAL_ERROR_INVALID_ARGS;

    pthread_mutex_lock(&g_init_lock);

    if (g_hal_ctx.state == HAL_STATE_INITIALIZED) {
        *out_ctx = &g_hal_ctx;
        pthread_mutex_unlock(&g_init_lock);
        return WIFI_HAL_SUCCESS;
    }

    memset(&g_hal_ctx, 0, sizeof(g_hal_ctx));
    g_hal_ctx.version = WIFI_HAL_VERSION_1_0;
    g_hal_ctx.state = HAL_STATE_READY;
    g_hal_ctx.capabilities = probe_chip_capability();
    pthread_mutex_init(&g_hal_ctx.lock, NULL);

    *out_ctx = &g_hal_ctx;
    pthread_mutex_unlock(&g_init_lock);
    return WIFI_HAL_SUCCESS;
}

int wifi_hal_get_capabilities(wifi_hal_context_t *ctx, uint32_t *caps) {
    if (ctx == NULL || caps == NULL) return WIFI_HAL_ERROR_INVALID_ARGS;
    if (ctx->state != HAL_STATE_INITIALIZED) return WIFI_HAL_ERROR_NOT_INITIALIZED;

    pthread_mutex_lock(&ctx->lock);
    *caps = ctx->capabilities;
    pthread_mutex_unlock(&ctx->lock);
    return WIFI_HAL_SUCCESS;
}
// wifi_hal.h
#ifndef WIFI_HAL_H
#define WIFI_HAL_H

#include <stdint.h>

#define WIFI_HAL_VERSION_1_0  0x0100

typedef enum {
    HAL_STATE_UNINITIALIZED = 0,
    HAL_STATE_READY,
    HAL_STATE_INITIALIZED
} hal_state_t;

typedef enum {
    WIFI_HAL_SUCCESS = 0,
    WIFI_HAL_ERROR_INVALID_ARGS = -1,
    WIFI_HAL_ERROR_NOT_INITIALIZED = -2
} wifi_hal_error_t;

typedef enum {
    WIFI_FEATURE_802_11N  = (1 << 0),
    WIFI_FEATURE_802_11AC = (1 << 1),
    WIFI_FEATURE_802_11AX = (1 << 2),
    WIFI_FEATURE_WPA3     = (1 << 3),
    WIFI_FEATURE_DFS      = (1 << 4)
} wifi_feature_t;

typedef struct {
    uint16_t version;
    hal_state_t state;
    uint32_t capabilities;
    pthread_mutex_t lock;
} wifi_hal_context_t;

int wifi_hal_initialize(wifi_hal_context_t **out_ctx);
int wifi_hal_get_capabilities(wifi_hal_context_t *ctx, uint32_t *caps);

#endif // WIFI_HAL_H

编译与集成

在Android源码树中创建hardware/interfaces/wifi/1.0/default目录,将上述两个文件放入其中,并添加Android.bp构建脚本:

// Android.bp
cc_library_shared {
    name: "wifi_hal",
    srcs: ["wifi_hal.c"],
    shared_libs: ["libcutils", "liblog"],
    export_include_dirs: ["."],
}

编译命令:source build/envsetup.sh && lunch <target> && m wifi_hal。生成产物为wifi_hal.so。

验证方法

编写测试程序调用初始化接口,验证HAL模块能正确加载并返回能力集:

// test_hal_init.c
#include <stdio.h>
#include "wifi_hal.h"

int main(void) {
    wifi_hal_context_t *ctx = NULL;
    uint32_t caps = 0;

    int ret = wifi_hal_initialize(&ctx);
    if (ret != WIFI_HAL_SUCCESS || ctx == NULL) {
        printf("FAIL: init error %d\n", ret);
        return 1;
    }

    ret = wifi_hal_get_capabilities(ctx, &caps);
    if (ret != WIFI_HAL_SUCCESS) {
        printf("FAIL: get caps error %d\n", ret);
        return 1;
    }

    printf("HAL version: 0x%04X\n", ctx->version);
    printf("Capabilities: 0x%08X\n", caps);
    printf("PASS: HAL initialized successfully\n");
    return 0;
}

编译测试程序:gcc -o test_hal_init test_hal_init.c -I. -L. -lwifi_hal -lpthread。运行前设置系统属性模拟芯片类型:adb shell setprop ro.boot.wifi_chip_type bcm43455(若在PC上测试则使用export替代)。执行./test_hal_init,观察输出。

判定标准

  • 程序返回0且打印PASS字样,说明初始化流程完整执行;
  • 打印的Capabilities值包含WIFI_FEATURE_802_11AC(0x2)和WIFI_FEATURE_WPA3(0x8),即输出0x0000000A,证明芯片能力探测与属性设置一致;
  • 重复调用wifi_hal_initialize不会产生错误,且返回同一上下文指针,验证幂等性。
WiFi HAL 初始化调用时序 调用方 wifi_hal.so 系统属性 wifi_hal_initialize() property_get() 返回 chip_type probe_chip_capability() 返回 ctx + SUCCESS 初始化后 HAL 状态: READY → INITIALIZED,版本 0x0100,能力位图由芯片类型决定