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/shspf=qca-networking-2021-spf-11-5_qca_oemaurora=code_aurora_11.5qsdk=qsdk-11.5tmp=tmpgen_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_qsdkgen_spf_qsdkmerge | 
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/bashcfg=ubinize-ipq50xx.cfgbin=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/