Avaota-A1 是韦东山搞得一个板子,总所周知,他们做得板子基本资料缺乏,乱七八糟得,不过基础外设肯定是通得,不然肯定会被骂死,所以常用得就不说了,基本能用.
首先准备二进制的固件文件,这个可以从官方的安卓镜像提取.
root@avaota-a1:/lib/firmware# tree
.
├── aic8800
│ ├── aic_userconfig.txt
│ ├── fmacfw_8800m_custmsg.bin
│ ├── fmacfw.bin
│ ├── fmacfw_rf.bin
│ ├── fw_adid.bin
│ ├── fw_adid_u03.bin
│ ├── fw_patch.bin
│ ├── fw_patch_table.bin
│ ├── fw_patch_table_u03.bin
│ ├── fw_patch_test.bin
│ └── fw_patch_u03.bin
├── aic8800d80
│ ├── aic_userconfig_8800d80.txt
│ ├── aic_userconfig_8800d80-Typ.txt
│ ├── fmacfw_8800d80.bin
│ ├── fmacfw_8800d80_u02.bin
│ ├── fmacfw_rf_8800d80.bin
│ ├── fmacfw_rf_8800d80_u02.bin
│ ├── fw_adid_8800d80.bin
│ ├── fw_adid_8800d80_u02.bin
│ ├── fw_patch_8800d80.bin
│ ├── fw_patch_8800d80_u02.bin
│ ├── fw_patch_table_8800d80.bin
│ ├── fw_patch_table_8800d80_u02.bin
│ ├── lmacfw_rf_8800d80.bin
│ └── lmacfw_rf_8800d80_u02.bin
├── aic8800dc
│ ├── aic_userconfig_8800dc.txt
│ ├── aic_userconfig_8800dw.txt
│ ├── fmacfw_calib_8800dc_h_u02.bin
│ ├── fmacfw_calib_8800dc_u02.bin
│ ├── fmacfw_patch_8800dc_h_u02.bin
│ ├── fmacfw_patch_8800dc_ipc_u02.bin
│ ├── fmacfw_patch_8800dc_u02.bin
│ ├── fmacfw_patch_tbl_8800dc_h_u02.bin
│ ├── fmacfw_patch_tbl_8800dc_ipc_u02.bin
│ ├── fmacfw_patch_tbl_8800dc_u02.bin
│ ├── fw_adid_8800dc_u02.bin
│ ├── fw_adid_8800dc_u02h.bin
│ ├── fw_patch_8800dc_u02.bin
│ ├── fw_patch_8800dc_u02h.bin
│ ├── fw_patch_table_8800dc_u02.bin
│ ├── fw_patch_table_8800dc_u02h.bin
│ └── lmacfw_rf_8800dc.bin
├── aic_userconfig.txt
├── fmacfw.bin
├── fmacfw_rf.bin
├── fmacfw_rf_usb.bin
├── fmacfw_usb.bin
├── fw_adid.bin
├── fw_adid_u03.bin
├── fw_patch.bin
├── fw_patch_table.bin
├── fw_patch_table_u03.bin
├── fw_patch_u03.bin
WiFi部分可以直接用hostapd建立软AP,也可以直接连接AP,这部分比较容易.
蓝牙就有点坑了,第一步就是他们提供的设备树也有问题的,我这里有已经改好的内核
https://github.com/nickfox-taterli/avaota-a1-linux
主要修改
&rfkill {
compatible = "allwinner,sunxi-rfkill";
chip_en;
power_en;
pinctrl-0;
pinctrl-names;
status = "okay";
/* wlan session */
wlan {
compatible = "allwinner,sunxi-wlan";
clocks;
clock-names;
wlan_power = "axp2202-aldo3", "axp2202-bldo1"; /* vcc-pl/vcc-pg/vcc-pm */
wlan_power_vol= <3300000>, <1800000>;
wlan_busnum = <0x1>;
wlan_regon = <&pio PG 13 GPIO_ACTIVE_HIGH>;
wlan_hostwake = <&pio PG 14 GPIO_ACTIVE_HIGH>;
wakeup-source;
};
/* bt session */
bt {
compatible = "allwinner,sunxi-bt";
clocks;
clock-names;
bt_power = "axp2202-aldo3", "axp2202-bldo1"; /* vcc-pl/vcc-pg/vcc-pm */
bt_power_vol = <3300000>, <1800000>;
bt_rst_n = <&pio PG 12 GPIO_ACTIVE_LOW>;
};
};
然后默认不会WAKE模块,所以模块也不会响应任何数据,查看代码bsp/drivers/net/wireless/aic8800/aic8800_btlpm/aic8800_btlpm.c
if (!has_lpm_enabled) {
BT_DBG("lpm disabled, direct set ext_wake to %c\n", b);
gpio_set_value(bsi->ext_wake, b != '0' ? bsi->ext_wake_assert : !bsi->ext_wake_assert);
return count;
}
所以需要写文件/proc/bluetooth/sleep/btwrite为1启动BT模块.
echo 1 > /proc/bluetooth/sleep/btwrite
btattach -B /dev/ttyAS1 -P h4 -S 1500000
hciconfig -a
只有wake了,才能看到HCI是OK的.
root@avaota-a1:/lib/firmware# hciconfig -a
hci0: Type: Primary Bus: UART
BD Address: F4:20:15:67:CA:FE ACL MTU: 1021:9 SCO MTU: 255:4
UP RUNNING
RX bytes:832 acl:0 sco:0 events:59 errors:0
TX bytes:3014 acl:0 sco:0 commands:59 errors:0
Features: 0xbf 0x2e 0x4d 0xfe 0xd8 0x3f 0x7b 0x87
Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV3
Link policy: RSWITCH SNIFF
Link mode: PERIPHERAL ACCEPT
Name: 'avaota-a1'
Class: 0x400000
Service Classes: Telephony
Device Class: Miscellaneous,
HCI Version: 5.4 (0xd) Revision: 0xb
LMP Version: 5.4 (0xd) Subversion: 0xb
Manufacturer: not assigned (2875)
每次写有点麻烦,可以写一个服务/etc/systemd/system/aic-btattach.service
[Unit]
Description=AIC8800 Bluetooth UART attach
After=systemd-modules-load.service
Requires=dev-ttyAS1.device
After=dev-ttyAS1.device
Before=bluetooth.service
[Service]
Type=simple
ExecStartPre=/bin/sh -c "[ -e /proc/bluetooth/sleep/btwrite ] && echo 1 > /proc/bluetooth/sleep/btwrite || true"
ExecStart=/usr/bin/btattach -B /dev/ttyAS1 -P h4 -S 1500000
Restart=on-failure
RestartSec=1
[Install]
WantedBy=multi-user.target
其他就是常规的蓝牙测试了,这里就不多说了,毕竟如果AI也能轻松解决的问题,我多写也没意义.