ILD

IPQ5018 QSDK spf 11.5 编译
作者:Yuan Jianpeng 邮箱:yuanjianpeng@xiaomi.com
发布时间:2023-1-3 站点:Inside Linux Development

qsdk分成两部分代码,开源的部分在codeaurora,私有部分在高通chipcode。

目前SPF支持IPQ8074/6018/8064/4019/5018系列芯片。


1 下载chip code

需要有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。

2 下载codeaurora QSDK

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


3 合并代码,生成qsdk

先看spf-11-5的代码结构,用浏览器打开代码主目录下的about.html,里面显示了哪个目录属于哪个机型。


总结如下面这个表格

类型目录机型
TrustZone images
TZ.AK.1.0IPQ806x
TZ.BF.2.7IPQ401x
TZ.BF.4.0.8IPQ807x
TZ.WNS.4.0IPQ60xx
TZ.WNS.5.1IPQ50xx
Boot images
BOOT.AK.1.0IPQ806x
BOOT.BF.3.1.1IPQ401x
BOOT.BF.3.3.1IPQ807x
BOOT.BF.3.3.1.1IPQ50xx
BOOT.XF.0.3nIPQ60xx
RPM images
RPM.AK.1.0IPQ806x
RPM.BF.2.4.1

IPQ807

xIPQ806x

BTFW imagesBTFW.MAPLE.1.0.0IPQ5018.ILQ.11.5.r1
BTFW.MAPLE.1.0.1IPQ50xx
机型对应的脚本工具等IPQ4019.ILQ.11.5
IPQ5018.ILQ.11.5
IPQ6018.ILQ.11.5
IPQ8064.ILQ.11.5
IPQ8074.ILQ.11.5
BINCNSS.PS.3.164019/5018/6018/8064/8074
SRC-QSDK-BaseNHSS.QSDK.11.54019/5018/6018/8064/8074
BINNSS.FW.11.55018/6018/8064/8074
BIN-CNSS-WiFi-FWWLAN.BL.3.164019/5018/6018/8064/8074
BINWLAN.HK.2.65018/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是最终产物。


4 编译

生成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编译失败。前者是编译错误,后者是缺失源码,修改配置不编译这两个包。


5 编译64位

$ 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就可以了。


6 烧录、运行image

编译产物在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


7 运行64位image

进入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/


附件

Copyright © linuxdev.cc 2017-2024. Some Rights Reserved.