Linux---wifi驱动移植及调试(SSV6x5x)_linux wifi驱动-程序员宅基地

技术标签: Linux驱动  运维  linux  驱动开发  

一、背景说明及驱动移植

本文主要简述南方硅谷ssv6x5x wifi驱动的移植及调试,官方实际是有一份南方硅谷ssv6x5x 驱动移植用户指南,需要的话可以下载,官方指南对于移植过程描述的很清楚。
移植准备:

1、下载官方最新的驱动源码
一般芯片驱动源码都要需要厂家提供的,因为厂家推广自己芯片肯定要做适配,要适配肯定逃不过Linux的适配,而且厂家会定期更新驱动及固件,如果你要不到就给你们的采购打电话,如果你们没采购。。。好吧,我给你一个链接wifi-ssv6158驱动源码
2、解压官方驱动源码
可以看到源码中有对应ubuntu、Linux、Android的适配说明,拷贝对应文件为Makefile并修改:cp Makefile.cross_linux Makefile
修改后的Makefile如下:

KMODULE_NAME = ssv6x5x

ifeq ($(KERNEL_OBJ_PATH),)
KERNEL_OBJ_PATH := /lib/modules/`uname -r`/build
endif

ifeq ($(SSV_DRV_PATH),)
#SSV_DRV_PATH := $(PWD)
SSV_DRV_PATH := drivers/net/wireless/ssv6x5x
endif

KBUILD_TOP := $(SSV_DRV_PATH)
ifeq ($(MAKELEVEL),0)
KBUILD_TOP := .
endif

ifeq ($(ARCH),)
ARCH := x86
endif

ifeq ($(INSTALL_PATH),)
INSTALL_PATH := kernel/drivers/net/wireless/ssv6200
endif

include $(KBUILD_TOP)/config_common.mak
include $(KBUILD_TOP)/config.mak

MOD_DEF_H = include/ssv_mod_conf.h

# Generate version strings
# GEN_VER := $(shell cd $(KBUILD_TOP); ./ver_info.pl include/ssv_version.h)
# Generate include/ssv_conf_parser.h
# GEN_CONF_PARSER := $(shell cd $(KBUILD_TOP); env ccflags="$(ccflags-y)" ./parser-conf.sh include/ssv_conf_parser.h)
# Generate $(KMODULE_NAME)-wifi.cfg
#BKP_CFG := $(shell cp $(KBUILD_TOP)/$(PLATFORMS)-wifi.cfg $(KBUILD_TOP)/image/$(KMODULE_NAME)-wifi.cfg)

EXTRA_CFLAGS := -I$(KBUILD_TOP) -I$(KBUILD_TOP)/include

DEF_PARSER_H = $(KBUILD_TOP)/include/ssv_conf_parser.h
$(shell env ccflags="$(ccflags-y)" $(KBUILD_TOP)/parser-conf.sh $(DEF_PARSER_H))

#------------------------------
# ssvdevice/
KERN_SRCS := ssvdevice/ssvdevice.c
KERN_SRCS += ssvdevice/ssv_cmd.c

# hci/
KERN_SRCS += hci/ssv_hci.c

# smac/
KERN_SRCS += smac/init.c
KERN_SRCS += smac/dev.c
KERN_SRCS += smac/bdev.c
KERN_SRCS += smac/regd.c
KERN_SRCS += smac/wow.c
KERN_SRCS += smac/hw_scan.c

KERN_SRCS += smac/lib.c
KERN_SRCS += smac/ap.c

ifeq ($(findstring -DCONFIG_SSV6XXX_DEBUGFS, $(ccflags-y)), -DCONFIG_SSV6XXX_DEBUGFS)
KERN_SRCS += smac/ssv6xxx_debugfs.c
endif
KERN_SRCS += smac/efuse.c
KERN_SRCS += smac/p2p.c
KERN_SRCS += smac/ssv_skb.c
ifeq ($(findstring -DCONFIG_SMARTLINK, $(ccflags-y)), -DCONFIG_SMARTLINK)
KERN_SRCS += smac/ksmartlink.c
ifeq ($(findstring -DCONFIG_SSV_SMARTLINK, $(ccflags-y)), -DCONFIG_SSV_SMARTLINK)
KERN_SRCS += smac/kssvsmart.c
endif
endif

KERN_SRCS += smac/hal/hal.c
ifeq ($(findstring -DSSV_SUPPORT_SSV6006, $(ccflags-y)), -DSSV_SUPPORT_SSV6006)
KERN_SRCS += smac/hal/ssv6006c/ssv6006_common.c
KERN_SRCS += smac/hal/ssv6006c/ssv6006C_mac.c
KERN_SRCS += smac/hal/ssv6006c/ssv6006_phy.c
KERN_SRCS += smac/hal/ssv6006c/ssv6006_turismoC.c
ifeq ($(findstring -DSSV_SUPPORT_SSV6006AB, $(ccflags-y)), -DSSV_SUPPORT_SSV6006AB)
KERN_SRCS += smac/hal/ssv6006/ssv6006_mac.c
KERN_SRCS += smac/hal/ssv6006/ssv6006_cabrioA.c
KERN_SRCS += smac/hal/ssv6006/ssv6006_geminiA.c
KERN_SRCS += smac/hal/ssv6006/ssv6006_turismoA.c
KERN_SRCS += smac/hal/ssv6006/ssv6006_turismoB.c
endif
endif
ifeq ($(findstring -DSSV_SUPPORT_SSV6020, $(ccflags-y)), -DSSV_SUPPORT_SSV6020)
KERN_SRCS += smac/hal/ssv6020/ssv6020_common.c
KERN_SRCS += smac/hal/ssv6020/ssv6020_mac.c
KERN_SRCS += smac/hal/ssv6020/ssv6020_phy.c
KERN_SRCS += smac/hal/ssv6020/ssv6020_turismoE.c
endif

# hwif/hal/
KERN_SRCS += hwif/hal/hwif_hal.c
ifeq ($(findstring -DSSV_SUPPORT_SSV6006, $(ccflags-y)), -DSSV_SUPPORT_SSV6006)
KERN_SRCS += hwif/hal/ssv6006c/ssv6006C_hwif.c
endif
ifeq ($(findstring -DSSV_SUPPORT_SSV6020, $(ccflags-y)), -DSSV_SUPPORT_SSV6020)
KERN_SRCS += hwif/hal/ssv6020/ssv6020_hwif.c
endif

# hwif/sdio/
KERN_SRCS += hwif/sdio/sdio.c


#------------------------------

KERN_SRCS += $(KMODULE_NAME)-generic-wlan.c

$(KMODULE_NAME)-y += $(KERN_SRCS_S:.S=.o)
$(KMODULE_NAME)-y += $(KERN_SRCS:.c=.o)

obj-m += $(KMODULE_NAME).o

#export CONFIG_SSV6X5X=m

.PHONY: all ver modules clean

all: $(MOD_DEF_H) modules
	
modules:
	$(MAKE) -C $(KERNEL_OBJ_PATH) M=$(SSV_DRV_PATH) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) modules

strip:
	$(CROSS_COMPILE)strip $(KMODULE_NAME).ko --strip-unneeded

install:
	$(MAKE) INSTALL_MOD_DIR=$(INSTALL_PATH) -C $(KERNEL_OBJ_PATH) \
            M=$(SSV_DRV_PATH) modules_install
	depmod -a

clean:
	$(MAKE) -C $(KERNEL_OBJ_PATH) M=$(SSV_DRV_PATH) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) clean
	@rm -rf $(MOD_DEF_H)

$(MOD_DEF_H): config.mak config_common.mak
	#@echo "#ifndef __SSV_MOD_CONF_H__" > $@
	#@echo "#define __SSV_MOD_CONF_H__" >> $@
	#for flag in $(ccflags-y_no_dash); do \
	#   if [ "$$flag" =~ ^D.* ]; then \
	#       echo "#define $$flag" | sed -e s/D//g >> $@; \
	#   fi; \
	#done
	#echo "#endif // __SSV_MOD_CONF_H__" >> $@
	env ccflags="$(ccflags-y)" ./genconf.sh $@

3、Linux工程下增加驱动
增加kernel里ssv6x5x驱动,将ssv6x5x驱动存放在drivers/net/wireless/路径下
修改Makefile文件及Kconfig
4、配置内核
ssv6x5x WiFi驱动配置
在这里插入图片描述

内核需支持MAC80211 & cfg80211

在这里插入图片描述
5、编译驱动
下面是个交叉编译的shell脚本,CROSS_COMPILE需修改为平台的toolchain

#!/bin/bash
SSV_DRV_PATH=/home/jinsong/39EV200/ssvdriver/SMAC.0000.1807.09/ssv6x5x
KERNEL_OBJ_PATH=/home/jinsong/39EV200/build

export PATH=$PATH:/opt/arm-anykav200-crosstool/usr/bin

make -C $KERNEL_OBJ_PATH M=$SSV_DRV_PATH ARCH=arm CROSS_COMPILE=arm-anykav200-linux-uclibcgnueabi- modules;make -C $SSV_DRV_PATH CROSS_COMPILE=arm-anykav200-linux-uclibcgnueabi- strip;sync
cp $SSV_DRV_PATH/ssv6x5x.ko   ../platform/rootfs/wifi/ssv6x5x/usr/modules/ssv6x5x.ko
cp $SSV_DRV_PATH/image/ssv6x5x-sw.bin   ../platform/rootfs/wifi/ssv6x5x/usr/modules/ssv6x5x-sw.bin

cp $SSV_DRV_PATH/ssv6x5x.ko ../platform/rootfs/rootfs/usr/modules/ssv6x5x.ko

cp $SSV_DRV_PATH/image/ssv6x5x-sw.bin ../platform/rootfs/rootfs/usr/modules/ssv6x5x-sw.bin

二、驱动调试

1、硬件与配置检查
首先确认模块或COB上的晶振是多少。目前SSV6155支持25M/ 40M晶振

请修改板上配置文件xxxx-wifi.cfg(默认是ssv6x5x-wifi.cfg, ubuntu系统默认用sta.cfg)中晶振设置

请检查模块上是LDO还是DCDC mode。并确认xxxx-wifi.cfg配置中是否一致

2、确定软件是否识别到wifi IC
对于usb wifi,执行如下确认 (for 6155/6255)
lsusb
Bus 001 Device 002: ID 8065:6000

对于sdio wifi,执行如下确认(for 6152/6256)
cat /sys/bus/mmc/devices/mmc1:0001/mmc1:0001:1/vendor
0x3030
如果以上信息无法获取,请确认wifi硬件的电源和LDO_EN管脚是否正常。

硬件检查ok还是认不到sdio,有些平台的mmc或sdio驱动,需要手动调用api重新认sdio。例如某平台需在ko加载入口里添加wifi_card_detect后,就可以认到sdio。

3、检测ssv6xxx.ko是否安装成功
 复制相关文件到板子的文件系统中
 ssv6x5x/image/ssv6x5x-wifi.cfg
[/etc/firmware/]
 ssv6x5x/image/ssv6x5x-sw.bin
[/etc/firmware/]

加载驱动ssv6x5x.ko
执行如下指令:(stacfgpath=路径请根据实际路径填写)
insmod ssv6x5x.ko stacfgpath=/etc/firmware/ssv6x5x-wifi.cfg
执行 dmesg 確認 或 打开kernel log。echo 7 > /proc/sys/kernel/printk
可以看到如需信息,表示驱动运行成功。
在这里插入图片描述

成功则执行: ifconfig wlan0 up
在这里插入图片描述

三、wifi配置与说明

1、Station模式
启动wpa_supplicant
根据配置文件启动wpa_supplicant进程发起连线wpa_supplicant -iwlan0 -Dnl80211 -c/mnt/wpa_supplicant.conf &
建议wpa_supplicant启动采用nl80211,不建议使用wext

扫描AP
Wlan0启动
ifconfig wlan0 up #wlan0 up

如用iwlist工具
iwlist wlan0 scan #wlan0 扫描

如用wpa_cli工具
wpa_cli ifname=wlan0 scan #wlan0 扫描

无密码连接
如用iwconfig工具
iwconfig wlan0 essid ChinaNet #连接无密码的ESSID,为了测试专门设置一个无密码的。
iwconfig #查看是否连接上

如用wpa_cli工具
wpa_cli add_network #增加连线
wpa_cli set_network 0 ssid #配置ssid
wpa_cli set_network 0 key_mgmt NONE #配置无密码加密
wpa_cli enable_network 0 #启动连线
wpa_cli status #查看当前连线状态

加密连接
killall wpa_supplicant #杀死上次运行的wpa_supplicant进程
wpa_passphrase ${SSID} ${PASSWD} >> /mnt/wap_supplicant.conf #生成加密ssid的配置文件
wpa_supplicant -iwlan0 -Dnl80211 -c/mnt/wpa_supplicant.conf & #根据配置文件启动wpa_supplicant进程发起连线

获取ip地址
udhcpc -i wlan0 & #获取IP地址
busybox ifconfig #查看ip地址
ping 网关ip #ping 网关ip,测试网络

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lihuan680680/article/details/123514853

智能推荐

安装svn(Setup-Subversion-1.7.7)认证失败的解决办法,附加注册服务_svn安装no certification authorities found-程序员宅基地

文章浏览阅读4.9k次。服务器安装Setup-Subversion-1.7.7 安装路径:D:\Subversion在D:\根目录新建SVN目录做为svn的版本库目录。接着,在D:\SVN\目录下新建一个项目bobo目录。然后,在该目录上右键,选择:TortoiseSVN -> 在此创建版本库,点击“确定”(注意:不要创建目录结构-理由:由于本人对SVN不了解,经过测试,如果创建了目录结构,那么同步到客户端的项目_svn安装no certification authorities found

基于TypeScript的Node.js框架Nest.js,可查看中文文档深入学习-程序员宅基地

文章浏览阅读3.5k次。Nest是一套基于Node.js的强大的Web框架,可帮助你轻松构建出高效的、可扩展的应用程序。它是通过结合OOP(面向对象编程)和FP(函数式编程)的最佳理念,采用现代化JavaScript,使用TypeScript构建的。Nest不仅仅只是一套框架,因为它是基于绝妙的,著名的流行库Express和Socket.io构建的(你也可以根据自己的需求选择任何其他库),所以无需等待大型社区,可以直接使..._node得nest框架中文文档

unity序列帧的实现。包括三种效果,后续再补充_unity 序列帧换装-程序员宅基地

文章浏览阅读1.5k次。效果1:从头播放到尾效果2:重复播放效果3:正放、倒放交替播放using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.UI;public class XuLieZhen : MonoBehaviour{ [Header("序列帧路径")] public string Path; [Header("更换间隔")] public fl_unity 序列帧换装

Android Studio一个连接SQLite数据库的登录注册实现_android sqllite tomcat-程序员宅基地

文章浏览阅读4.7w次,点赞129次,收藏751次。声明:AS版本为:3.4;JDK版本为:1.81、先看一下项目目录:2、新建一个AS项目,创建如上图所示的目录结构,然后添加内容:(1)修改添加布局文件:activity_main.xml:<?xml version="1.0" encoding="utf-8"?><android.support.constraint.ConstraintLayout xm..._android sqllite tomcat

mysql的扩容_MySQL的InnoDB的扩容-程序员宅基地

文章浏览阅读189次。innodb_data_home_dir这是InnoDB表的目录共用设置。如果没有在 my.cnf 进行设置,InnoDB 将使用MySQL的 datadir 目录为缺省目录。如果设定一个空字串,可以在 innodb_data_file_path 中设定绝对路径。innodb_data_file_path单独指定数据文件的路径与大小。数据文件的完整路径由 innodb_data_home_dir ..._mysql 系统表空间扩容 nnodb_force_frecovery

Xwiki使用说明书_xwiki使用教程-程序员宅基地

文章浏览阅读7.1k次。XWIKI使用说明书 2015-05-05 目录1 用户管理... 21.1 添加用户... 21.2 用户分组... 31.3 用户权限... 41.3.1 wiki管理权限... 41.3.2 空间权限_xwiki使用教程

随便推点

Android BLE 蓝牙通信库,2024年最新应届生面试销售岗位的面试问题技巧_android蓝牙通信-程序员宅基地

文章浏览阅读919次,点赞12次,收藏10次。然后根据自定义的协议,解析对应的 BeaconItem 中的 bytes,首先创建一个 BeaconParser,传入对应的 BeaconItem,然后根据协议不断读取数据, 如果协议中某个字段占 1 个字节,则调用 readByte,若占用两个字节则调用 readShort,如果要取某个字节的某个 bit 则调用 getBit。// 获取第 1 字节的第 1bit。可以在广播中携带设备的自定义数据,用于设备识别,数据广播,事件通知等,这样手机端无需连接设备就可以获取设备推送的数据。_android蓝牙通信

vue el-input表单验证禁止输入空格_element表单空格校验-程序员宅基地

文章浏览阅读1w次,点赞6次,收藏7次。element ui 中自带的表单必填项校验输入空格时,依然能逃过验证(required: true还是可以通过),需要再 在v-model 加上.trim来禁止输入空格字符。加上之后则不能输入空格。..._element表单空格校验

PYTHON常用库简介_python常用库介绍-程序员宅基地

文章浏览阅读8.3k次,点赞6次,收藏80次。Python科学计算基础库:Numpy,Pandas,Scipy,Matplotlib1.NumPy支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库,线性代数,傅里叶变换和随机数功能底层使用C语言编写,内部解除了GIL(全局解释器锁),其对数组的操作速度不受Python解释器的限制,效率远高于纯Python代码。2.PandasPandas是一个强大的基于Numpy分析结构化数据的工具集;Pandas 可以从各种文件格式比如 CSV、JSON、SQL、Micros_python常用库介绍

Anaconda创建Pytorch虚拟环境(排坑详细)_anaconda创建pytorch环境-程序员宅基地

文章浏览阅读5.9w次,点赞150次,收藏1.4k次。利用conda指令搭建Pytorch环境,并在Pytorch环境中安装GPU版Pytorch相关包。_anaconda创建pytorch环境

Linux: 磁盘状态观察命令lsblk、blkid-程序员宅基地

文章浏览阅读955次,点赞12次,收藏32次。有时我们在磁盘规划前会想要确定一下当前系统的文件系统或磁盘分区情况。这时,就有几个命令可以供选择,通过本文,可以学习这些命令的使用。_lsblk

构造方法与方法的区别详解_构造方法和普通方法之间的区别-程序员宅基地

文章浏览阅读5.7k次,点赞11次,收藏46次。结论!!!学生类当中虽然没有构造方法 但是测试代码当中Student对象也创建完成了。是因为当类中没有任何构造方法的时候系统默认构造一个无参数的构造方法构造方法和普通方法结构的区别如下:​​​​​​​调用构造方法怎么调用呢?..._构造方法和普通方法之间的区别

推荐文章

热门文章

相关标签