qsdk分成两部分代码,开源的部分在codeaurora,私有部分在高通chipcode。
目前SPF支持IPQ8074/6018/8064/4019/5018系列芯片。
需要有chip code的下载权限。https://chipcode.qti.qualcomm.com。
进入qca-networking-2021-spf-11-5_qca_oem仓库,选择release tag r11.5_00002.1
可以克隆整个仓库,也可以克隆单个release,也可以直接下载gzip格式的release压缩包。这里选择克隆单个relase,克隆完毕后,删除.git。
codeaurora用google repo维护,因此需要知道manifest。根据高通的release notes文档。
manifest 文件为caf_AU_LINUX_QSDK_NHSS.QSDK.11.5_TARGET_ALL.11.5.0.7762.7846.xml
使用repo下载:
$ repo init -u git://codeaurora.org/quic/qsdk/releases/manifest/qstak -b release -m $manitest
$ repo sync -j8 --no-tags -qc
先看spf-11-5的代码结构,用浏览器打开代码主目录下的about.html,里面显示了哪个目录属于哪个机型。
总结如下面这个表格
类型 | 目录 | 机型 |
TrustZone images | TZ.AK.1.0 | IPQ806x |
TZ.BF.2.7 | IPQ401x | |
TZ.BF.4.0.8 | IPQ807x | |
TZ.WNS.4.0 | IPQ60xx | |
TZ.WNS.5.1 | IPQ50xx | |
Boot images | BOOT.AK.1.0 | IPQ806x |
BOOT.BF.3.1.1 | IPQ401x | |
BOOT.BF.3.3.1 | IPQ807x | |
BOOT.BF.3.3.1.1 | IPQ50xx | |
BOOT.XF.0.3n | IPQ60xx | |
RPM images | RPM.AK.1.0 | IPQ806x |
RPM.BF.2.4.1 | IPQ807 xIPQ806x | |
BTFW images | BTFW.MAPLE.1.0.0 | IPQ5018.ILQ.11.5.r1 |
BTFW.MAPLE.1.0.1 | IPQ50xx | |
机型对应的脚本工具等 | IPQ4019.ILQ.11.5 | |
IPQ5018.ILQ.11.5 | ||
IPQ6018.ILQ.11.5 | ||
IPQ8064.ILQ.11.5 | ||
IPQ8074.ILQ.11.5 | ||
BIN | CNSS.PS.3.16 | 4019/5018/6018/8064/8074 |
SRC-QSDK-Base | NHSS.QSDK.11.5 | 4019/5018/6018/8064/8074 |
BIN | NSS.FW.11.5 | 5018/6018/8064/8074 |
BIN-CNSS-WiFi-FW | WLAN.BL.3.16 | 4019/5018/6018/8064/8074 |
BIN | WLAN.HK.2.6 | 5018/6018/8074 |
spf主要包含了wifi驱动等不开源的openwrt package格式的源码,以及wifi、有线firmware。
codeaurora的qsdk代码,就在qsdk目录下。它就是一个openwrt的代码。
使用下面的脚本从spf提取源码和bin文件生成openwrt结构体的代码,然后和codeaurora的qsdk目录合并生成最终的qsdk代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | #!/bin/sh spf=qca-networking-2021-spf-11-5_qca_oem aurora=code_aurora_11.5 qsdk=qsdk-11.5 tmp=tmp gen_aurora_qsdk () { local qsdk=$tmp /aurora-qsdk rm -fr $qsdk mkdir -p $qsdk cp -a $aurora /qsdk $qsdk find $qsdk -name .git | xargs rm -fr } gen_spf_qsdk () { local qsdk=$tmp /spf-qsdk rm -fr $qsdk mkdir -p $qsdk /dl # source code local dir =$spf /NHSS .QSDK.11.5 /apss_proc/out/proprietary cp -rf $ dir /Wifi/qsdk-qca-art/ * $qsdk/ cp -rf $ dir /Wifi/qsdk-qca-wifi/ * $qsdk/ cp -rf $ dir /Wifi/qsdk-qca-wlan/ * $qsdk/ cp -rf $ dir /Wifi/qsdk-ieee1905-security/ * $qsdk/ cp -rf $ dir /QSDK-Base/qsdk-qca-athdiag/ * $qsdk/ cp -rf $ dir /QSDK-Base/qca-lib/ * $qsdk/ cp -rf $ dir /QSDK-Base/fw-qca-stats/ * $qsdk/ cp -rf $ dir /QSDK-Base/meta-tools/ * $qsdk/ cp -rf $ dir /QSDK-Base/common-tools/ * $qsdk/ cp -rf $ dir /QSDK-Base/qsdk-qca-nss/ * $qsdk/ cp -rf $ dir /QSDK-Base/qca-mcs-apps/ * $qsdk/ cp -rf $ dir /QSDK-Base/qca-nss-userspace/ * $qsdk/ cp -rf $ dir /QSDK-Base/qca-time-services/ * $qsdk/ cp -rf $ dir /QSDK-Base/qca-qmi-framework/ * $qsdk/ cp -rf $ dir /QSDK-Base/gpio-debug/ * $qsdk/ cp -rf $ dir /QSDK-Base/qca-diag/ * $qsdk/ cp -rf $ dir /QSDK-Base/athtestcmd/ * $qsdk/ cp -rf $ dir /QSDK-Base/btdaemon/ * $qsdk/ cp -rf $ dir /QSDK-Base/minidump/ * $qsdk/ tar xf $ dir /QSDK-Base/qca-IOT/qca-IOT . tar .bz2 -C $qsdk/ cp -rf $ dir /QSDK-Base/qca-cnss-daemon/ * $qsdk/ sed -i '/QCAHKSWPL_SILICONZ/c\PKG_VERSION:=WLAN.HK.2.6-02385-QCAHKSWPL_SILICONZ-1' $qsdk /qca/feeds/qca_hk/net/qca-hk/Makefile cp -rf $ dir /BLUETOPIA/qca-bluetopia/ * $qsdk/ cp -rf $ dir /RBIN-AFCAgent/qca-afc-bin/ * $qsdk/ # binary cp -rf $spf /WLAN .HK.2.6 /wlan_proc/src/components/QCA8074_v1 .0 /qca-wifi-fw-src-component-cmn- * $qsdk /dl cp -rf $spf /WLAN .HK.2.6 /wlan_proc/pkg/wlan_proc/bin/QCA8074_v1 .0 /qca-wifi-fw-QCA8074_v1 .0* $qsdk /dl tar xf $spf /WLAN .BL.3.16 /cnss_proc/src/components/qca-wifi-fw-src-component-cmn-WLAN .BL.*.tgz -C $qsdk /dl tar xf $spf /WLAN .BL.3.16 /cnss_proc/src/components/qca-wifi-fw-src-component-halphy_tools-WLAN .BL.*.tgz -C $qsdk /dl cp -rf $spf /WLAN .BL.3.16 /cnss_proc/src/components/ * $qsdk /dl cp -rf $spf /WLAN .BL.3.16 /cnss_proc/bin/QCA9888/hw .2/* $qsdk /dl cp -rf $spf /WLAN .BL.3.16 /cnss_proc/bin/AR900B/hw .2/* $qsdk /dl cp -rf $spf /WLAN .BL.3.16 /cnss_proc/bin/QCA9984/hw .1/* $qsdk /dl cp -rf $spf /WLAN .BL.3.16 /cnss_proc/bin/IPQ4019/hw .1/* $qsdk /dl cp -rf $spf /CNSS .PS.3.16 /qca-wifi-fw-AR988 * $qsdk /dl cp -rf $spf /NSS .FW.11.5 /nss_proc/out/proprietary/ * $qsdk /dl } merge () { rm -fr $qsdk cp -a $tmp /aurora-qsdk $qsdk cp -fr $tmp /spf-qsdk/ * $qsdk/ } gen_aurora_qsdk gen_spf_qsdk merge |
gen_aurora_qsdk函数将code_aurora_11.5/qsdk拷贝到tmp/aurora-qsdk。
gen_spf_qsdk函数从qca-networking-2021-spf-11-5_qca_oem提取文件到tmp/spf-qsdk。
merge将tmp/aurora-qsdk和tmp/spf-qsdk合并到qsdk-11.5。qsdk-11.5是最终产物。
生成config文件
$ cp qca/configs/qsdk/ipq_256.config .config
$ sed -i "s/TARGET_ipq_ipq807x/TARGET_ipq_ipq50xx/g" .config
然后就是正常的openwrt编译过程了
$ ./scripts/feeds update -a
$ ./scripts/feeds install -a -f
$ make defconfig
$ make -j12
在ubuntu上编译出现了tools和toolchain的编译失败,合入相关patch可以解决。
在hyper-v虚拟机中,编译toolchain的时候一开并行编译,就卡死。不开并行编译没问题。
编译package/feeds/afc/qti-mfg-provision/compile失败:
拷贝源码失败,没有源码。但是发布了ipk,解压prebuilt/ipq50xx/ipq_256/qti-mfg-provision_1.0-1_ipq.ipk,得到编译产物libprovision.so,拷贝到package/feeds/afc/qti-mfg-provision/,修改Makefile直接使用这个so。
编译package/feeds/athtestcmd/athtestcmd/compile失败:
for(int itr = 0; itr < numSeg; itr++)
编译package/feeds/bootloader/uboot-qca/compile失败:
也是for(int i
后经分析发现,上面这两个失败,是由于没有启动gcc5.2,而是用gcc 4.8导致的。ipq_256.config .config里面是5.2,执行make defconfig后,变成了4.8。分析是toolchain的Config.in也不对,导致不是使用gcc 5.2,修改toochain/gcc/Config.in。使用gcc 5.2。
又碰到perf和bluetopia编译失败。前者是编译错误,后者是缺失源码,修改配置不编译这两个包。
$ cp qca/configs/qsdk/ipq_premium.config .config
$ sed -i "s/TARGET_ipq_ipq806x/TARGET_ipq_ipq50xx_64/g" .config
$ mv prebuilt/ipq50xx_64/ipq_premium/* prebuilt/ipq50xx_64/
编译提示缺少libprovision.so。然后解压64位的prebuilt/ipq50xx_64/qti-mfg-provision_1.0-1_ipq.ipk。
跟4中一样。重编qti-mfg-provision,发现没有拷贝。原来是高通添加了prebuilt机制,如下:
include/package.mk
include/package-ipkg-prebuilt.mk
有ipk就不会编译了。删除掉prebuilt/ipq50xx_64/qti-mfg-provision_1.0-1_ipq.ipk就可以了。
编译产物在bin/ipq下面,进入uboot运行initramfs版本:
IPQ5018# tftpboot openwrt-ipq-ipq50xx-qcom-ipq5018-mp02.1-fit-uImage-initramfs.itb
IPQ5018# bootm
启动发现,没有无线fw,fw存放在一个squashfs镜像中。在qsdk的demo软件,fw是放在nand的一个分区的。
那个镜像文件可以直接写入分区mount,这里我们用unsquashfs解压。
qca-networking-2021-spf-11-5_qca_oem/WLAN.HK.2.6/wlan_proc/
build/ms/bin/5018.wlanfw2.map_spr_spr_eval_cs/wifi_fw_ipq5018_qcn6122cs_squashfs.img
然后修改qca/feeds/qca_hk/net/qca-hk,将fw和bdf直接打包到rootfs中。
启动后无nand分区。需要更新dts。使用RA81的dts。启动仍然有问题
cnss[2]: ERR: could not get mem_region_phandle
下面的dts被覆盖:
mem-region = <&q6_qcn6122_data1>;
内存情况:
Memory: 167016K/191488K available
(4932K kernel code, 282K rwdata, 1708K rodata, 14336K init, 367K bss, 24472K reserved)
# free
total used free shared buff/cache available
Mem: 181352 79076 49292 2544 52984 96512
进入uboot
IPQ5018# tftpboot openwrt-ipq-ipq50xx_64-qcom-ipq5018-mp02.1-fit-uImage-initramfs.itb
IPQ5018# bootm
Starting kernel ...
Jumping to AARCH64 kernel via monitor
内存严重不够
Memory: 137532K/183296K available
(5488K kernel code, 599K rwdata, 2348K rodata, 19136K init, 523K bss, 45764K reserved)
# free
total used free shared buff/cache available
Mem: 156712 68004 4480 1928 84228 86740
rootfs放nand分区:
ubi.mtd=rootfs root=mtd:ubi_rootfs rootfstype=squashfs rootwait uart_en=1 swiotlb=1
直接打包一个ubi镜像,和ax3000一样。
1 2 3 4 5 6 7 8 9 10 11 | #!/bin/bash cfg=ubinize-ipq50xx.cfg bin=ipq50xx.ubi [ "$1" = 64 ] && { cfg=ubinize-ipq50xx_64.cfg bin=ipq50xx_64.ubi } ubinize -o $bin --min-io-size=2048 --peb-size=128KiB --sub-page-size=2048 $cfg |
文件:
ipq50xx_64.ubi
ipq50xx.ubi
mkimg.sh
openwrt-ipq-ipq50xx_64-qcom-ipq5018-mp02.1-fit-uImage.itb
openwrt-ipq-ipq50xx_64-squashfs-root.img
openwrt-ipq-ipq50xx-qcom-ipq5018-mp02.1-fit-uImage.itb
openwrt-ipq-ipq50xx-squashfs-root.img
ubinize-ipq50xx_64.cfg
ubinize-ipq50xx.cfg
ubi打包配置文件
$ cat ubinize-ipq50xx_64.cfg
[kernel]
# Volume mode (other option is static)
mode=ubi
# Source image
image=openwrt-ipq-ipq50xx_64-qcom-ipq5018-mp02.1-fit-uImage.itb
# Volume ID in UBI image
vol_id=0
# Allow for dynamic resize
vol_type=dynamic
# Volume name
vol_name=kernel
[rootfs]
# Volume mode (other option is static)
mode=ubi
# Source image
image=openwrt-ipq-ipq50xx_64-squashfs-root.img
# Volume ID in UBI image
vol_id=1
# Allow for dynamic resize
vol_type=dynamic
# Volume name
vol_name=ubi_rootfs
烧录64位ipq50xx_64.ubi,后启动失败无配置文件,添加环境变量config_name=config@1
启动后64位还是内存不太够。
参考文档
80-19559-3_ab_qca_networking_2021.spf.11.5_cs_release_notes.pdf
https://www.codeaurora.org/projects/qsdk
https://github.com/robimarko/openwrt/