# fpsoc_sdk **Repository Path**: anlogic/sdk ## Basic Information - **Project Name**: fpsoc_sdk - **Description**: No description available - **Primary Language**: Unknown - **License**: GPL-2.0 - **Default Branch**: anlogic-linuxsdk - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 9 - **Forks**: 2 - **Created**: 2024-08-02 - **Last Updated**: 2025-09-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # fpsoc-sdk ## 1.OS支持说明 本SDK在以下环境中进行过编译测试: Ubuntu 18.04 Ubuntu 20.04 Ubuntu 22.04 Ubuntu 23.04 ## 2.编译步骤 1) 获取SDK 如果是以git方式下载SDK,则直接执行: ```git git clone xxxxx/sdk.git --recurse-submodules cd sdk git submodule update --init --recursive ``` 如果获取到的源代码为压缩包形式,则为SDK创建一个新的目录,并进入该目录: ```shell mkdir sdk cd sdk ``` 解压缩SDK软件包到当前目录: ```shell tar -xzvf sdk.tar.gz ``` SDK压缩包中并未包含工具链,相应工具链需要单独获取。 2) 如果是通过git方式下载的SDK源代码,并且源代码目录下已经存在toolchains/setup.sh脚本,则在编译sdk时会自动进行toolchain的setup,无需再进行工具链配置。 否则需要在SDK目录下创建toolchains目录,并确保: arm64 linux的编译器位于路径:"toolchains/aarch64-linux/bin/aarch64-linux-gnu-gcc"; arm64 baremetal的编译器位于路径:"toolchains/aarch64-bm/bin/aarch64-none-elf-gcc"; riscv64 linux的编译器位于路径:"toolchains/riscv64-linux/bin/riscv64-unknown-linux-gnu-gcc"; riscv64 baremetal的编译器位于路径:"toolchains/riscv64-bm/bin/riscv64-unknown-elf-gcc"。 3) 如果是首次编译,需要执行这两个命令安装编译环境所需的软件(针对ubuntu): ```shell sudo apt-get update sudo apt-get install make gcc g++ flex bison u-boot-tools liblz4-tool libncurses5-dev ``` 4) 执行下面的命令,选择您的芯片型号,例如"1. anlogic_dr1m90": ```shell source ./envsetup.sh ``` 5) 如果该SDK软件包只支持一个芯片型号时,将不会打印菜单供您选择,系统会直接使用该芯片型号。 6) 执行下面的命令,选择您所需的Board配置,例如"ad101v20_ad103v20-tf-openamp-rtlinux": ```shell ./build.sh lunch ``` 7) 执行下面的命令,编译固件: ```shell ./build.sh all ``` 编译生成的固件在"device/output/anlogic_dr1m90/image/"目录下;需要烧到flash的image文件在"device/output/anlogic_dr1m90/genimage/"目录下。 8) 如果需要编译32位用户空间系统,需要确保arm32 linux的编译器位于路径:"toolchains/aarch32-linux/bin/arm-linux-gnueabihf-gcc";并修改对应板级配置文件中的"ANLOGIC_BUILDROOT_DEFCONFIG",例如device/anlogic_dr1m90/BoardConfig-ad101v20_ad103v20-tf.mk,修改为: ``` export ANLOGIC_BUILDROOT_DEFCONFIG=anlogic_dr1m90_linux32_defconfig ``` 如果已经编译过64位系统,则需先运行`./build.sh cleanbuildroot`,然后按上面的步骤正常编译。 ## 3.更新PL bitstream并生成BOOT.bin固件 1) 执行下面的命令,选择您的芯片型号,例如"1. anlogic_dr1m90": ```shell source ./envsetup.sh ``` 2) 执行下面的命令,选择您所需的Board配置,例如"ad101v20_ad103v20-tf": ```shell ./build.sh lunch ``` 3) 将TD生成的bit文件保存到device/anlogic_dr1m90/bitfiles目录下,例如demo_20240820.bit 4) 打开Bootgen配置文件device/anlogic_dr1m90/bif/boot-apu-evb.bif,确保load pl段未被注释 5) 打开Board配置文件device/anlogic_dr1m90/BoardConfig-ad101v20_ad103v20-tf.mk,将变量"ANLOGIC_BIT_IMAGE"改成相应的bit名,例如: ```makefile export ANLOGIC_BIT_IMAGE=device/anlogic_dr1m90/bitfiles/demo_20240820.bit ``` 如采用hpf中的bitstream,则注释该变量,例如: ```makefile #export ANLOGIC_BIT_IMAGE=device/anlogic_dr1m90/bitfiles/demo_20240820.bit ``` 如果不想使用任何bitstream,则可以设置: ```makefile export ANLOGIC_BIT_IMAGE=NO ``` 6) 执行下面的命令,生成BOOT.bin: ```shell ./build.sh bootgen ``` 生成的BOOT.bin在device/output/anlogic_dr1m90/image/目录下。 ## 4.编译sd卡启动固件 1) 执行下面的命令,选择您的芯片型号,例如"1. anlogic_dr1m90": ```shell source ./envsetup.sh ``` 2) 执行下面的命令,选择您所需的Board配置,例如"ad101v20_ad103v20-tf": ```shell ./build.sh lunch ``` 3) 执行下面的命令,生成固件: ```shell ./build.sh all ``` 生成的固件在device/output/anlogic_dr1m90/image/目录下 4) 将sd卡格式化fat32,将image下固件复制进sd卡 5) 插入sd卡,系统启动 ## 5.编译spi nor flash 16MB启动固件 1) 执行下面的命令,选择您的芯片型号,例如"1. anlogic_dr1m90": ```shell source ./envsetup.sh ``` 2) 执行下面的命令,选择您所需的Board配置,例如"ad101v10-nor-16MB": ```shell ./build.sh lunch ``` 3) 执行下面的命令,生成镜像: ```shell ./build.sh all ``` 生成的镜像在device/output/anlogic_dr1m90/genimage/目录下。 4) 通过openocd将镜像烧录进nor flash,系统启动 flash默认布局如下: ```shell mtdparts=alspinor:4M(boot),128k(scr),128k(env),128k(dtb),7M(kernel),-(rootfs) 0x000000 - 0x400000 4M BOOT.bin 0x400000 - 0x420000 128K scr 0x420000 - 0x440000 128K env 0x440000 - 0x460000 128K dtb 0x460000 - 0xB60000 7M kernel 0xB60000 - rootfs ``` 如需调整flash布局,需要修改"BoardConfig-ad101v10-nor-16MB.mk"文件中ANLOGIC_UBCFG_MTDPARTS_DEFAULT和OFFSET选项,以及genimg_nor_16M.cfg配置文件。 ## 6.编译spi nor flash 32MB启动固件 1) 执行下面的命令,选择您的芯片型号,例如"1. anlogic_dr1m90": ```shell source ./envsetup.sh ``` 2) 执行下面的命令,选择您所需的Board配置,例如"ad101v20_ad103v20-nor-32MB": ```shell ./build.sh lunch ``` 3) 执行下面的命令,生成镜像: ```shell ./build.sh all ``` 生成的镜像在device/output/anlogic_dr1m90/genimage/目录下。 4) 通过openocd将镜像烧录进nor flash,系统启动 flash默认布局如下: ```shell mtdparts=alspinor:8M(boot),128k(scr),128k(env),128k(dtb),8M(kernel),-(rootfs) 0x000000 - 0x800000 8M BOOT.bin 0x800000 - 0x820000 128K scr 0x820000 - 0x840000 128K env 0x840000 - 0x860000 128K dtb 0x860000 - 0x1060000 8M kernel 0x1060000 - rootfs ``` ## 7.编译emmc fat启动固件 1) 执行下面的命令,选择您的芯片型号,例如"1. anlogic_dr1m90": ```shell source ./envsetup.sh ``` 2) 执行下面的命令,选择您所需的Board配置,例如"ad101v20_ad103v20-emmc1-fat": ```shell ./build.sh lunch ``` 3) 执行下面的命令,生成镜像: ```shell ./build.sh all ``` 生成的镜像在device/output/anlogic_dr1m90/genimage/目录下。 4) 通过openocd将镜像烧录进emmc,系统启动 emmc默认布局如下: ```shell 32k(分区表),32M(fat),128M(rootfs),-(usrfs) 0x000000 - 0x8000 32K 分区表信息 0x8000 - 0x2008000 32M BOOT.bin、dtb.bin、kernel.bin 0x2008000 - 0xA008000 128M rootfs(ext4) 0xA008000 - userfs(ext4) ``` ## 8.将自己的文件打包进rootfs 1) 将需要打包的文件放到一个目录中,目录内部的路径按照rootfs中期望的路径进行组织。 2) 在板级配置文件例如"BoardConfig-ad101v10-tf.mk"中配置ANLOGIC_EXTRA_ROOTFS_DIR变量,指向需要打包的目录。指定的路径需要是绝对路径。 3) 执行下面的命令,重新编译rootfs: ```shell ./build.sh buildroot ``` 4) 打包目录下的内容更新后,只需执行"./build.sh buildroot"即可,重新生成的rootfs会包含这些内容更新。 ## 9.linux下更新PL bit 1) 编写dts文件如下,例如文件名为test.dts。示例中的码流文件为led_cnt.bit,可以改成自己码流文件的名字。 ```shell /dts-v1/; /plugin/; / { fragment@0 { target-path = "/soc/base_fpga_region"; #address-cells = <0x2>; #size-cells = <0x2>; __overlay__ { #address-cells = <0x2>; #size-cells = <0x2>; firmware-name = "led_cnt.bit"; config-complete-timeout-us = <3000000000>; }; }; }; ``` 2) 运行如下命令,将会生成test.dtb文件: ```shell dtc -I dts -O dtb -o test.dtb test.dts ``` 如果没有dtc命令,则进行安装: ```shell sudo apt-get install device-tree-compiler ``` 3) 执行如下命令进行fpga配置 ```shell mkdir -p /lib/firmware cp -vf test.dtb /lib/firmware/ cp -vf led_cnt.bit /lib/firmware/ mount -t configfs none /sys/kernel/config mkdir /sys/kernel/config/device-tree/overlays/0 echo test.dtb > /sys/kernel/config/device-tree/overlays/0/path ``` 4) 如果需要重新配置,则需先执行如下命令,然后再执行步骤3) ```shell rmdir /sys/kernel/config/device-tree/overlays/0 ``` 5) 如需对bit文件进行加密验签等,则需要制作一份bif文件,该bif文件只包括bit文件。加密验签的key必须和生成BOOT.bin时使用的key一致。然后运行下面的命令,生成加密或者签名后的bit文件: ```shell ./build.sh albg xxxx.bif ``` 之后,再按前面的步骤进行PL bit下载。 ## 10.linux下解析hpf生成fsbl、并替换bitfile用于生成BOOT.bin 1) 以dr1m90为例,将hpf文件保存到device/anlogic_dr1m90/hpf/目录下 2) 执行下面的命令,选择anlogic_dr1m90: ```shell source ./envsetup.sh ``` 3) 执行下面的命令,选择所需的Board配置: ```shell ./build.sh lunch ``` 4) 修改对应的"BoardConfig-xxx.mk"中ANLOGIC_HPF变量内容为指定的hpf 5) 注释对应的"BoardConfig-xxx.mk"中ANLOGIC_FSBL_IMAGE、ANLOGIC_BIT_IMAGE变量 6) 执行下面的命令,编译master_sdk中的fsbl工程: ```shell ./build.sh fsbl ``` 7) 执行下面的命令,生成BOOT.bin: ```shell ./build.sh bootgen ``` ## 11.board config配置 ANLOGIC_ARCH: 系统架构,riscv或者arm64 ANLOGIC_TARGET_PRODUCT: chip型号,例如:dr1m90和dr1v90 ANLOGIC_UBOOT_DEFCONFIG: uboot使用的defconfig文件名字 ANLOGIC_UBOOT_DTS: uboot使用的dts文件名字 ANLOGIC_UBOOT_IMG: 使用的uboot产生的image路径 ANLOGIC_KERNEL_DEFCONFIG: kernel使用的defconfig文件名字 ANLOGIC_KERNEL_DTS: kernel使用的dts文件名字 ANLOGIC_KERNEL_DTB: kernel使用的dtb文件路径 ANLOGIC_KERNEL_IMG: 使用的kernel image文件路径 ANLOGIC_BUILDROOT_DEFCONFIG: 编译buildroot使用的defconfig文件名 ANLOGIC_BUILDROOT_IMG: 使用的buildroot产生的rootfs镜像路径 ANLOGIC_BOOTSCR: uboot启动脚本路径 ANLOGIC_BOOTSCR_IMG: uboot启动脚本镜像存放路径 ANLOGIC_BOOTGEN_CONFIG: 打包生成BOOT.bin使用的配置文件路径 ANLOGIC_IMAGE_CONFIG: 生成烧录image使用的配置文件 ANLOGIC_BOOTPART_FILES: 从fat文件系统启动时,打包进fat文件系统的文件列表 ANLOGIC_IMAGE_EXTRA_FILES: 编译时copy镜像目录的其他文件列表 ANLOGIC_UBCFG_AN_BOOTARGS: kernel的启动参数 ANLOGIC_UBCFG_MTDIDS_DEFAULT: 默认的mtd id列表 ANLOGIC_UBCFG_MTDPARTS_DEFAULT: 默认的mtd分区参数 ANLOGIC_UBCFG_BOOT_SCRIPT_OFFSET: raw flash启动时启动脚本镜像在flash上的偏移 ANLOGIC_UBCFG_ENV_OFFSET: raw flash启动时uboot环境变量在flash上的偏移 ANLOGIC_OPENSBI: 指示是否需要编译opensbi,riscv时需要编译opensbi ANLOGIC_OPENSBI_BASE: opensbi的执行地址 ANLOGIC_OPENSBI_JUMP: opensbi结束后的跳转地址 ANLOGIC_TOOLCHAIN: 编译SDK时使用的工具链的路径 ANLOGIC_TOOLCHAIN_FSBL: 编译fsbl时使用的工具链的路径 ## 12.镜像文件 sd卡启动时,启动镜像生成在"device/output/chip型号/image/"路径下: BOOT.bin: 启动文件,包含fsbl和uboot镜像,如果是riscv则还包含opensbi镜像 boot.scr: uboot启动脚本 kernel.bin: linux内核镜像文件 rootfs.bin: rootfs镜像文件 dtb.bin: linux内核的设备树镜像 如果是从nor/emmc/nand等flash启动,则会将这些镜像文件打包生成烧录镜像, 存放在"device/output/chip型号/genimage"路径下 例如: mmc_fat_image.bin: 原始的烧录镜像文件 mmc_fat_sparse.bin: sparse格式的烧录镜像文件,相对原始烧录镜像尺寸会变小。 ## 13.linux dts结构 ``` anlogic-dr1m90-ad101-v20.dts (针对ad101-v20板级dts,包含ddr、led、key、serial、i2c、usb、gbe等外设打开或关闭) ├── anlogic-dr1m90.dts (各外设clock等信息) │ ├── anlogic-dr1m90.dtsi (各外设设备节点名称、基地址、中断号等信息) │ └── anlogic-dr1m90-plat.h (默认参数配置) │ └──anlogic-dr1m90-hpf.h (参数从hpf导入) └── anlogic-dr1m90-softip.dts (softip相关dts配置,默认从hpf导入) (如需自定义softip dts在device/anlogic_dr1m90/Config.mk中开打变量ANLOGIC_BIT_SOFTIP_DTS) anlogic-dr1m90-ad101-v20-openamp.dts (openamp对应dts,包含openamp各memory信息) └── anlogic-dr1m90-ad101-v20.dts anlogic-dr1m90-ad101-v20-qt.dts (qt对应dts,包含hmdi、dma、i2c信息) └── anlogic-dr1m90-ad101-v20.dts ``` ## 14.soft reboot soft reboot是在不reset hardware的情况下实现重新加载OS并重启的功能。 测试步骤如下: 1. 修改dts,为u-boot保留内存。例如: ``` &reserved_memory { ubmem: ubmem { no-map; reg = <0x0 0x200000 0x0 0x200000>; }; }; ``` 2. 修改dts,打开watchdog0,并且设置模式为irq模式,例如: ``` &watchdog0 { rmod = <2>; // RMOD_RESET = 1, RMOD_IRQ = 2 status = "okay"; }; ``` 3. 运行./build.sh kernelmenuconfig,打开CONFIG_ANLOGIC_SOFT_REBOOT 4. 运行./build.sh ubootmenuconfig,打开CONFIG_AN_WDT_SOFT_REBOOT 5. 编译并启动linux,使用sdk/app目录下编译出的memtool工具将编译好的u-boot.bin加载到0x200000处,然后运行sdk/app目录下编译出的wdt_test程序。