RTL8821CS移植过程记录

RK3308B+RTL8821CS移植

在rk3308b平台移植rtl8821cs,rlt8821cs是wifi+bt一体的模组,主要记录下移植过程中需要注意的地方

移植驱动

将rtl8821cs的驱动包复制到rk的SDK内,路径如下rockchip_rk3308b_sdk/kernel/drivers/net/wireless/rockchip_wlan/,并命名为rtl8821cs

修改Makefile文件

1、配置WIFI IC

这次移植的是rtl8821cs,所以做如下配置

CONFIG_RTL8821C = y 其它设为n

2、配置 Interface

我采用的是SDIOI接口,所以做如下配置

CONFIG_SDIO_HCI = y 其它设为n

3、平台选择

rk3308b应该做如下配置

CONFIG_PLATFORM_ARM_RK3188 = y 其它设为n

4、休眠唤醒

如果有休眠唤醒的功能,需要做如下配置

CONFIG_WOWLAN = y
CONFIG_GPIO_WAKEUP = y

5、交叉编译器选择

需要修改ARCH、CROSS_COMPILE、KSRC变量,要么直接注释掉,使用外部的值,要不就写自己的交叉编译器的路径

6、其它配置

rk平台需要注释掉下面的配置

#EXTRA_CFLAGS += -DRTW_SUPPORT_PLATFORM_SHUTDOWN

注意:5、6是在ifeq ($(CONFIG_PLATFORM_ARM_RK3188), y)下修改,注意平台,别修改到其它平台上了

DTS修改

主要确认下wireless-bluetooth、wireless-wlan节点信息

wireless-bluetooth {
     
		compatible = "bluetooth-platdata";
		uart_rts_gpios = <&gpio4 RK_PA7 GPIO_ACTIVE_LOW>;
		pinctrl-names = "default", "rts_gpio";
		pinctrl-0 = <&uart4_rts>;
		pinctrl-1 = <&uart4_rts_gpio>;
		BT,power_gpio = <&gpio3 RK_PB0 GPIO_ACTIVE_HIGH>; // BT_REG_ON
		BT,wake_host_irq = <&gpio2 RK_PB5 GPIO_ACTIVE_HIGH>; // BT_WAKE_HOST
		status = "okay";

	};

BT,power_gpio对应蓝牙的使能脚,BT,wake_host_irq是蓝牙唤醒脚

wireless-wlan {
     
		compatible = "wlan-platdata";
		rockchip,grf = <&grf>;
		pinctrl-names = "default";
		pinctrl-0 = <&wifi_wake_host>;
		wifi_chip_type = "rtl8821cs";
		WIFI,host_wake_irq = <&gpio0 RK_PA0 GPIO_ACTIVE_HIGH>;
		status = "okay";
	};

WIFI,host_wake_irq对应WiFi唤醒脚

&uart4 {
     
	pinctrl-names = "default";
	pinctrl-0 = <&uart4_xfer &uart4_cts>;
    status = "okay";
};

&uart4_xfer 、&uart4_cts分别为uart4的TX、RX和cts脚。注意RK不同的平台cts的叫法不一样,要区分

内核配置文件修改

内核配置文件没什么特别需要注意的地方,这里主要罗列下蓝牙相关的配置选项

CONFIG_BT=y
CONFIG_BT_RFCOMM=y
ONFIG_BT_RFCOMM_TTY=y
CONFIG_BT_BNEP=y
CONFIG_BT_BNEP_MC_FILTER=y
CONFIG_BT_BNEP_PROTO_FILTER=y
CONFIG_BT_HIDP=y

特别注意,因为realtek不兼容内核的hci_uart,所以不要编译内核的hci_uart,在buildroot配置的时候选择BR2_PACKAGE_RKWIFIBT_RTL8821CS将会编译出realtek版的hci_uart模块

Buildroot配置

关于buildroot配置主要罗列下关于蓝牙的应用,使用的是Bluez5蓝牙协议栈

#BR2_PACKAGE_BLUEZ_ALSA=y
BR2_PACKAGE_BLUEZ5_UTILS=y
#BR2_PACKAGE_BLUEZ5_UTILS_OBEX=y
#BR2_PACKAGE_BLUEZ5_UTILS_CLIENT=y
#BR2_PACKAGE_BLUEZ5_UTILS_EXPERIMENTAL=y
BR2_PACKAGE_DBUS=y
BR2_PACKAGE_DBUS_GLIB=y
#BR2_PACKAGE_DBUS_CPP=y
#BR2_PACKAGE_DBUS_TRIGGERD=y
#BR2_PACKAGE_BLUEZ5_UTILS_GATTTOOL=y

前面带“#”的不是必选,可以选择性添加特定功能,另外需要添加RTL8821CS依赖的应用,路径在如下:

Prompt: RTL8821CS                                                                                                                                                              
     Location:                                                                                                                                                                    
       -> Target packages                                                                                                                                                         
         -> rockchip BSP packages (BR2_PACKAGE_ROCKCHIP [=y])                                                                                                                     
           -> rkwifibt (BR2_PACKAGE_RKWIFIBT [=y])                                                                                                                                
   (1)       -> wifi chip support ( [=y])                                                                                                                                 
     Defined at package/rockchip/rkwifibt/Config.in:33                                                                                                                            
     Depends on:                             

BR2_PACKAGE_RKWIFIBT_RTL8821CS=y

功能验证

WiFi功能验证

将驱动挂载后,使用ifconfig -a看看有没有相应的节点,如果有的话进行下一步功能的验证

[root@eufy /]$ ifconfig -a
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:30984 errors:0 dropped:0 overruns:0 frame:0
          TX packets:30984 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1 
          RX bytes:1582688 (1.5 MiB)  TX bytes:1582688 (1.5 MiB)

p2p0      Link encap:Ethernet  HWaddr 22:32:33:38:32:72  
          BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

wlan0     Link encap:Ethernet  HWaddr 20:32:33:38:32:72  
          BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

手动修改 wpa_supplicant.conf 文件进行联网验证功能

1、启动 wpa_supplicant:wpa_supplicant -B -i wlan0 -c /data/cfg/wpa_supplicant.conf

2、修改wpa_supplicant.conf文件

/ # vi /data/cfg/wpa_supplicant.conf ctrl_interface=/var/run/wpa_supplicant ap_scan=1 
ctrl_interface=/var/run/wpa_supplicant
ap_scan=1
network={
	scan_ssid=1
	ssid="WFW"  
	psk="12345678"
	key_mgmt=WPA-PSK
}

设置好文件后就重新读,wpa_cli reconfigure,并重新连接wpa_cli reconnect

最后ping下www.baidu.com看能否收到回复

蓝牙功能验证

蓝牙上层操作是基于bluez的各种工具,主要有hcitool、hciconfig 工具,简单介绍下

hciconfig工具

#要带上具体的蓝牙节点,我这以hci0节点为例
hciconfig hci0 up    #激活蓝牙
hciconfig hci0 down  #关闭蓝牙
hciconfig hci0 name XXX #修改蓝牙名
hciconfig hci0 class 0xXXXXXX 修改蓝牙类型
hciconfig hci0 piscan #允许被其它蓝牙扫描到,是PSCAN ISCAN组合
hciconfig hci0 leadv #开启ble蓝牙广播

hcitool工具

因为将该设备作为从设备,所以用到的也就是扫描命令,如下

hcitool scan # 扫描经典蓝牙
hcitool lescan # 扫描ble设备

启动蓝牙

mkdir -p /var/run/dbus/
dbus-daemon --system                              	#启动Dbus进程
echo 0 > /sys/class/rfkill/rfkill0/state		   #蓝牙使能脚下电
sleep 1
echo 1 > /sys/class/rfkill/rfkill0/state		   #蓝牙使能脚上电电
insmod /usr/lib/modules/hci_uart.ko				   #加载hci_uart.ko模块
sleep 1
rtk_hciattach -n -s 115200 /dev/ttyS4 rtk_h5 &		#下载蓝牙固件
sleep 3
/usr/libexec/bluetooth/bluetoothd --compat -n &		#启动蓝牙协议栈
sleep 3
hciconfig hci0 up								  #激活蓝牙
hciconfig hci0 piscan							  #允许被扫描

几点说明

1、如果启动Dbus失败,那么在passwd添加如下内容

messagebus:x:500:500::/home/messagebus:/bin/sh
dbus:x:1000:1000:DBus messagebus user:/var/run/dbus:/bin/false

2、rtk_hciattach其实就是基于bluez内的hciattach重写的,目的就是下载蓝牙的固件和相关配置,像紫光展锐的uwe5621也是需要重写hciatttach去下载相关固件的

3、如果上述命令都执行成功的话,那么使用hciconfig命令是可以查看到蓝牙节点信息的,而且用其它的蓝牙设备也是能够搜索到的

[root@eufy /oem]$ hciconfig -a
hci0:	Type: Primary  Bus: UART
	BD Address: C3:A5:FC:D5:22:22  ACL MTU: 1021:8  SCO MTU: 255:12
	UP RUNNING PSCAN ISCAN 
	RX bytes:2351 acl:0 sco:0 events:70 errors:0
	TX bytes:2260 acl:0 sco:0 commands:70 errors:0
	Features: 0xff 0xff 0xff 0xfe 0xdb 0xfd 0x7b 0x87
	Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3 
	Link policy: RSWITCH HOLD SNIFF PARK 
	Link mode: SLAVE ACCEPT 
[ 2898.392027] Bluetooth: hu ffffffc00e4c4180 retransmitting 1 pkts
	Name: 'BlueZ 5.50'
	Class: 0x000000
	Service Classes: Unspecified
	Device Class: Miscellaneous, 
	HCI Version: 4.1 (0x7)  Revision: 0xaa6b
	LMP Version: 4.1 (0x7)  Subversion: 0x274f
	Manufacturer: Realtek Semiconductor Corporation (93)

开启ble服务

执行如下命令开启ble服务

my_ble &			  #基于bluez5的/tool/gatt-service.c编译的应用
hciconfig hci0 leadv   #开启ble广播

创建了服务,可以使用ble蓝牙调试工具去扫描服务和进行简单的通讯检验,我使用的是IOS的nRF Connect工具

你可能感兴趣的:(WiFi+BT移植,wifi,linux,嵌入式)