概述
现板上带有一个sdio接口的wifi芯片:
sdio其实也就是sd/mmc的接口,只是协议有区别而已.所以使用sdio接口,需要先把sd/mmc的控制器驱动才可以.
通过检查电路原理图,可以发现此wifi芯片是连接到板上mmc1控制器上的。H5共有三个sd/mmc控制器, 而控制器驱动是platform_driver, 需要用platform_device或在设备树里提供硬件控制器的硬件资源.
在H5的设备树sunxi-h3-h5.dtsi文件里,而描述好三个sd/mmc控制器的设备节点:
mmc0: mmc@01c0f000 {
/* compatible and clocks are in per SoC .dtsi file */
reg = <0x01c0f000 0x1000>;
resets = <&ccu RST_BUS_MMC0>;
reset-names = "ahb";
interrupts = <GIC_SPI 60 IRQ_TYPE_LEVEL_HIGH>;
status = "enabled";
#address-cells = <1>;
#size-cells = <0>;
};
mmc1: mmc@01c10000 {
/* compatible and clocks are in per SoC .dtsi file */
reg = <0x01c10000 0x1000>;
resets = <&ccu RST_BUS_MMC1>;
reset-names = "ahb";
interrupts = <GIC_SPI 61 IRQ_TYPE_LEVEL_HIGH>;
status = "enabled";
#address-cells = <1>;
#size-cells = <0>;
};
mmc2: mmc@01c11000 {
/* compatible and clocks are in per SoC .dtsi file */
reg = <0x01c11000 0x1000>;
resets = <&ccu RST_BUS_MMC2>;
reset-names = "ahb";
interrupts = <GIC_SPI 62 IRQ_TYPE_LEVEL_HIGH>;
status = "enabled";
#address-cells = <1>;
#size-cells = <0>;
};
但三个设备节点的status属性值不是”okay”的话,是不会生效的. 而且还需要提供sd/mmc控制器使用的gpio口配置信息.
在设备树文件sun50i-h5-nanopi-neo2.dts里,已提供让mmc0控制器生效的设备节点:
&mmc0 {
pinctrl-names = "default";
pinctrl-0 = <&mmc0_pins_a>, <&mmc0_cd_pin>;
vmmc-supply = <®_vcc3v3>;
bus-width = <4>;
cd-gpios = <&pio 5 6 GPIO_ACTIVE_LOW>; /* PF6 */
boot_device = <1>;
status = "okay";
};
所以要想使用mmc1控制器,再增加一个mmc的设备节点即可:
&mmc1 {
pinctrl-names = "default";
pinctrl-0 = <&mmc1_pins_a>;
vmmc-supply = <®_vcc3v3>;
bus-width = <4>;
status = "okay";
};
修改完成后更新使用设备树,进入系统后:
//查看到已有两个设备与sd/mmc控制器的驱动匹配上了:
^_^ / # ls /sys/bus/platform/drivers/sunxi-mmc/
1c0f000.mmc/ 1c10000.mmc/ bind uevent unbind
sd/mmc控制器驱动好后,它会自动读取sdio设备的信息,并在系统里创建出相应的sdio设备信息:
这里可以获取到wifi芯片的厂家和设备id, wifi设备驱动里是根据这些id来作匹配的.
^_^ / # cat /sys/bus/sdio/devices/mmc2:0001:1/device
0xf179
^_^ / # cat /sys/bus/sdio/devices/mmc2:0001:1/vendor
0x024c
通过官网的说明: http://linux-sunxi.org/Wifi#RTL8189FTV
rtl8189ftv型号的wifi用的就是rtl8189ES驱动. 与型号8189fs一致.
下载驱动源码: git clone https://github.com/jwrdegoede/rtl8189ES_linux.git
git checkout -b rtl8189fs origin/rtl8189fs //下载8189fs的分支
git pull //检查更新
驱动源码下载后, 可以发现此驱动源码是可以支持很多个型号的wifi芯片.
在驱动源码os_dep/linux/sdio_intf.c文件里, 可以看到匹配用的设备id表:
47 static const struct sdio_device_id sdio_ids[] =
48 {
49 #ifdef CONFIG_RTL8723B
50 { SDIO_DEVICE(0x024c, 0xB723),.driver_data = RTL8723B},
51 #endif
52 #ifdef CONFIG_RTL8188E
53 { SDIO_DEVICE(0x024c, 0x8179),.driver_data = RTL8188E},
54 #endif //CONFIG_RTL8188E
55
56 #ifdef CONFIG_RTL8821A
57 { SDIO_DEVICE(0x024c, 0x8821),.driver_data = RTL8821},
58 #endif //CONFIG_RTL8821A
59
60 #ifdef CONFIG_RTL8192E
61 { SDIO_DEVICE(0x024c, 0x818B),.driver_data = RTL8192E},
62 #endif //CONFIG_RTL8192E
63
64 #ifdef CONFIG_RTL8703B
65 { SDIO_DEVICE(0x024c, 0xB703), .driver_data = RTL8703B},
66 #endif
67
68 #ifdef CONFIG_RTL8188F //rtl8189ftv的厂家和设备id
69 {SDIO_DEVICE(0x024c, 0xF179), .driver_data = RTL8188F},
70 #endif
....
98 static struct sdio_drv_priv sdio_drvpriv = {
99 .r871xs_drv.probe = rtw_drv_init,
100 .r871xs_drv.remove = rtw_dev_remove,
101 .r871xs_drv.name = (char*)DRV_NAME,
102 .r871xs_drv.id_table = sdio_ids,
103 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,29))
104 .r871xs_drv.drv = {
105 .pm = &rtw_sdio_pm_ops,
106 }
107 #endif
108 };
具体要编译支持哪个芯片,需要修改里面的Makefile.
//只要作了git checkout … 里面会自动修改支持8189ftv/818fs的.
Makefile里的内容:
38 CONFIG_RTL8188F = y
39 ######################### Interface ###########################
40 CONFIG_USB_HCI = n
41 CONFIG_PCI_HCI = n
42 CONFIG_SDIO_HCI = y
//需要修改的内容:
114 CONFIG_PLATFORM_ARM_SUNxI = y
...
1373 ARCH := arm64
1375 CROSS_COMPILE=aarch64-linux-gnu-
...
1378 KSRC=~/fH5/NanoPi-NEO2/sources/linux/
修改完成后,执行Makefile, 最终会生成8189fs.ko。在板上系统加载此驱动模块后,会有”wlan0”网络设备.
连接路由器这些的配置请参考: http://blog.csdn.net/jklinux/article/details/72783258
最后
以上就是动听热狗为你收集整理的28 H5上rtl8189ftv wifi驱动移植的全部内容,希望文章能够帮你解决28 H5上rtl8189ftv wifi驱动移植所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复