ZYNQ-Linux学习笔记(8)- Petalinux .2 编译移植Marvell8801wifi内核模块

时间:2024-04-05 18:28:33

前言

petalinux2018.2用的内核版本是4.14.0
ZYNQ-Linux学习笔记(8)- Petalinux 2018.2 编译移植Marvell8801wifi内核模块
marvell8801给的驱动所依赖的内核版本是3.10.11
ZYNQ-Linux学习笔记(8)- Petalinux 2018.2 编译移植Marvell8801wifi内核模块
由于内核的API在这两个版本上是有区别的,所以需要修改,其次还需要修改makefile。

目录结构

sd8801的驱动目录如下
D:\DOWNLOADS\SD-UAPSTA-8801-FC18-MMC-14.85.36.P101-C3X14160_B0-GPL-RELEASE
│ SD-UAPSTA-8801-FC18-MMC-14.85.36.p101-C3X14160_B0-GPL-Release Notes.pdf

└─SD-UAPSTA-8801-FC18-MMC-14.85.36.p101-C3X14160_B0-GPL
├─FwImage
│ sd8801_uapsta.bin

├─SD-8801-FC18-MMC-14.85.36.p101-C3X14160_B0-app-src
│ └─SD-8801-FC18-MMC-14.85.36.p101-C3X14160_B0-GPL
│ └─wlan_src
│ └─mapp
│ ├─mlan2040coex
│ ├─mlanconfig
│ │ └─config
│ ├─mlanevent
│ │ Makefile
│ │
│ ├─mlanutl
│ │ Makefile
│ │ mlanutl.c
│ │ mlanutl.h
│ │
│ └─uaputl
│ │ Makefile
│ │ uapcmd.c
│ │ uapcmd.h
│ │ uaputl.c
│ │ uaputl.h
│ │
│ └─config
├─SD-8801-FC18-MMC-14.85.36.p101-C3X14160_B0-GPL-src
│ └─SD-8801-FC18-MMC-14.85.36.p101-C3X14160_B0-GPL
│ └─wlan_src
│ │ gpl-2.0.txt
│ │ Makefile
│ │ README
│ │ README_MLAN
│ │ README_UAP
│ │
│ ├─mlinux
│ │ mlan.h
│ │ mlan_decl.h
│ │ mlan_ieee.h
│ │ mlan_ioctl.h
│ │ moal_cfg80211.c
│ │ moal_cfg80211.h
│ │ moal_cfgvendor.c
│ │ moal_cfgvendor.h
│ │ moal_debug.c
│ │ moal_eth_ioctl.c
│ │ moal_eth_ioctl.h
│ │ moal_ioctl.c
│ │ moal_main.c
│ │ moal_main.h
│ │ moal_priv.c
│ │ moal_priv.h
│ │ moal_proc.c
│ │ moal_sdio.h
│ │ moal_sdio_mmc.c
│ │ moal_shim.c
│ │ moal_shim.h
│ │ moal_uap.c
│ │ moal_uap.h
│ │ moal_uap_priv.c
│ │ moal_uap_priv.h
│ │ moal_uap_wext.c
│ │ moal_wext.c
│ │ moal_wext.h
│ │
│ └─script
│ └─sdio_mmc
│ load
│ unload

└─SD-8801-FC18-MMC-14.85.36.p101-C3X14160_B0-mlan-src
└─SD-8801-FC18-MMC-14.85.36.p101-C3X14160_B0-GPL
└─wlan_src
└─mlan
mlan.h
mlan_11d.c
mlan_11n.c
mlan_11n.h
mlan_11n_aggr.c
mlan_11n_aggr.h
mlan_cfp.c
mlan_cmdevt.c
mlan_decl.h
mlan_fw.h
mlan_ieee.h
mlan_init.c
mlan_init.h
mlan_ioctl.h
mlan_join.c
mlan_join.h
mlan_main.h
mlan_misc.c
mlan_module.c
mlan_scan.c
mlan_sdio.c
mlan_sdio.h
mlan_shim.c
mlan_sta_cmd.c
mlan_sta_event.c
mlan_sta_ioctl.c
mlan_sta_rx.c
mlan_sta_tx.c
mlan_txrx.c
mlan_uap.h
mlan_uap_ioctl.c
mlan_uap_txrx.c
mlan_util.h
mlan_wmm.c
mlan_wmm.h
其中mlan文件夹是mlan驱动,mlinux文件夹是sd8801驱动,mapp是marvell提供的一些小工具。需要使用的文件是mlan文件夹以及mlinux文件夹,以及makefile文件。

新建petalinux模块工程

使用命令petalinux-create -t modules -n sd8801 --enable创建模块工程
ZYNQ-Linux学习笔记(8)- Petalinux 2018.2 编译移植Marvell8801wifi内核模块

将mlan文件夹以及mlinux文件夹跟makefile文件拷贝到sd8801模块工程下
ZYNQ-Linux学习笔记(8)- Petalinux 2018.2 编译移植Marvell8801wifi内核模块
修改sd8801.bb文件,如图所示,添加所有的文件到bb文件里面。
ZYNQ-Linux学习笔记(8)- Petalinux 2018.2 编译移植Marvell8801wifi内核模块
ZYNQ-Linux学习笔记(8)- Petalinux 2018.2 编译移植Marvell8801wifi内核模块

修改Makefile文件

注释21-25行
ZYNQ-Linux学习笔记(8)- Petalinux 2018.2 编译移植Marvell8801wifi内核模块
注释92,99,100,103,104行
ZYNQ-Linux学习笔记(8)- Petalinux 2018.2 编译移植Marvell8801wifi内核模块
把KERNELDIR替换成KERNEL_SRC
360行把modules去除
ZYNQ-Linux学习笔记(8)- Petalinux 2018.2 编译移植Marvell8801wifi内核模块
把364行之后的全部删除,然后添加如下代码:
SRC := $(shell pwd)
modules_install:
$(MAKE) -C (KERNELSRC)M=(KERNEL_SRC) M=(SRC) modules_install

clean:
-find . -name “.o" -exec rm {} ;
-find . -name "
.ko” -exec rm {} ;
-find . -name “..cmd" -exec rm {} ;
-find . -name "
.mod.c” -exec rm {} ;
-find . -name “Module.symvers” -exec rm {} ;
-find . -name “Module.markers” -exec rm {} ;
-find . -name “modules.order” -exec rm {} ;
-rm -rf .tmp_versions
ZYNQ-Linux学习笔记(8)- Petalinux 2018.2 编译移植Marvell8801wifi内核模块
保存,这样makefile就修改好了。

编译模块

用petalinux-build -c sd8801直接编译模块,会发现有非常多的错误这是因为两个版本的内核版本不一致API有变化造成的,我们需要修改一下。我已经修改好并且生成了一个补丁文件。这里需要修改很多文件,就不一一列举了,可以针对报错提示来修改。
进入到sd8801/files/目录下,使用命令打补丁。
patch -p2 < sd8801-3.10.11-4.10.0.patch
打完补丁之后再次使用petalinux-build -c sd8801命令再次编译。
ZYNQ-Linux学习笔记(8)- Petalinux 2018.2 编译移植Marvell8801wifi内核模块
编译成功之后在工程目录下的/build/tmp/sysroots-components/plnx_zynq7/sd8801/lib/modules/4.14.0-xilinx-v2018.2/extra下会有
ZYNQ-Linux学习笔记(8)- Petalinux 2018.2 编译移植Marvell8801wifi内核模块
mlan.ko跟sdxxx.ko两个文件。

编译UAP工具

UAP工具是用来让8801建立热点的工具,这个工具我们通过SDK编译生成。
打开SDK,新建project,如下图配置:
ZYNQ-Linux学习笔记(8)- Petalinux 2018.2 编译移植Marvell8801wifi内核模块
右键工程选择C/C++ Build Settings,如下图配置sysroot
ZYNQ-Linux学习笔记(8)- Petalinux 2018.2 编译移植Marvell8801wifi内核模块

把驱动里面的mapp文件夹下的源代码文件拷贝到工程的src目录下,然后编译生成uaputl.elf文件
ZYNQ-Linux学习笔记(8)- Petalinux 2018.2 编译移植Marvell8801wifi内核模块

运行&设置

主要是实现热点的功能,在驱动文件夹的uaputl的文件夹下面有个config文件夹,把里面的
ZYNQ-Linux学习笔记(8)- Petalinux 2018.2 编译移植Marvell8801wifi内核模块

如图两个文件放到文件系统中,把固件文件sd8801_uapsta.bin放到文件系统中,然后生成image.ub拷到板子中。
连接板卡,我们通过串口设置一下热点。先看下需要的文件有哪些
mlan.ko
sd8xxx.ko
sd8801_uapsta.bin
config/80211d_domain.conf
config/uaputl.conf
uaputl.elf
首先挂载mlan.ko,insmod mlan.ko
ZYNQ-Linux学习笔记(8)- Petalinux 2018.2 编译移植Marvell8801wifi内核模块
然后挂在sd8xxx.ko同时加载固件,insmod sd8xxx.ko drv_mode=2 fw_name=mrvl/sd8801_uapsta.bin
drv_mode=2表示启用uap功能
ZYNQ-Linux学习笔记(8)- Petalinux 2018.2 编译移植Marvell8801wifi内核模块
然后可以通过ifconfig -a查看是否正确的生成uap0网卡信息
ZYNQ-Linux学习笔记(8)- Petalinux 2018.2 编译移植Marvell8801wifi内核模块
通过ifconfig uap0 192.168.11.1 up设置一个IP地址
运行uaputl命令加载默认的配置
./uaputl.elf bss_config config/uaputl.conf
ZYNQ-Linux学习笔记(8)- Petalinux 2018.2 编译移植Marvell8801wifi内核模块
最后运行uaputl.elf bss start启动热点
ZYNQ-Linux学习笔记(8)- Petalinux 2018.2 编译移植Marvell8801wifi内核模块
打开笔记本的WiFi可以看到有个Marvell Micro AP的热点是无密码的
ZYNQ-Linux学习笔记(8)- Petalinux 2018.2 编译移植Marvell8801wifi内核模块
将笔记本的无线网卡IP地址改成跟板卡上设置的同一个网段
ZYNQ-Linux学习笔记(8)- Petalinux 2018.2 编译移植Marvell8801wifi内核模块
打开putty,通过SSH尝试登录
ZYNQ-Linux学习笔记(8)- Petalinux 2018.2 编译移植Marvell8801wifi内核模块
有连接提示,登陆成功
ZYNQ-Linux学习笔记(8)- Petalinux 2018.2 编译移植Marvell8801wifi内核模块
ZYNQ-Linux学习笔记(8)- Petalinux 2018.2 编译移植Marvell8801wifi内核模块