目录
WIFI移植
蓝牙修改
因为RK3568支持RTL8821CS模组,因此从RK3568移植RTL8821CS驱动
移植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.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 */
拷贝编译生成的8821cs.ko到ubuntu的/lib/modules/目录
修改/etc/rc.local
添加insmod /lib/modules/8821cs.ko
内核修改
CONFIG_BT_HCIUART=n
1.2 编译realtek的蓝牙驱动(编译buildroot的时候会生成hci_uart.ko)
external/rkwifibt/realtek/rtk_hciattach/
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