概述
RK3399适配海华的AW-CM358SM模块(2.4G/5G WiFi,蓝牙5.0)以替代AP6256。
该模块的部分特性:
WIFI:
Backward compatibility with legacy 802.11 ac/ n/a/g/b technology.
Bluetooth:
Fully qualified Bluetooth BT4.2 and support Bluetooth 5.
内核配置
kernel/arch/arm64/boot/dts/rockchip/OK3399-C.dts
kernel/arch/arm64/configs/rockchip_linux_defconfig
kernel/drivers/net/wireless/rockchip_wlan/Kconfig
kernel/drivers/net/wireless/rockchip_wlan/Makefile
kernel/drivers/net/wireless/rockchip_wlan/wlan_src/
kernel/drivers/net/wireless/rockchip_wlan/muart_src/
设备树sdio总线的配置:
sdio_pwrseq: sdio-pwrseq {
compatible = "mmc-pwrseq-simple";
clocks = <&ap6256_lpo_clk>;
clock-names = "ext_clock";
pinctrl-names = "default";
pinctrl-0 = <&wifi_enable_h>;
/*
* On the module itself this is one of these (depending
* on the actual card populated):
* - SDIO_RESET_L_WL_REG_ON
* - PDN (power down when low)
*/
reset-gpios = <&gpio4 RK_PD1 GPIO_ACTIVE_LOW>;
};
&sdio0 {
clock-frequency = <50000000>;
clock-freq-min-max = <200000 50000000>;
supports-sdio;
bus-width = <4>;
disable-wp;
cap-sd-highspeed;
cap-sdio-irq;
keep-power-in-suspend;
mmc-pwrseq = <&sdio_pwrseq>;
non-removable;
num-slots = <1>;
pinctrl-names = "default";
pinctrl-0 = <&sdio0_bus4 &sdio0_cmd &sdio0_clk>;
sd-uhs-sdr104;
status = "okay";
};
查看sdio总线下WiFi网卡挂载的设备节点
[root@rk3399:/]# ls /sys/bus/sdio/devices/
mmc0:0001:1
[root@rk3399:/]# ls /sys/bus/sdio/devices/mmc0:0001:1/
class device modalias power subsystem uevent vendor
sdio总线设备挂载需要注意的事项:
1、模块的上电时序
VDDIO/PDn
上电时序不对会导致sdio总线不能识别到WiFi模块,反过来如果sdio总线上没有设备生成,就可以推断是模块上电逻辑有问题,就可以针对性的去测量对应引脚的状态是否与手册要求的一致,比如pin12是否被上拉,VBAT、VDDIO引脚是否有对应的电平。
驱动模块加载
以单独编译驱动模块加载的方式进行测试,便于驱动的调试。模块加载的过程,通过查看打印信息判断模块加载是否成功,有无报错。加载完成以后通过判断网络接口功能是否正常判断模块驱动是否运行正常。
加载wifi驱动、固件
[root@rk3399:/]# insmod /data/mlan.ko
[root@rk3399:/]# insmod /data/sd8xxx.ko cal_data_cfg=none fw_name=nxp/sduart8987_combo.bin sta_name=wlan cfg80211_wext=12
[ 1464.837431] wlan: Enable TX SG mode
[ 1464.837862] wlan: Enable RX SG mode
[ 1465.293412] Wlan: FW download over, firmwarelen=589648 downloaded 589648
[ 1466.225214] fw_cap_info=0x181cbf03, dev_cap_mask=0xffffffff
[ 1466.225733] max_p2p_conn = 8, max_sta_conn = 8
[ 1466.280973] IPv6: ADDRCONF(NETDEV_UP): wlan0: link is not ready
[ 1466.301868] IPv6: ADDRCONF(NETDEV_UP): uap0: link is not ready
[ 1466.319623] IPv6: ADDRCONF(NETDEV_UP): wfd0: link is not ready
[root@rk3399:/]# ifconfig
dummy0 Link encap:Ethernet HWaddr EE:EF:0E:B6:E4:45
inet6 addr: fe80::e949:3625:a397:3cf2/64 Scope:Link
UP BROADCAST RUNNING NOARP MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:30 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:9172 (8.9 KiB)
eth0 Link encap:Ethernet HWaddr 8E:81:A9:A9:BB:99
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:7 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:852 (852.0 B)
Interrupt:24
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:1019 errors:0 dropped:0 overruns:0 frame:0
TX packets:1019 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1
RX bytes:67677 (66.0 KiB) TX bytes:67677 (66.0 KiB)
uap0 Link encap:Ethernet HWaddr EC:2E:98:B4:E5:07
UP 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)
wfd0 Link encap:Ethernet HWaddr EE:2E:98:B4:E4:07
UP 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 EC:2E:98:B4:E4:07
UP 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)
加载蓝牙驱动
[root@rk3399:/]# insmod /system/lib/modules/hci_uart.ko
[ 1794.962487] HCI UART driver ver 2.2-M2614100
[ 1794.962918] HCI H4 protocol initialized
[ 1794.963329] HCILL protocol initialized
功能验证
WiFi STA功能
WiFi STA功能使用wpa_supplicant工具配置wlan0接口进行验证。
[root@rk3399:/]# wifi.sh -i wlan0 -s "forlinx" -p fl03123102650
WiFi AP功能
AP功能对应的接口为uap0,使用hostapd创建热点。
vi /etc/hostapd.conf
interface=uap0
vi /etc/dnsmasq.conf
user=root
interface=uap0
dhcp-range=192.168.2.100,192.168.2.150,12h
vi /usr/bin/hostapd.sh
#!/bin/sh
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
ifconfig uap0 up
ifconfig uap0 192.168.2.1
hostapd /etc/hostapd1.conf &
该模块有独立的wlan0、uap0两个节点,所以可以实现使用wlan0节点作为路由转发,uap0设置热点的方式来使用:
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
蓝牙
使用hci工具进行配置,使用bluetoothctl、obexctl工具进行测试
hciattach /dev/ttyS0 any 115200 flow
hciconfig hci0 up
hciconfig -a
hcitool scan
bluetoothctl
obexctl.sh
相关内容
1、WFD
WiFI Display(WFD)是WiFI Alliance 开发出的一种规范,使多媒体设备之间建立和维持一个基于WiFi的连接,并且利用这个连接推进视频/音频的在目标设备的呈现播放。
参考链接:
WFD简介和连接过程
https://www.cnblogs.com/daxingege/p/7137004.html
2、hci_uart
参考链接:
HCI和UART的结构与原理概述及计HCI-UART的设计实现方法
http://www.elecfans.com/tongxin/rf/20171211600434_a.html
蓝牙调试工具hcitool的使用实例
https://blog.csdn.net/kangear/article/details/37961769
HCI,即主机控制接口,属于蓝牙协议栈的一部分。
蓝牙规范包含了一个符合标准的接口定义(主机控制器接口),它适用于蓝牙通讯模块的硬件部分。此定义描述了位于HCI驱动程序(主机的一部分,也即蓝牙通讯模块的使用者)和主机控制器固件(蓝牙通讯模块本身的一部分)之间的接口。
HCI三种类型接口:USB、RS-232和UART。
HCI 传输层的比较
HCI 层位于蓝牙高层协议和低层协议之间,其目的是实现主机设备与蓝牙模块之间的互操作,即HCI 是蓝牙主机与主机控制器间软硬件接口。HCI 为蓝牙硬件中基带控制器和链接管理器提供了命令接口,从 而实现对硬件状态注册器和控制寄存器的访问,提供了对蓝牙基带的统一访问模式。 目前,HCI 的传输层主要有三种:USB,RS-232,UART。此外,还有一种PC 卡传输层,其没有定义在 蓝牙标准中,而是在蓝牙SIG 于1999 年8 月发表的蓝牙PC 卡传输层1.0 版白皮书中描述的。蓝牙没有规 定PC 卡传输层实现的具体细节,而是要求制造商提供传输驱动程序,以配合主机上的HCI 驱动程序[5]。不 同传输层对HCI 事件处理没有影响。
(1)USB 传输层在蓝牙硬件上使用USB 硬件接口(该硬件接口有两种嵌入方式:一种是作为USB 加/ 解密芯片,另一种是集成到PC 机主板上)[6]。这一种类编码要求不管使用哪一厂商生产的设备,都能加载 合适的驱动程序栈;同时它还保证了通过控制终端的HCI 指令和USB 指令有所区别。其缺点是软件协议复 杂,软件开销巨大。
(2)RS-232 传输层:通过位于主机和主控制器之间的物理RS-232 接口实现。事件包和数据包通过该 层,但该层并不对它们进行解码。该传输层支持的是主机控制器和不同实体中的主机的通信情况,通信距 离较远,传输层特别规定了电气特性,并采用了更为精细的链路协议以应对较高的线路误码率,但在硬件 上需要增加电平转换电路。
(3)UART 传输层跟RS-232 传输层类似,也是采用一个UART 的串行通信方式在主控制器与主机之间 进行数据传输。应用环境主要是针对主控制器和主机位于同一个电路板上,传输层假定UART 通信无线性 错误。与其它的相比,UART 传输层方式比较灵活,其应用环境决定其连接错误相对较少,可以采用简单的 复位恢复机制实现失步时的复步。由于主机和主控制器都处于同一块电路板上,因而传输层不需要规定电 气信号,可以直接采用TTL、LV-CMOS 等IC 端电压,应用较多。同时,UART 传输层避开了RS-232 传输层 所要求的较繁琐的协商和同步机制。UART 性能和数据吞吐率水平与USB 接口相当,而传输协议却较为简单, 减少了软件开销,是一种更为经济高效的全硬件解决方案。
最后
以上就是酷酷小白菜为你收集整理的WiFi接口(1)——模块适配(AW-CM358)内核配置驱动模块加载功能验证相关内容的全部内容,希望文章能够帮你解决WiFi接口(1)——模块适配(AW-CM358)内核配置驱动模块加载功能验证相关内容所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复