28 H5上rtl8189ftv wifi驱动移植

现板上带有一个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 = <&reg_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 = <&reg_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

  • 5
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值