在rk3308b平台移植rtl8821cs,rlt8821cs是wifi+bt一体的模组,主要记录下移植过程中需要注意的地方
将rtl8821cs的驱动包复制到rk的SDK内,路径如下rockchip_rk3308b_sdk/kernel/drivers/net/wireless/rockchip_wlan/,并命名为rtl8821cs
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)下修改,注意平台,别修改到其它平台上了
主要确认下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配置主要罗列下关于蓝牙的应用,使用的是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
将驱动挂载后,使用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工具