代码工程的GITHUB连接:
https://github.com/sj15712795029/stm32f1_marvell88w8801_marvell8801_wifi
1.Linux SDIO WIFI Marvell8801/Marvell88w8801(一) — 代码及文档介绍
2. Linux SDIO WIFI Marvell8801/Marvell88w8801(二) — Marvell88w8801驱动编译
3. Linux SDIO WIFI Marvell8801/Marvell88w8801(三) — Linux驱动以及组件的使用
4. Linux SDIO WIFI Marvell8801/Marvell88w8801(四) — Linux Wi-Fi架构
5. Linux SDIO WIFI Marvell8801/Marvell88w8801(五) — Linux SDIO API介绍
6. Linux SDIO WIFI Marvell8801/Marvell88w8801(六) — Marvell Linux Wi-Fi driver介绍-WIFI插入卡槽内发生的事情
7. Linux SDIO WIFI Marvell8801/Marvell88w8801(七) — Marvell Linux Wi-Fi driver初始化
8. Linux SDIO WIFI Marvell8801/Marvell88w8801(八) — Marvell Linux Wi-Fi driver 对接芯片上行下行接口介绍
Marvell Linux驱动以及组件编译分为几个部分做介绍:
1)接线方式,主要是介绍怎样把我们的模块接到Linux开发板中
2) Marvell88w8801的驱动是Marvell公司针对88w8801这款芯片出的驱动,另外,每个Wi-Fi芯片厂商基本上都会realease Linux wifi driver,但是并不是所有的驱动我们都能拿的到,有的需要签订NDA(保密协议)我们才能拿到,文档是一样的道理,并不是所有人都能拿的到。
3)Libnl,这个是最新的netlink驱动,我们选择编译他是因为wpa_supplicant和hostapd都要用到他
4)Openssl,同样我们选择编译他是因为wpa_supplicant会用到他
5)Wpa_supplicant主要用于STA mode下认证/加密的处理
6)Dhcp是隶属于tcp/ip的范畴,分为两个角色,dhcpc代表dhcp client,用于STA mode连接上AP主动向AP要IP,dhcpd代表dhcp server的角色,主要作用是有有STA连接到本AP,如果STA向本AP索要IP地址,那么server的作用就是给AP分配IP地址,其实dhcp有很多选择,比如我就自己基于lwip写了一个dhcpd的代码,但是我们在linux选择udchp
7)Hostapd是一个把wifi芯片设置为AP mode的程序
买一个SD卡槽转换器,如果你的linux是tf小卡槽,那么买一个小卡槽,如果是大卡槽的,那么买一个上图类似的,淘宝应该很多,在这里不做广告
接线方式很简单,只要对接VCC,GND,D0~D3,CMD,CLK引脚即可
驱动编译一共分几个步骤:
1)解压驱动
2)进入驱动的wlan_src下
3)make ARCH=arm KERNELDIR=内核路径 其中内核路径根据每人放的位置不同而不同
我的Linux Kernel版本是3.0.101,编译遇到了几类错误:
第一类错误:
…/mlinux/moal_shim.c:1606:21: error: ‘STATION_INFO_ASSOC_REQ_IES’ undeclared (first use in this function)
…/mlinux/moal_shim.c:1608:10: error: ‘struct station_info’ has no member named ‘assoc_req_ies’
…/mlinux/moal_shim.c:1611:10: error: ‘struct station_info’ has no member named ‘assoc_req_ies_len’
解决方法:
https://blog.csdn.net/weiwei_xiaoyu/article/details/71775094
第二类错误:
…/mlinux/moal_uap_cfg80211.c:1518:10: error: too few arguments to function ‘woal_cfg80211_mgmt_frame_ie’
解决方法:
ret = woal_cfg80211_mgmt_frame_ie(priv,
params->tail,
params->tail_len,
NULL, 0, NULL, 0,
NULL, 0,
MGMT_MASK_BEACON);
修改为:
ret = woal_cfg80211_mgmt_frame_ie(priv,
params->tail,
params->tail_len,
NULL, 0, NULL, 0,
NULL, 0,
MGMT_MASK_BEACON,
MOAL_IOCTL_WAIT);
4)我还是比较顺利,做完这几步就生成了两个.ko文件(mlan.ko,sd8xxx.ko)如果生成了这两个ko文件,证明已经编译完成了,下面我们就迫不及待的验证了
5)先别急,好像少点什么,就是fw,需要把fw,就是sd8801_uapsta.bin放到开发板中的/lib/firmware/mrvl/的这个目录下,如果没有这个目录,就创建一个
程序使用一共有几个步骤
1)先把Marvell88w8801插入到SD slot中,当然这步可以加载完驱动进行
2)cd 模块path
3)insmod ./mlan.ko
会出现一下log
4)insmod ./sd8xxx.ko
会出现以下log
看到successfully就像看到曙光一样,有没有这种感觉?哈哈
5)iwconfig查看是否出现uap0,mlan0,wfd0
1)tar xzf libnl-3.2.23.tar.gz
2)cd libnl-3.2.23/
3)./configure --host=arm-linux --prefix=$PWD/tmp
4)make
5)make install -->然后会在下面tmp下面发现一堆东西出来
6)把头文件放到编译链的include中 —》此处两个注意点,只需要把./tmp/include/libnl3下的netlink放过去就好,第二点就是你需要找准自己编译链的include目录,我也是找了好久啊
7)把./tmp/lib下的所有东西放到编译链的lib中
8)把./tmp/lib下的.so放到开发板中
我把这份代码放在了github中
1)tar xzf openssl-1.0.1d.tar.gz
2)cd openssl-1.0.1d/
3)./config shared no-asm --prefix=$PWD/tmp
4)修改Makefile:
CC= arm-linux-gcc
AR= arm-linux-ar $(ARFLAGS) r
RANLIB= arm-linux-ranlib
NM= arm-linux-nm
MAKEDEPPROG= arm-linux-gcc
5)make
6)make install
7)把头文件放到编译链的include中 —》此处两个注意点,只需要把./tmp/include/libnl3下的netlink放过去就好,第二点就是你需要找准自己编译链的include目录,我也是找了好久啊
8)把./tmp/lib下的所有东西放到编译链的lib中
9)把./tmp/lib下的.so放到开发板中
我把这份代码放在了github中
终于到了应用的地方了,各位看客,如果你们上面不顺利,不要灰心,大家一起讨论,别看那么简短的几句编译,copy啥的,我也花了2天时间,大写的尴尬····大牛不要笑话俺
wpa_supplicant的编译和使用
Wpa_supplicant的编译
1)cd ~/work/qiyang/wifi/wpa_supplicant/
2)tar xzf wpa_supplicant-2.0.tar.gz
3)cd wpa_supplicant-2.0/wpa_supplicant/
4)cp defconfig .config
5)修改.config加上一行: CONFIG_LIBNL32=y
6)修改makefile CC=arm-linux-gcc
7)make
8)make DESTDIR=$PWD/tmp install
wpa_supplicant的使用
此部分做一个简短的使用,后面一片文章会做详细应用介绍
1)mkdir -p /var/run/wpa_supplicant
2)准备一个配置文件,记住路径和名字,我们暂且把他放到/etc下,并且命名为plaintext.conf
内容如下:
ctrl_interface=/var/run/wpa_supplicant
network={
ssid=“IoT_lwos_wifi”
key_mgmt=NONE
}
3)wpa_supplicant -B -c/etc/plaintext.conf -imlan0
4)查看状态wpa_cli -imlan0 status
5)分配IP ifconfig mlan0 192.168.43.120
6)ping 192.168.43.1
PING 192.168.43.1 (192.168.43.1): 56 data bytes
64 bytes from 192.168.43.1: seq=0 ttl=64 time=32.828 ms
64 bytes from 192.168.43.1: seq=1 ttl=64 time=29.404 ms
至于详细使用后续会在说明
我把这份代码放在了github中
上面我们虽然有了wpa_supplicant,但是却不能自动获取IP地址,只能我们通过ifconfig来配置IP地址,所以为了克服弊端,我们采用udhcp client来自动获取IP地址
Udhcp的编译
1)tar -xvf udhcp-0.9.8.tar.gz
2)dhcpc.c:134:7: error: label at end of compound statement加一条break;
3)make CROSS_COMPILE=arm-linux-
4)就有了udhcpd ,udhcpc,其实这两个在busybox就有了,看读者板子中是否存在啦
udhcpc的使用:
在wpa_supplicant连接成功后执行以下命令
udhcpc -i mlan0
Log:
udhcp client (v0.9.8) started
Sending discover…
Sending select for 192.168.43.143…
Lease of 192.168.43.143 obtained, lease time 3600
Deleting routers
adding dns 192.168.43.1
我把这份代码放在了github中
Hostapd主要是创建一个热点,并且配置dhcpd来给STA分配IP地址,其中dhcpd我们已经在udhcp编译出来两个可执行档:udhcpd
虽然我实验失败,但是还是要说下编译,以及我出现的错误,以便各位大牛出出招,让我能够成功
Hostapd的编译:
1)tar xzf hostapd-2.0.tar.gz
2)cd hostapd-2.0/hostapd/
3)cp defconfig .config
4)修改.config, 加一行: CONFIG_LIBNL32=y
5)修改Makefile:
CC=arm-linux-gcc
6)make
7)make DESTDIR=$PWD/tmp install
8)把 tmp/uer/bin目录下的hostapd hostapd_cli弄到开发板中
使用:
我出现的错误是:
在网上查了很多办法都不奏效,各位给点意见
我把这份代码放在了github中