代码工程的GITHUB连接:点进进入GITHUB仓库
https://github.com/sj15712795029/stm32f1_marvell88w8801_marvell8801_wifi
Marvell自己实现驱动系列文章分为几篇介绍:
SDIO wifi Marvell8801/Marvell88w8801 介绍(一) ---- 芯片介绍
SDIO wifi Marvell8801/Marvell88w8801 介绍(二) ---- SDIO协议介绍
SDIO wifi Marvell8801/Marvell88w8801 介绍(三) ---- 寄存器介绍
SDIO wifi Marvell8801/Marvell88w8801 介绍(四) ---- 命令/事件/数据格式
SDIO wifi Marvell8801/Marvell88w8801 介绍(五) ---- TLV
SDIO wifi Marvell8801/Marvell88w8801 介绍(六) ---- 实现初始化功能
SDIO wifi Marvell8801/Marvell88w8801 介绍(七) ---- 实现搜索功能
SDIO wifi Marvell8801/Marvell88w8801 介绍(八) ---- 实现STA功能
SDIO wifi Marvell8801/Marvell88w8801 介绍(九) ---- 实现AP功能
SDIO wifi Marvell8801/Marvell88w8801 介绍(十) ---- 移植TCP/IP协议栈LWIP
SDIO wifi Marvell8801/Marvell88w8801 介绍(十一) ---- 自己编写LWIP没有的DHCP server
SDIO wifi Marvell8801/Marvell88w8801 介绍(十二) ---- MQTT介绍
SDIO wifi Marvell8801/Marvell88w8801 介绍(十三) ---- 百度云操作说明
SDIO wifi Marvell8801/Marvell88w8801 介绍(十四) ---- 上位机STA操作/代码
SDIO wifi Marvell8801/Marvell88w8801 介绍(十五) ---- 上位机AP操作/代码
SDIO wifi Marvell8801/Marvell88w8801 介绍(十六) ---- 上位机UDP操作/代码
SDIO wifi Marvell8801/Marvell88w8801 介绍(十七) ---- 上位机TCP操作/代码
SDIO wifi Marvell8801/Marvell88w8801 介绍(十八) ---- 上位机PING操作/代码
SDIO wifi Marvell8801/Marvell88w8801 介绍(十九) ---- 上位机云服务器(百度云)操作/代码
每篇更新打开专栏可以看到:打开Marvell8801/Marvell8801 专栏
关于裸机AP模式操作介绍主要分为以下图示几部分
1)开启热点命令格式介绍,主要对开启热点的格式进行介绍,包括TLV
2)开启默认热点介绍
3)开启特定SSID的热点介绍
4)开启WPA/WAP2热点介绍
5)停止热点介绍
6)AP主动踢掉某一个STA的介绍
另外,在写这个驱动之前我是假设平台的SDIO驱动已经调试OK,如果需要查看SDIO驱动方面,可以直接参照我的裸机代码,另外写这个驱动的目的是让你快速入门Marvell88w8801这颗wifi 芯片,其中没有复杂的802.11n的处理,如果你不想看Linux复杂的驱动,可以通过这个裸机快速入门。
1. 开启热点命令格式介绍
首先说明下创建dafault open wpa wpa2热点都是通过一个函数mrvl88w8801_cre_ap来实现
另外,我们先来看下创建热点的cmd/cmd response的格式
Start很简单,关键在于配置cmd/cmd response
最关键的部分在于ConfigDate,那些部分是TLV,我们先列出TLV list,在后面针对创建不同的节点再做介绍
停止热点的cmd/cmd response如图:
2. Marvell88w8801直接开启默认热点
开启热点很简单,只需要发送cmd HOST_CMD_APCMD_BSS_START就能得到一个默认的热点,如果之前没有配置过的话,那么就会得到一个叫做Marvell Micro AP的没有加密的热点,如图:
另外函数实现如下:
/******************************************************************************
* 函数名: mrvl88w8801_cre_ap_prepare
* 参数: tx(IN) -->tx buffer
* 返回值: 返回执行结果
* 描述: 组HOST_CMD_APCMD_BSS_START command的封包,主要用于开启热点
******************************************************************************/
static uint8_t mrvl88w8801_cre_ap_prepare(uint8_t* tx)
{
HostCmd_DS_COMMAND *cmd = (HostCmd_DS_COMMAND *)tx;
uint16_t tx_packet_len = CMD_HDR_SIZE;
cmd->pack_len = tx_packet_len;
cmd->pack_type = TYPE_CMD_CMDRSP;
cmd->command = HOST_CMD_APCMD_BSS_START;
cmd->size = tx_packet_len - CMD_SDIO_HDR_SIZE;
cmd->seq_num = 0;
cmd->bss = BSS_TYPE_UAP << 4;
cmd->result = 0;
return COMP_ERR_OK;
}
3. Marvell88w8801 开启open热点
如果要创建一个open热点,那么我们就需要在发送HOST_CMD_APCMD_BSS_START命令之前先发送HOST_CMD_APCMD_SYS_CONFIGURE来配置热点,所有的配置TLV在开始的时候都有贴出,open热点主要用到两个。
1)SSID TLV,主要用于配置AP热点的名称
2)TLV_TYPE_UAP_BCAST_SSID_CTL TLV,主要用于该AP热点是否隐藏
SSID不做过多介绍,就是2byte type,2byte len,0~32 byte的名称
TLV_TYPE_UAP_BCAST_SSID_CTL TLV介绍如下
Enable是能被搜索到,disable不能被搜索到
整个过程是先发送HOST_CMD_APCMD_SYS_CONFIGURE然后收到cmd response后发送HOST_CMD_APCMD_BSS_START,这样热点就生产了,是一个open热点
4. Marvell88w8801 开启WPA/WPA2热点
Wpa热点除了以上open两个TLV外,还包含以下TLV
1)TLV_TYPE_UAP_WPA_PASSPHRASE
2)TLV_TYPE_UAP_ENCRYPT_PROTOCOL
3)TLV_TYPE_UAP_AKMP
4)TLV_TYPE_PWK_CIPHER
5)TLV_TYPE_GWK_CIPHER
其中TLV_TYPE_UAP_WPA_PASSPHRASE主要作用就是配置AP热点的密码
TLV_TYPE_UAP_ENCRYPT_PROTOCOL主要用于配置加密协议
WPA主要用于bit 3,WPA2主要用于bit5,看下代码的处理
TLV_TYPE_UAP_AKMP主要是用于认证的密码类型
此处我们选择keymgmt中的bit 1 psk
TLV_TYPE_PWK_CIPHER主要用于配对密码类型,此处不管是WPA还是WPA2我们都选择CCMP
代码如下
TLV_TYPE_GWK_CIPHER主要用于分组密码类型,我们也选择使用CCMP
代码如下
整个wap/wap2的方式和open方式流程一样,同样是:先发送
HOST_CMD_APCMD_SYS_CONFIGURE然后收到cmd response后发送
HOST_CMD_APCMD_BSS_START,只不过多了几个TLV
5. Marvell88w8801 停止热点
停止热点的命令也很简单,在开始部分我们已经贴出命令格式,代码如下
/******************************************************************************
* 函数名: mrvl88w8801_stop_ap_prepare
* 参数: tx(IN) -->tx buffer
* 返回值: 返回执行结果
* 描述: 组HOST_CMD_APCMD_BSS_STOP command的封包,主要用于停止热点
******************************************************************************/
static uint8_t mrvl88w8801_stop_ap_prepare(uint8_t* tx)
{
HostCmd_DS_COMMAND *cmd = (HostCmd_DS_COMMAND *)tx;
uint16_t tx_packet_len = CMD_HDR_SIZE;
cmd->pack_len = tx_packet_len;
cmd->pack_type = TYPE_CMD_CMDRSP;
cmd->command = HOST_CMD_APCMD_BSS_STOP;
cmd->size = tx_packet_len - CMD_SDIO_HDR_SIZE;
cmd->seq_num = 0;
cmd->bss = BSS_TYPE_UAP << 4;
cmd->result = 0;
return COMP_ERR_OK;
}
6. Marvell88w8801 AP主动踢掉STA
AP主动踢掉STA主要用以下命令HOST_CMD_APCMD_STA_DEAUTH
Cmd/cmd response格式如图
代码实现如图
/******************************************************************************
* 函数名: mrvl88w8801_disconnect_sta_prepare
* 参数: tx(IN) -->tx buffer
data_buff(IN) -->搜索的cmd body,在这里就是channel list
data_len(IN) -->搜索的cmd body len,在这里就是channel list长度
* 返回值: 返回执行结果
* 描述: 组HOST_CMD_APCMD_STA_DEAUTH command的封包,主要用于AP踢掉STA
******************************************************************************/
static uint8_t mrvl88w8801_disconnect_sta_prepare(uint8_t* tx,void *data_buff,uint16_t data_len)
{
HostCmd_DS_COMMAND *cmd = (HostCmd_DS_COMMAND *)tx;
HostCmd_DS_802_11_DEAUTHENTICATE *pdeauth = &cmd->params.deauth;
uint16_t tx_packet_len = CMD_HDR_SIZE + sizeof(HostCmd_DS_802_11_DEAUTHENTICATE);
cmd->pack_len = tx_packet_len;
cmd->pack_type = TYPE_CMD_CMDRSP;
cmd->command = HOST_CMD_APCMD_STA_DEAUTH;
cmd->size = tx_packet_len - CMD_SDIO_HDR_SIZE;
cmd->seq_num = 0;
cmd->bss = BSS_TYPE_UAP << 4;
cmd->result = 0;
comp_memcpy(pdeauth->mac_addr,data_buff,data_len);
pdeauth->reason_code = 2;
return COMP_ERR_OK;
}