RK3399 LINUX RTL8821CS移植

目录

WIFI移植

蓝牙修改


WIFI移植

因为RK3568支持RTL8821CS模组,因此从RK3568移植RTL8821CS驱动

  1. 移植RTL8821驱动:

    1.1 drivers/net/wireless/rockchip_wlan/Kconfig

    
    git@grsthu-virtual-machine:~/rk3399_linux/kernel$ git diff drivers/net/wireless/rockchip_wlan/Kconfig
    diff --git a/drivers/net/wireless/rockchip_wlan/Kconfig b/drivers/net/wireless/rockchip_wlan/Kconfig
    index 6bfc72b9fde0..d56f339eb085 100644
    --- a/drivers/net/wireless/rockchip_wlan/Kconfig
    +++ b/drivers/net/wireless/rockchip_wlan/Kconfig
    @@ -44,6 +44,7 @@ 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/rtl8821cs/Kconfig"
    

    1.2 drivers/net/wireless/rockchip_wlan/Makefile

    git@grsthu-virtual-machine:~/rk3399_linux/kernel$ git diff drivers/net/wireless/rockchip_wlan/Makefile
    diff --git a/drivers/net/wireless/rockchip_wlan/Makefile b/drivers/net/wireless/rockchip_wlan/Makefile
    index fb0e47b2ecfd..d693f2ad0f5d 100644
    --- a/drivers/net/wireless/rockchip_wlan/Makefile
    +++ b/drivers/net/wireless/rockchip_wlan/Makefile
    @@ -9,6 +9,7 @@ obj-$(CONFIG_RTL8723BU) += rtl8723bu/
     obj-$(CONFIG_RTL8723CS)        += rtl8723cs/
     obj-$(CONFIG_RTL8723DS) += rtl8723ds/
     obj-$(CONFIG_RTL8822BE)        += rtl8822be/
    +obj-$(CONFIG_RTL8821CS) += rtl8821cs/
    

    1.3 arch/arm64/boot/dts/rockchip/rk3399-grst-a2.dtsi

    diff --git a/arch/arm64/boot/dts/rockchip/rk3399-grst-a2.dtsi b/arch/arm64/boot/dts/rockchip/rk3399-grst-a2.dtsi
    index 6fb7749af469..48228f2709ea 100644
    --- a/arch/arm64/boot/dts/rockchip/rk3399-grst-a2.dtsi
    +++ b/arch/arm64/boot/dts/rockchip/rk3399-grst-a2.dtsi
    @@ -122,7 +122,7 @@
            wireless-wlan {
                    compatible = "wlan-platdata";
                    rockchip,grf = <&grf>;
    -               wifi_chip_type = "rtl8723ds";
    +               wifi_chip_type = "rtl8821cs";
                    sdio_vref = <1800>;
                    WIFI,host_wake_irq = <&gpio0 3 GPIO_ACTIVE_HIGH>; /* GPIO0_a3 */
                    status = "okay";
    

    1.4 arch/arm64/configs/rockchip_linux_defconfig

    diff --git a/arch/arm64/configs/rockchip_linux_defconfig b/arch/arm64/configs/rockchip_linux_defconfig
    index 5587013ba113..093d9523a0e6 100644
    --- a/arch/arm64/configs/rockchip_linux_defconfig
    +++ b/arch/arm64/configs/rockchip_linux_defconfig
    @@ -576,4 +576,4 @@ CONFIG_CAN_DEV=y
     CONFIG_CAN_RAW=y
     CONFIG_CAN_BCM=y
     CONFIG_CAN_GW=y
    -CONFIG_RTL8723DS=m
    +CONFIG_RTL8821CS=m
    

    1.5 驱动本体拷贝到对应路径
    https://download.csdn.net/download/danhu/33640222

    drivers/net/wireless/rockchip_wlan/rtl8821cs/
    
  2. 内核修改

    2.1 增加RTL8821CS wifi类型,用于dts中的类型判断

    2.1.1 include/linux/rfkill-wlan.h

    git@grsthu-virtual-machine:~/rk3399_linux/kernel$ git diff include/linux/rfkill-wlan.h
    diff --git a/include/linux/rfkill-wlan.h b/include/linux/rfkill-wlan.h
    index 883d0ae1a8bf..8165476cddb8 100644
    --- a/include/linux/rfkill-wlan.h
    +++ b/include/linux/rfkill-wlan.h
    @@ -74,6 +74,7 @@ enum {
         WIFI_RTL8189ES,
         WIFI_RTL8189FS,
         WIFI_RTL8812AU,
    +    WIFI_RTL8821CS,
         WIFI_RTL_SERIES,
    

    2.1.2 net/rfkill/rfkill-wlan.c

    git@grsthu-virtual-machine:~/rk3399_linux/kernel$ git diff net/rfkill/rfkill-wlan.c
    diff --git a/net/rfkill/rfkill-wlan.c b/net/rfkill/rfkill-wlan.c
    index 333368f2f071..e424fd4b27a6 100644
    --- a/net/rfkill/rfkill-wlan.c
    +++ b/net/rfkill/rfkill-wlan.c
    @@ -156,6 +156,8 @@ int get_wifi_chip_type(void)
             type = WIFI_RTL8189FS;
         } else if (strcmp(wifi_chip_type_string, "rtl8812au") == 0) {
             type = WIFI_RTL8812AU;                        
    +    } else if (strcmp(wifi_chip_type_string, "rtl8821cs") == 0) {
    +        type = WIFI_RTL8821CS;                        
         } else if (strcmp(wifi_chip_type_string, "esp8089") == 0) {
             type = WIFI_ESP8089;
         } else if (strcmp(wifi_chip_type_string, "mvl88w8977") == 0) {
    

    2.2 内核版本不一致做的修改

    2.2.1 include/net/cfg80211.h

    git@grsthu-virtual-machine:~/rk3399_linux/kernel$ git diff include/net/cfg80211.h
    diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
    index c05748cc1b20..768a35728ce5 100644
    --- a/include/net/cfg80211.h
    +++ b/include/net/cfg80211.h
    @@ -2220,6 +2220,34 @@ struct cfg80211_qos_map {
            struct cfg80211_dscp_exception dscp_exception[IEEE80211_QOS_MAP_MAX_EX];
            struct cfg80211_dscp_range up[8];
     };
    +/**
    + * struct cfg80211_external_auth_params - Trigger External authentication.
    + *
    + * Commonly used across the external auth request and event interfaces.
    + *
    + * @action: action type / trigger for external authentication. Only significant
    + *      for the authentication request event interface (driver to user space).
    + * @bssid: BSSID of the peer with which the authentication has
    + *      to happen. Used by both the authentication request event and
    + *      authentication response command interface.
    + * @ssid: SSID of the AP.  Used by both the authentication request event and
    + *      authentication response command interface.
    + * @key_mgmt_suite: AKM suite of the respective authentication. Used by the
    + *      authentication request event interface.
    + * @status: status code, %WLAN_STATUS_SUCCESS for successful authentication,
    + *      use %WLAN_STATUS_UNSPECIFIED_FAILURE if user space cannot give you
    + *      the real status code for failures. Used only for the authentication
    + *      response command interface (user space to driver).
    + * @pmkid: The identifier to refer a PMKSA.
    + */
    +struct cfg80211_external_auth_params {
    +        enum nl80211_external_auth_action action;
    +        u8 bssid[ETH_ALEN] __aligned(2);
    +        struct cfg80211_ssid ssid;
    +        unsigned int key_mgmt_suite;
    +        u16 status;
    +        const u8 *pmkid;
    +};
     
     /**
      * struct cfg80211_ops - backend description for wireless configuration
    @@ -2756,6 +2784,8 @@ struct cfg80211_ops {
            void    (*tdls_cancel_channel_switch)(struct wiphy *wiphy,
                                                  struct net_device *dev,
                                                  const u8 *addr);
    +        int     (*external_auth)(struct wiphy *wiphy, struct net_device *dev,
    +                                 struct cfg80211_external_auth_params *params);
     };
     
     /*
    @@ -3516,6 +3546,8 @@ struct wireless_dev {
            u8 ssid_len, mesh_id_len, mesh_id_up_len;
            struct cfg80211_conn *conn;
            struct cfg80211_cached_keys *connect_keys;
    +       u32 conn_owner_nlportid;
    +
     
            struct list_head event_list;
            spinlock_t event_lock;
    @@ -5340,6 +5372,17 @@ wiphy_ext_feature_isset(struct wiphy *wiphy,
     /* ethtool helper */
     void cfg80211_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info);
     
    +/**
    + * cfg80211_external_auth_request - userspace request for authentication
    + * @netdev: network device
    + * @params: External authentication parameters
    + * @gfp: allocation flags
    + * Returns: 0 on success, < 0 on error
    + */
    +int cfg80211_external_auth_request(struct net_device *netdev,
    +                                   struct cfg80211_external_auth_params *params,
    +                                   gfp_t gfp);
    +
     /* Logging, debugging and troubleshooting/diagnostic helpers. */
     
     /* wiphy_printk helpers, similar to dev_printk */
    

    2.2.2 include/uapi/linux/nl80211.h

    git@grsthu-virtual-machine:~/rk3399_linux/kernel$ git diff include/uapi/linux/nl80211.h
    diff --git a/include/uapi/linux/nl80211.h b/include/uapi/linux/nl80211.h
    index d3aea4f10faf..86466a0f191f 100644
    --- a/include/uapi/linux/nl80211.h
    +++ b/include/uapi/linux/nl80211.h
    @@ -1006,6 +1006,41 @@ enum nl80211_commands {
     
            NL80211_CMD_WIPHY_REG_CHANGE,
     
    +       NL80211_CMD_START_NAN,
    +        NL80211_CMD_STOP_NAN,
    +        NL80211_CMD_ADD_NAN_FUNCTION,
    +        NL80211_CMD_DEL_NAN_FUNCTION,
    +        NL80211_CMD_CHANGE_NAN_CONFIG,
    +        NL80211_CMD_NAN_MATCH,
    +
    +        NL80211_CMD_SET_MULTICAST_TO_UNICAST,
    +
    +        NL80211_CMD_UPDATE_CONNECT_PARAMS,
    +
    +        NL80211_CMD_SET_PMK,
    +        NL80211_CMD_DEL_PMK,
    +
    +        NL80211_CMD_PORT_AUTHORIZED,
    +
    +        NL80211_CMD_RELOAD_REGDB,
    +
    +        NL80211_CMD_EXTERNAL_AUTH,
    +
    +        NL80211_CMD_STA_OPMODE_CHANGED,
    +
    +        NL80211_CMD_CONTROL_PORT_FRAME,
    +
    +        NL80211_CMD_GET_FTM_RESPONDER_STATS,
    +
    +        NL80211_CMD_PEER_MEASUREMENT_START,
    +        NL80211_CMD_PEER_MEASUREMENT_RESULT,
    +
    +       NL80211_CMD_PEER_MEASUREMENT_COMPLETE,
    +
    +        NL80211_CMD_NOTIFY_RADAR,
    +
    +        NL80211_CMD_UPDATE_OWE_INFO,
    +
            /* add new commands above here */
     
            /* used to define NL80211_CMD_MAX below */
    @@ -2157,6 +2192,100 @@ enum nl80211_attrs {
            NL80211_ATTR_MAX_SCAN_PLAN_ITERATIONS,
            NL80211_ATTR_SCHED_SCAN_PLANS,
     
    +       NL80211_ATTR_PBSS,
    +
    +        NL80211_ATTR_BSS_SELECT,
    +
    +        NL80211_ATTR_STA_SUPPORT_P2P_PS,
    +
    +        NL80211_ATTR_PAD,
    +
    +        NL80211_ATTR_IFTYPE_EXT_CAPA,
    +
    +        NL80211_ATTR_MU_MIMO_GROUP_DATA,
    +        NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR,
    +
    +        NL80211_ATTR_SCAN_START_TIME_TSF,
    +        NL80211_ATTR_SCAN_START_TIME_TSF_BSSID,
    +        NL80211_ATTR_MEASUREMENT_DURATION,
    +        NL80211_ATTR_MEASUREMENT_DURATION_MANDATORY,
    +
    +        NL80211_ATTR_MESH_PEER_AID,
    +
    +        NL80211_ATTR_NAN_MASTER_PREF,
    +        NL80211_ATTR_BANDS,
    +        NL80211_ATTR_NAN_FUNC,
    +        NL80211_ATTR_NAN_MATCH,
    +
    +        NL80211_ATTR_FILS_KEK,
    +        NL80211_ATTR_FILS_NONCES,
    +
    +        NL80211_ATTR_MULTICAST_TO_UNICAST_ENABLED,
    +       NL80211_ATTR_BSSID,
    +
    +        NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI,
    +        NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST,
    +
    +        NL80211_ATTR_TIMEOUT_REASON,
    +
    +        NL80211_ATTR_FILS_ERP_USERNAME,
    +        NL80211_ATTR_FILS_ERP_REALM,
    +        NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM,
    +        NL80211_ATTR_FILS_ERP_RRK,
    +        NL80211_ATTR_FILS_CACHE_ID,
    +
    +        NL80211_ATTR_PMK,
    +
    +        NL80211_ATTR_SCHED_SCAN_MULTI,
    +        NL80211_ATTR_SCHED_SCAN_MAX_REQS,
    +
    +        NL80211_ATTR_WANT_1X_4WAY_HS,
    +        NL80211_ATTR_PMKR0_NAME,
    +        NL80211_ATTR_PORT_AUTHORIZED,
    +
    +        NL80211_ATTR_EXTERNAL_AUTH_ACTION,
    +        NL80211_ATTR_EXTERNAL_AUTH_SUPPORT,
    +
    +        NL80211_ATTR_NSS,
    +        NL80211_ATTR_ACK_SIGNAL,
    +
    +        NL80211_ATTR_CONTROL_PORT_OVER_NL80211,
    +
    +        NL80211_ATTR_TXQ_STATS,
    +        NL80211_ATTR_TXQ_LIMIT,
    +       NL80211_ATTR_TXQ_MEMORY_LIMIT,
    +        NL80211_ATTR_TXQ_QUANTUM,
    +
    +        NL80211_ATTR_HE_CAPABILITY,
    +
    +        NL80211_ATTR_FTM_RESPONDER,
    +
    +        NL80211_ATTR_FTM_RESPONDER_STATS,
    +
    +        NL80211_ATTR_TIMEOUT,
    +
    +        NL80211_ATTR_PEER_MEASUREMENTS,
    +
    +        NL80211_ATTR_AIRTIME_WEIGHT,
    +        NL80211_ATTR_STA_TX_POWER_SETTING,
    +        NL80211_ATTR_STA_TX_POWER,
    +
    +        NL80211_ATTR_SAE_PASSWORD,
    +
    +        NL80211_ATTR_TWT_RESPONDER,
    +
    +        NL80211_ATTR_HE_OBSS_PD,
    +
    +        NL80211_ATTR_WIPHY_EDMG_CHANNELS,
    +        NL80211_ATTR_WIPHY_EDMG_BW_CONFIG,
    +
    +        NL80211_ATTR_VLAN_ID,
    +
    +        NL80211_ATTR_HE_BSS_COLOR,
    +
    +        NL80211_ATTR_IFTYPE_AKM_SUITES,
    +
    +
            /* add attributes here, update the policy in nl80211.c */
     
            __NL80211_ATTR_AFTER_LAST,
    @@ -4645,5 +4774,14 @@ enum nl80211_sched_scan_plan {
            NL80211_SCHED_SCAN_PLAN_MAX =
                    __NL80211_SCHED_SCAN_PLAN_AFTER_LAST - 1
     };
    -
    +/**
    + * nl80211_external_auth_action - Action to perform with external
    + *     authentication request. Used by NL80211_ATTR_EXTERNAL_AUTH_ACTION.
    + * @NL80211_EXTERNAL_AUTH_START: Start the authentication.
    + * @NL80211_EXTERNAL_AUTH_ABORT: Abort the ongoing authentication.
    + */
    +enum nl80211_external_auth_action {
    +        NL80211_EXTERNAL_AUTH_START,
    +        NL80211_EXTERNAL_AUTH_ABORT,
    +};
     #endif /* __LINUX_NL80211_H */
    

    2.2.3 net/wireless/nl80211.c

    git@grsthu-virtual-machine:~/rk3399_linux/kernel$ git diff net/wireless/nl80211.c
    diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
    index 66da11734b48..1af42067c837 100644
    --- a/net/wireless/nl80211.c
    +++ b/net/wireless/nl80211.c
    @@ -13347,6 +13347,46 @@ void nl80211_send_ap_stopped(struct wireless_dev *wdev)
      out:
            nlmsg_free(msg);
     }
    +int cfg80211_external_auth_request(struct net_device *dev,
    +                                   struct cfg80211_external_auth_params *params,
    +                                   gfp_t gfp)
    +{
    +        struct wireless_dev *wdev = dev->ieee80211_ptr;
    +        struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
    +        struct sk_buff *msg;
    +        void *hdr;
    +
    +        if (!wdev->conn_owner_nlportid)
    +                return -EINVAL;
    +
    +        msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
    +        if (!msg)
    +                return -ENOMEM;
    +
    +        hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_EXTERNAL_AUTH);
    +        if (!hdr)
    +                goto nla_put_failure;
    +
    +        if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
    +            nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
    +            nla_put_u32(msg, NL80211_ATTR_AKM_SUITES, params->key_mgmt_suite) ||
    +            nla_put_u32(msg, NL80211_ATTR_EXTERNAL_AUTH_ACTION,
    +                        params->action) ||
    +            nla_put(msg, NL80211_ATTR_BSSID, ETH_ALEN, params->bssid) ||
    +            nla_put(msg, NL80211_ATTR_SSID, params->ssid.ssid_len,
    +                    params->ssid.ssid))
    +                goto nla_put_failure;
    +
    +        genlmsg_end(msg, hdr);
    +        genlmsg_unicast(wiphy_net(&rdev->wiphy), msg,
    +                        wdev->conn_owner_nlportid);
    +        return 0;
    +
    + nla_put_failure:
    +        nlmsg_free(msg);
    +        return -ENOBUFS;
    +}
    +EXPORT_SYMBOL(cfg80211_external_auth_request);
     
     /* initialisation/exit functions */
    
  3. ubuntu修改
拷贝编译生成的8821cs.ko到ubuntu的/lib/modules/目录
修改/etc/rc.local
添加insmod /lib/modules/8821cs.ko

蓝牙修改

  1. 内核修改

    1.1 修改config文件,根据RK的文档修改

    CONFIG_BT_HCIUART=n
    

    1.2 编译realtek的蓝牙驱动(编译buildroot的时候会生成hci_uart.ko)

    external/rkwifibt/realtek/rtk_hciattach/
    
  2. ubuntu修改,修改后可使用系统的蓝牙控件操作蓝牙

修改文件系统中的/usr/bin/bt-attach
#!/usr/bin/env bash
  
#bt_type=$(rk_wifi_gettype)
#bt_type=cat /sys/class/rkwifi/chip|grep RTL8821CS
bt_type="RTL8821CS"
rtk_attach() {
        echo "start realtek bt"
        ret=`ps -ef |grep rtk_hciattach |grep -v "grep" |wc -l`
        if [ ${ret} = 1 ]; then
            killall rtk_hciattach
            sleep 1
        fi
        insmod /lib/modules/hci_uart.ko
        /usr/bin/rtk_hciattach -n -s 115200 /dev/ttyS0 rtk_h5 &
}

if [[ ${bt_type} = "RTL8821CS" ]]; then
        rtk_attach
        exit 0
fi

if [[ x$bt_type != x ]]; then
        bt_firmware=$(grep ${bt_type} /usr/bin/bt_firmware.cfg | awk '{print $2}')
        if [[ x$bt_firmware != x ]]; then
                start-stop-daemon --start --oknodo --pidfile /var/run/hciattach.pid --background --startas \\
/usr/bin/brcm_patchram_plus1 -- --bd_addr_rand --enable_hci --no2bytes --use_baudrate_for_download \\
--tosleep  200000 --baudrate 1500000 --patchram ${bt_firmware} /dev/ttyS0
        fi
fi

exit 0

3.移植蓝牙的firmware文件到ubuntu的/lib/firmware/rtlbt/

firmware路径:https://download.csdn.net/download/danhu/33638907

external/rkwifibt/realtek/RTL8821CS/rtl8821c_fw
external/rkwifibt/realtek/RTL8821CS/rtl8821c_config
  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值