介绍

简单来说,sdio起源自sd标准,顾名思义就是sd的IO接口(interface)的意思,更具体的说明,sd本来是记忆卡的标准,但是现在也可以把SD卡拿来插上一些外围设备接口使用,这个就是就叫做sdio。

而且sdio本身是一种相当单纯的技术,通过sd的IO引脚来连接外部外围,并且通过sd的IO数据接位与外围传输数据,而且sd协会也推出很完整的sdio stack 驱动程序,使得sdio外围得开发与应用变得非常热门

这里我们要移植的是RTL8822cs的sdio WiFi 模块,将其移植到rk3308的板子上去。

设备树得修改

我们使用的是sdio接口的,所以我们需要先在设备树内支持相关配置,在自己板子相关的dts中引用sdio和wireless

wireless-wlan {compatible = "wlan-platdata";rockchip,grf = <&grf>;wifi_chip_type = "rtl8822cs";sdio_vref = <1800>;WIFI,host_wake_irq = <&gpio4 RK_PB4 GPIO_ACTIVE_HIGH>;status = "okay";
};
&sdio {clock-frequency = <100000000>;clock-freq-min-max = <200000 100000000>;bus-width = <4>;max-frequency = <150000000>;cap-sd-highspeed;cap-sdio-irq;keep-power-in-suspend;supports-sdio;non-removable;mmc-pwrseq = <&sdio_pwrseq>;//sd-uhs-sdr104;     //这句话需要屏蔽,不然会出错不上去num-slots = <1>;status = "okay";
};

rtl8822cs源码移植

移植源码包我们需要做以下步骤

(1)拷贝源码包到内核

将厂商提供的源码包放入内核内合适的地方,这里我放在kernel/drivers/net/wireless/rockchip_wlan/ 目录下并将其重命名为rtl8822cs

(2)修改kernel/drivers/net/wireless/rockchip_wlan/Makefile 将rtl8822cs加入

# SPDX-License-Identifier: GPL-2.0
obj-$(CONFIG_AP6XXX)    += rkwifi/
obj-$(CONFIG_RTL8188EU) += rtl8188eu/
obj-$(CONFIG_RTL8188FU) += rtl8188fu/
obj-$(CONFIG_RTL8189ES) += rtl8189es/
obj-$(CONFIG_RTL8189FS) += rtl8189fs/
obj-$(CONFIG_RTL8723BS) += rtl8723bs/
obj-$(CONFIG_RTL8723BU) += rtl8723bu/
obj-$(CONFIG_RTL8723CS) += rtl8723cs/
obj-$(CONFIG_RTL8723DS) += rtl8723ds/
obj-$(CONFIG_RTL8822BE) += rtl8822be/
obj-$(CONFIG_SSV6051)   += ssv6xxx/
obj-$(CONFIG_MVL88W8977)        += mvl88w8977/
obj-$(CONFIG_WL_ROCKCHIP)       += wifi_sys/rkwifi_sys_iface.o
obj-$(CONFIG_WL_ROCKCHIP)       += rkwifi/rk_wifi_config.o
obj-$(CONFIG_CYW_BCMDHD)        += cywdhd/
obj-$(CONFIG_RTL8822CS) += rtl8822cs/

(3)修改kernel/drivers/net/wireless/rockchip_wlan/Kconfig 将rtl8822cs加入配置

source "drivers/net/wireless/rockchip_wlan/rtl8188eu/Kconfig"
source "drivers/net/wireless/rockchip_wlan/rtl8188fu/Kconfig"
source "drivers/net/wireless/rockchip_wlan/rtl8189es/Kconfig"
source "drivers/net/wireless/rockchip_wlan/rtl8189fs/Kconfig"
source "drivers/net/wireless/rockchip_wlan/rtl8723bs/Kconfig"
source "drivers/net/wireless/rockchip_wlan/rtl8723bu/Kconfig"
source "drivers/net/wireless/rockchip_wlan/rtl8723cs/Kconfig"
source "drivers/net/wireless/rockchip_wlan/rtl8723ds/Kconfig"
source "drivers/net/wireless/rockchip_wlan/rtl8822be/Kconfig"
source "drivers/net/wireless/rockchip_wlan/mvl88w8977/Kconfig"
source "drivers/net/wireless/rockchip_wlan/ssv6xxx/Kconfig"
source "drivers/net/wireless/rockchip_wlan/rtl8822cs/Kconfig"

(4)修改 drivers/net/wireless/rockchip_wlan/Kconfig/rtl8822cs 下的 Makefile 文件 将文件中的CONFIG_PLATFORM_I386_PC 的值修改为 n 将文件中的 ONFIG_PLATFORM_ARM_RK3188 的值修改为 y

这里说明下,由于这个Makefile内没有我这个rk3308芯片的支持,而我个人比较懒,所以这里使用的是rk3318的这个配置项

对rk3188相关的配置进行修改,主要是模块名,编译工具,和ARCH

(5)修改Kconfig

将源码内的kconfig修改为RTL8822CS,这里是厂商粗心写错成了RTL8822BS

(6)修改kernel/net/rfkill/rfkill-wlan.c 文件添加rtl8822cs相关

(7)修改kernel/include/linux/rfkill-wlan.h添加rtl8822cs相关配置

menuconfig 配置

(1)将移植的源码在内核配置中进行配置加载驱动

-> Device Drivers                                                                                -> Network device support (NETDEVICES [=y])                                                    -> Wireless LAN (WLAN [=y])                                                                  -> Rockchip Wireless LAN support (WL_ROCKCHIP [=y])    

(2)配置内核支持wifi sdio

-> Networking support (NET [=y])                                                                 -> Wireless (WIRELESS [=y])           

由于sdio wifi 设备的特性,它首先是个网络设备,其次是一个块设备,在内核启动阶段是靠mmc去扫描sdio设备的,我们还需要将mmc配置进去,而如何找到我们这个sdio设备的mmc源码呢,这里需要先去设备树内找到对sdio的描述

sdio: dwmmc@ff4a0000 {compatible = "rockchip,rk3308-dw-mshc", "rockchip,rk3288-dw-mshc";   reg = <0x0 0xff4a0000 0x0 0x4000>;max-frequency = <150000000>;bus-width = <4>;clocks = <&cru HCLK_SDIO>, <&cru SCLK_SDIO>,<&cru SCLK_SDIO_DRV>, <&cru SCLK_SDIO_SAMPLE>;clock-names = "biu", "ciu", "ciu-drv", "ciu-sample";fifo-depth = <0x100>;interrupts = <GIC_SPI 78 IRQ_TYPE_LEVEL_HIGH>;pinctrl-names = "default";pinctrl-0 = <&sdio_bus4 &sdio_cmd &sdio_clk>;status = "disabled";
};

复制compatible 中的其中一个去grep看下那个源文件调用到了这个

$:~/NT31/kernel/drivers/mmc$ grep "rockchip,rk3308-dw-mshc" -nr
Binary file built-in.o matches
Binary file host/built-in.o matches
host/dw_mmc-rockchip.c:240:                                 "rockchip,rk3308-dw-mshc"))

发现是dw_mmc-rockchip.c这个文件调用了,我们需要将这个文件配置进内核,不然不会有mmc去扫描sdio设备

-> Device Drivers                                                                                -> MMC/SD/SDIO card support (MMC [=y])    

比较关键的选项是Networking support->Wireless下的 cfg80211 wireless extensions compatibility

和Device driver->MMC/SD/SDIO card support 下的SDIO UART/GPS class support 。

如果不按照上面的配置的话,装载sdio wifi的驱动时将会报有关80211的错误和sdio_claim_host()函数找不到的错误。

编译烧录

基本上wifi就移植完了,整体编译烧录进板子看下情况,发现内核启动时mmc报了-84的错误

[    0.818171] mmc0: error -84 whilst initialising SDIO card
[    0.830958] mmc_host mmc0: Bus speed (slot 0) = 300000Hz (slot req 300000Hz, actual 300000HZ div = 0)
[    0.851540] dwmmc_rockchip ff4a0000.dwmmc: card claims to support voltages below defined range
[    0.860002] FtlGcRefreshBlock  0x173
[    0.860017] FtlGcRefreshBlock  0x2a5
[    0.864506] mmc_host mmc0: Bus speed (slot 0) = 50000000Hz (slot req 50000000Hz, actual 50000000HZ div = 0)

查看发现84错误是提示时钟频率不对,在网上找了些资料都是说用最初的400k频率可以

&sdio {clock-frequency = <100000000>;clock-freq-min-max = <200000 100000000>;bus-width = <4>;max-frequency = <400000>;   //修改频率为400kcap-sd-highspeed;cap-sdio-irq;keep-power-in-suspend;supports-sdio;non-removable;mmc-pwrseq = <&sdio_pwrseq>;//sd-uhs-sdr104;      //这句话需要屏蔽,不然会出错不上去num-slots = <1>;status = "okay";
};

启动后发现mmc0: new high speed SDIO card at address 0001 扫描到设备了

如何查看sdio是否检测到设备

/ # ls /sys/bus/sdio/devices/
mmc0:0001:1

查看devices目录下是否有文件有就说明找到了设备

sdio wifi 移植相关推荐

  1. 关于AM335X移植SDIO WIFI的简易教程(转)

    最近应一个朋友邀请,帮他移植了SDIO WIFI到3.2版本内核.因为之前已经成功移植了3.14内核,所以整个过程花了一个下午就完成了. 话不多说,先交待一下平台: CPU:TI AM3352 600 ...

  2. STM32F103驱动SDIO wifi Marvell8801/Marvell88w8801 介绍(十) ---- 移植TCP/IP协议栈LWIP

    代码工程的GITHUB连接:点进进入GITHUB仓库 https://github.com/sj15712795029/stm32f1_marvell88w8801_marvell8801_wifi ...

  3. 自己实现SDIO wifi Marvell8801/Marvell88w8801驱动 介绍(一) ---- 芯片介绍

    代码工程的GITHUB连接:点进进入GITHUB仓库 https://github.com/sj15712795029/stm32f1_marvell88w8801_marvell8801_wifi ...

  4. android 5.0 wifi移植,android  wifi移植

    手动加载驱动 ####16th,Jul 驱动加载 modprobe libertas modprobe libertas_sdio 加载第二行时出错拉 # modprobe libertas_sdio ...

  5. STM32F103+SDIO wifi Marvell8801/Marvell88w8801 介绍(九) ---- Marvell 8801/Marvell 88w8801 实现AP功能/实现热点功能

    代码工程的GITHUB连接:点进进入GITHUB仓库 https://github.com/sj15712795029/stm32f1_marvell88w8801_marvell8801_wifi ...

  6. SDIO wifi Marvell8801/Marvell88w8801 介绍(三) ---- Marvell8801/Marvell88w8801寄存器介绍

    代码工程的GITHUB连接:点进进入GITHUB仓库 https://github.com/sj15712795029/stm32f1_marvell88w8801_marvell8801_wifi ...

  7. SDIO wifi Marvell8801/Marvell88w8801 介绍(五) ---- Marvell8801/Marvell88w8801 TLV

    代码工程的GITHUB连接:点进进入GITHUB仓库 https://github.com/sj15712795029/stm32f1_marvell88w8801_marvell8801_wifi ...

  8. SDIO wifi Marvell8801/Marvell88w8801 介绍(四) ---- Marvell8801/Marvell88w8801命令/事件/数据格式

    代码工程的GITHUB连接:点进进入GITHUB仓库 https://github.com/sj15712795029/stm32f1_marvell88w8801_marvell8801_wifi ...

  9. STM32F103驱动SDIO wifi Marvell8801/Marvell88w8801 介绍(十一) ---- 编写LWIP DHCP server

    代码工程的GITHUB连接:点进进入GITHUB仓库 https://github.com/sj15712795029/stm32f1_marvell88w8801_marvell8801_wifi ...

最新文章

  1. 体温高会折寿?温州大学学者发现体温比代谢率更会影响寿命,已在小鼠身上验证 | Nature子刊...
  2. 【FFmpeg】FFmpeg 帮助文档使用
  3. 杰尼亚签约第四范式 开启奢侈品行业智慧零售新思路
  4. (转)计算几何模板 - kuangbin
  5. 大话异步与并行(一)
  6. 被流氓360设置浏览器主页的解决办法(如果你也遇到了跟我一样的问题,不妨看一下是不是这个原因)...
  7. 计算机硬件知识考证题,计算机硬件知识题(答案)资料
  8. Xshell代理访问外网或者公司的内网
  9. OpenCV矩形检测
  10. Redis详解(五)——Redis多实例
  11. mysql基础之mariadb集群双主(主主)架构
  12. 国二mysql综合应用题答案_2017年9月全国计算机二级MySQL考试章节练习题
  13. 密码管理系统竞品分析报告
  14. oracle取字段第三位字符,oracle字符串根据分隔符号获取第几个元素
  15. linux下STM32开发环境搭建
  16. [Maven实战-许晓斌]-[第二章]-2.4设置HTTP代理
  17. 空中旋球计算机控制系统,自动乒乓球发球机设计及其控制系统的研究
  18. Windows11下如何免安装配置MySQL服务(mysql5.6.50.zip)? | 超级详细,建议收藏
  19. Webdriver - webdriver hangs when get or click
  20. HEXO+Github博客 更换新域名详解

热门文章

  1. 用java流复制文件不能复制全,少几十兆!!
  2. php简单的商城系统,DouPHP轻量级商城管理系统
  3. 戴尔sc系列存储阵列柜服务器,Dell存储Compellent SC4020
  4. 如何评估社交网络中信息内容的价值呢?
  5. 计算机应用基础0039答案,计算机应用基础-0039(贵州电大-课程号:5205004)参考资料.docx...
  6. 桌面增加了IE图标无法删除
  7. db2 jdbc 连接池_db2 jdbc连接数据库
  8. htc hd2刷android,真正的刷机之王! HTC HD2成功刷入安卓7.0
  9. 关于Linux性能调优之内存负载调优
  10. 德州仪器宣布收购12寸晶圆厂