本文主要简述南方硅谷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/路径下
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
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,测试网络
文章浏览阅读4.9k次。服务器安装Setup-Subversion-1.7.7 安装路径:D:\Subversion在D:\根目录新建SVN目录做为svn的版本库目录。接着,在D:\SVN\目录下新建一个项目bobo目录。然后,在该目录上右键,选择:TortoiseSVN -> 在此创建版本库,点击“确定”(注意:不要创建目录结构-理由:由于本人对SVN不了解,经过测试,如果创建了目录结构,那么同步到客户端的项目_svn安装no certification authorities found
文章浏览阅读3.5k次。Nest是一套基于Node.js的强大的Web框架,可帮助你轻松构建出高效的、可扩展的应用程序。它是通过结合OOP(面向对象编程)和FP(函数式编程)的最佳理念,采用现代化JavaScript,使用TypeScript构建的。Nest不仅仅只是一套框架,因为它是基于绝妙的,著名的流行库Express和Socket.io构建的(你也可以根据自己的需求选择任何其他库),所以无需等待大型社区,可以直接使..._node得nest框架中文文档
文章浏览阅读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 序列帧换装
文章浏览阅读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
文章浏览阅读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
文章浏览阅读7.1k次。XWIKI使用说明书 2015-05-05 目录1 用户管理... 21.1 添加用户... 21.2 用户分组... 31.3 用户权限... 41.3.1 wiki管理权限... 41.3.2 空间权限_xwiki使用教程
文章浏览阅读919次,点赞12次,收藏10次。然后根据自定义的协议,解析对应的 BeaconItem 中的 bytes,首先创建一个 BeaconParser,传入对应的 BeaconItem,然后根据协议不断读取数据, 如果协议中某个字段占 1 个字节,则调用 readByte,若占用两个字节则调用 readShort,如果要取某个字节的某个 bit 则调用 getBit。// 获取第 1 字节的第 1bit。可以在广播中携带设备的自定义数据,用于设备识别,数据广播,事件通知等,这样手机端无需连接设备就可以获取设备推送的数据。_android蓝牙通信
文章浏览阅读1w次,点赞6次,收藏7次。element ui 中自带的表单必填项校验输入空格时,依然能逃过验证(required: true还是可以通过),需要再 在v-model 加上.trim来禁止输入空格字符。加上之后则不能输入空格。..._element表单空格校验
文章浏览阅读8.3k次,点赞6次,收藏80次。Python科学计算基础库:Numpy,Pandas,Scipy,Matplotlib1.NumPy支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库,线性代数,傅里叶变换和随机数功能底层使用C语言编写,内部解除了GIL(全局解释器锁),其对数组的操作速度不受Python解释器的限制,效率远高于纯Python代码。2.PandasPandas是一个强大的基于Numpy分析结构化数据的工具集;Pandas 可以从各种文件格式比如 CSV、JSON、SQL、Micros_python常用库介绍
文章浏览阅读5.9w次,点赞150次,收藏1.4k次。利用conda指令搭建Pytorch环境,并在Pytorch环境中安装GPU版Pytorch相关包。_anaconda创建pytorch环境
文章浏览阅读955次,点赞12次,收藏32次。有时我们在磁盘规划前会想要确定一下当前系统的文件系统或磁盘分区情况。这时,就有几个命令可以供选择,通过本文,可以学习这些命令的使用。_lsblk
文章浏览阅读5.7k次,点赞11次,收藏46次。结论!!!学生类当中虽然没有构造方法 但是测试代码当中Student对象也创建完成了。是因为当类中没有任何构造方法的时候系统默认构造一个无参数的构造方法构造方法和普通方法结构的区别如下:调用构造方法怎么调用呢?..._构造方法和普通方法之间的区别