firmware: b2xx: Update to newer Cypress FX3 SDK

- Updated README with instructions on how to build using new SDK
(1.3.4 as of this change)
- Updated makefiles
- Updated memory map patch

Signed-off-by: michael-west <michael.west@ettus.com>
This commit is contained in:
michael-west 2020-08-22 16:33:06 -07:00 committed by Aaron Rossetto
parent 0f52366533
commit f405c24bc6
4 changed files with 130 additions and 168 deletions

View File

@ -14,59 +14,37 @@ managing the transport from the host to the FPGA by configuring IO and DMA.
## Setting up the Cypress SDK
In order to compile the USRP B200 and B210 firmware, you will need the FX3 SDK
distributed by the FX3 manufacturer, Cypress Semiconductor. You can download the
[FX3 SDK from here](http://www.cypress.com/documentation/software-and-drivers/ez-usb-fx3-sdk-archives)
*Note*: You *must* use SDK version 1.2.3!
In order to compile the USRP B200 and B210 bootloader and firmware, you will
need the FX3 SDK distributed by Cypress Semiconductor. You can download the
[FX3 SDK from here](https://www.cypress.com/documentation/software-and-drivers/ez-usb-fx3-software-development-kit)
Once you have downloaded it, extract the ARM cross-compiler from the tarball
`ARM_GCC.tar.gz` and put it somewhere useful. The highest level directory you
need is `arm-2013.03/`.
From the SDK, extract the ARM cross-compile toolchain tarball `ARM-GCC.tar.gz`
and the FX3 firmware tarball `fx3_firmware_linux.tar.gz`.
Now that you have extracted the cross compilation toolchain, you need to set up
some environment variables to tell the B2xx `makefile` where to look for the
tools. These variables are:
Set up the appropriate environment variables for the build:
```
$ export ARMGCC_INSTALL_PATH=<your path>/arm-2013.03
$ export ARMGCC_VERSION=4.5.2
$ export ARMGCC_INSTALL_PATH=<ARM toolchain dir>
$ export ARMGCC_VERSION=<ARM toolchain version>
$ export FX3FWROOT=<FX3 firmware dir>
```
Now, you'll need to set-up the Cypress SDK, as well. In the SDK, copy the
following sub-directories from the `firmware` directory to
`uhd.git/firmware/fx3`: `common/`, `lpp_source/`, `u3p_firmware/`, `boot_fw/`.
In addition, copy the `elf2img` sub-directory from the `util` directory to
`uhd.git/firmware/fx3`.
Your directory structure should now look like:
These should look something like this:
```
uhd.git/
|
--firmware/
|
--fx3/
|
--b200/ # From UHD
--boot_fw/ # From Cypress SDK
--common/ # From Cypress SDK
--elf2img/ # From Cypress SDK
--gpif2_designer/ # From UHD
--lpp_source/ # From Cypress SDK
--u3p_firmware/ # From Cypress SDK
--README.md # From UHD
$ export ARMGCC_INSTALL_PATH=/path/to/my/files/arm-2013.11
$ export ARMGCC_VERSION=4.8.1
$ export FX3FWROOT=/path/to/my/files/cyfx3sdk
```
## Applying the Patch to the Toolchain
Now, you'll need to apply a patch to a couple of files in the Cypress SDK. Head
into the `common/` directory you just copied from the Cypress SDK, and apply the
patch `b200/fx3_mem_map.patch`.
Now, you'll need to apply a patch to some files in the Cypress SDK. Apply the
patch `b200/fx3_mem_map.patch` as follows:
```
# cd uhd.git/firmware/fx3
$ patch -p1 < ../b200/fx3_mem_map.patch
$ cd uhd.git/firmware/fx3
$ patch -p1 -d $FX3FWROOT < b200/fx3_mem_map.patch
```
If you don't see any errors print on the screen, then the patch was successful.

View File

@ -8,23 +8,24 @@ IMGOUT = usrp_b200_bl.img
all:$(IMGOUT)
BL_ROOT=../../boot_fw
BL_INC=$(BL_ROOT)/include
BL_LIB=$(BL_ROOT)/lib
BL_CYP_SRC=$(BL_ROOT)/src
ELF2IMG_SRC=../../elf2img/elf2img.c
ELF2IMG_SRC=$(FX3FWROOT)/util/elf2img/elf2img.c
ELF2IMG=elf2img
CYFXBUILD = gcc
include fx3_build_config.mak
include $(FX3FWROOT)/fw_build/boot_fw/fx3_build_config.mak
MODULE = cyfx_boot_app
ifeq ($(CYFXBUILD), arm)
APP_ASM_SOURCE =
else
APP_ASM_SOURCE = cyfx_gcc_startup.S
endif
APP_SOURCE = main.c usb_boot.c usb_descriptors.c ../common/common_descriptors.c ../common/common_helpers.c
INCFLAGS = -I$(BL_INC) -I../common
INCFLAGS = -I../common
APP_OBJECT=$(APP_SOURCE:%.c=./%.o)
@ -32,20 +33,11 @@ APP_ASM_OBJECT=$(APP_ASM_SOURCE:%.S=./%.o)
EXES = $(MODULE).$(EXEEXT)
ifeq ($(CYFXBUILD), gcc)
APP_ASM_SOURCE = cyfx_gcc_startup.S
else
APP_ASM_SOURCE =
endif
$(APP_ASM_OBJECT) : %.o : %.S
$(ASSEMBLE)
$(APP_OBJECT) : %.o : %.c ../lib/cyfx3_boot.a cyfx3.ld
$(APP_OBJECT) : %.o : %.c
$(COMPILE) $(INCFLAGS)
$(MODULE).$(EXEEXT): $(APP_OBJECT) $(APP_ASM_OBJECT)
@ -54,29 +46,15 @@ $(MODULE).$(EXEEXT): $(APP_OBJECT) $(APP_ASM_OBJECT)
$(ELF2IMG):
gcc -o $(ELF2IMG) $(ELF2IMG_SRC)
fx3_build_config.mak:
cp $(BL_CYP_SRC)/fx3_build_config.mak .
fx3_armgcc_config.mak:
cp $(BL_CYP_SRC)/fx3_armgcc_config.mak .
cyfx_gcc_startup.S:
cp $(BL_CYP_SRC)/cyfx_gcc_startup.S .
cyfx3.ld:
cp $(BL_CYP_SRC)/cyfx3.ld .
../lib/cyfx3_boot.a:
mkdir -p ../lib
cp $(BL_LIB)/cyfx3_boot.a ../lib
cp $(FX3FWROOT)/firmware/boot_fw/src/cyfx_gcc_startup.S .
clean:
rm -f ./$(MODULE).$(EXEEXT)
rm -f ./$(MODULE).map
rm -f ./$(IMGOUT)
rm -f ./fx3_build_config.mak
rm -f ./fx3_armgcc_config.mak
rm -f ./cyfx_gcc_startup.S
rm -f ./cyfx3.ld
rm -f ../lib/cyfx3_boot.a
rmdir ../lib --ignore-fail-on-non-empty
rm -f ./*.o
rm -f ../common/*.o
rm -f ./$(ELF2IMG)

View File

@ -10,9 +10,7 @@ HEX_OUT = usrp_b200_fw.hex
all:$(HEX_OUT)
# Pull in the Cypress SDK files to build the firmware
FX3FWROOT=../..
FX3PFWROOT=../../u3p_firmware
include $(FX3FWROOT)/common/fx3_build_config.mak
include $(FX3FWROOT)/firmware/common/fx3_build_config.mak
ifndef OC
OC = arm-none-eabi-objcopy
@ -20,13 +18,19 @@ endif
MODULE = b200_main
SOURCE += $(MODULE).c b200_i2c.c b200_usb_descriptors.c ../common/common_helpers.c ../common/common_descriptors.c
SOURCE += $(MODULE).c b200_i2c.c b200_usb_descriptors.c ../common/common_helpers.c ../common/common_descriptors.c cyfxtx.c
INCFLAGS = -I../common
LDLIBS += \
"$$ARMGCC_INSTALL_PATH"/arm-none-eabi/lib/libm.a
ifeq ($(CYFXBUILD),arm)
SOURCE_ASM=cyfx_startup.S
else
SOURCE_ASM=cyfx_gcc_startup.S
endif
C_OBJECT=$(SOURCE:%.c=./%.o)
A_OBJECT=$(SOURCE_ASM:%.S=./%.o)
@ -35,6 +39,15 @@ EXES = $(MODULE).$(EXEEXT)
$(MODULE).$(EXEEXT): $(A_OBJECT) $(C_OBJECT)
$(LINK) $(LINKFLAGS)
cyfxtx.c:
cp $(FX3FWROOT)/fw_build/fx3_fw/cyfxtx.c .
cyfx_startup.S:
cp $(FX3FWROOT)/fw_build/fx3_fw/cyfx_startup.S .
cyfx_gcc_startup.S:
cp $(FX3FWROOT)/fw_build/fx3_fw/cyfx_gcc_startup.S .
$(C_OBJECT) : %.o : %.c
$(COMPILE) $(INCFLAGS)
@ -46,6 +59,7 @@ clean:
rm -f ./$(MODULE).map
rm -f ./*.o
rm -f ../common/*.o
rm -f cyfxtx.c cyfx_startup.S cyfx_gcc_startup.S
$(HEX_OUT): $(C_OBJECT) $(A_OBJECT) $(EXES)
$(OC) -O ihex $(EXES) $@

View File

@ -1,91 +1,83 @@
diff -ur 1.2.3-orig/common/cyfxtx.c 1.2.3/common/cyfxtx.c
--- 1.2.3-orig/common/cyfxtx.c 2013-02-07 17:16:54.000000000 -0800
+++ 1.2.3/common/cyfxtx.c 2014-03-25 16:56:12.484602382 -0700
@@ -33,7 +33,7 @@
such as thread stacks and memory for message queues. The Cypress FX3
libraries require a Mem heap size of at least 32 KB.
*/
-#define CY_U3P_MEM_HEAP_BASE ((uint8_t *)0x40038000)
+#define CY_U3P_MEM_HEAP_BASE ((uint8_t *)0x40044000)
#define CY_U3P_MEM_HEAP_SIZE (0x8000)
/* The last 32 KB of RAM is reserved for 2-stage boot operation. This value can be changed to
diff -ur 1.2.3-orig/common/fx3.ld 1.2.3/common/fx3.ld
--- 1.2.3-orig/common/fx3.ld 2013-02-07 17:16:54.000000000 -0800
+++ 1.2.3/common/fx3.ld 2014-03-25 16:59:40.872240377 -0700
@@ -26,10 +26,11 @@
The default memory map used for FX3 applications is as follows:
Descriptor area Base: 0x40000000 Size: 12KB
- Code area Base: 0x40003000 Size: 180KB
- Data area Base: 0x40030000 Size: 32KB
- Driver heap Base: 0x40038000 Size: 32KB (Update cyfxtx.c to change this.)
- Buffer area Base: 0x40040000 Size: 256KB (Update cyfxtx.c to change this.)
+ Code area Base: 0x40003000 Size: 212KB
+ Data area Base: 0x40038000 Size: 32KB
+ Heap Base: 0x40040000 Size: 16KB
+ Driver heap Base: 0x40044000 Size: 32KB (Update cyfxtx.c to change this.)
+ Buffer area Base: 0x4004C000 Size: 208KB (Update cyfxtx.c to change this.)
Interrupt handlers to be placed in I-TCM (16KB).
The first 256 bytes of ITCM are reserved for Exception Vectors.
@@ -52,8 +53,8 @@
MEMORY
{
I-TCM : ORIGIN = 0x100, LENGTH = 0x3F00
- SYS_MEM : ORIGIN = 0x40003000 LENGTH = 0x2D000
- DATA : ORIGIN = 0x40030000 LENGTH = 0x8000
+ SYS_MEM : ORIGIN = 0x40003000 LENGTH = 0x35000
+ DATA : ORIGIN = 0x40038000 LENGTH = 0x8000
}
SECTIONS
@@ -75,7 +76,7 @@
_etext = .;
} > SYS_MEM
- . = 0x40030000;
+ . = 0x40038000;
.data :
{
_data = .;
@@ -104,5 +105,16 @@
} > DATA
__exidx_end = .;
+ PROVIDE(__exidx_end = __exidx_end);
+
+ . = ALIGN(4);
+ __heap_start = 0x40040000;
+ PROVIDE(__heap_start = __heap_start);
+
+ . = ALIGN(4);
+ __heap_end = 0x40044000;
+ PROVIDE(__heap_end = __heap_end);
+
+ PROVIDE(__heap_size = __heap_end - __heap_start);
}
diff -ur 1.2.3-orig/boot_fw/src/cyfx3.ld 1.2.3/boot_fw/src/cyfx3.ld
--- 1.2.3-orig/boot_fw/src/cyfx3.ld 2019-02-12 16:40:48.000000000 -0800
+++ 1.2.3/boot_fw/src/cyfx3.ld 2019-03-20 14:36:18.992529192 -0700
@@ -34,12 +34,18 @@
MEMORY
{
+ BLANK : ORIGIN = 0x40070000 LENGTH = 0x0100
SYS_MEM : ORIGIN = 0x40078000 LENGTH = 0x7000
DATA : ORIGIN = 0x4007F000 LENGTH = 0x1000
}
SECTIONS
{
+ . = 0x40070000;
+ .blank :
+ {
+ . += 0x100;
+ } > BLANK
. = 0x40078000;
.text :
{
diff -r -u cyfx3sdk/fw_build/boot_fw/cyfx3.ld cyfx3sdk-modified/fw_build/boot_fw/cyfx3.ld
--- cyfx3sdk/fw_build/boot_fw/cyfx3.ld 2018-05-23 02:25:01.000000000 -0700
+++ cyfx3sdk-modified/fw_build/boot_fw/cyfx3.ld 2020-08-22 14:54:46.407481500 -0700
@@ -39,12 +39,18 @@
MEMORY
{
+ BLANK : ORIGIN = 0x40070000 LENGTH = 0x0100
SYS_MEM : ORIGIN = 0x40078000 LENGTH = 0x7000
DATA : ORIGIN = 0x4007F000 LENGTH = 0x1000
}
SECTIONS
{
+ .blank :
+ {
+ . += 0x100;
+ } > BLANK
+
.text :
{
*(RESET)
diff -r -u cyfx3sdk/fw_build/fx3_fw/cyfxtx.c cyfx3sdk-modified/fw_build/fx3_fw/cyfxtx.c
--- cyfx3sdk/fw_build/fx3_fw/cyfxtx.c 2018-05-23 02:25:01.000000000 -0700
+++ cyfx3sdk-modified/fw_build/fx3_fw/cyfxtx.c 2020-08-21 12:34:14.344699800 -0700
@@ -98,7 +98,7 @@
area which is used by the application code as well as the drivers to allocate thread
stacks and other internal data structures.
*/
-#define CY_U3P_MEM_HEAP_BASE (0x40038000)
+#define CY_U3P_MEM_HEAP_BASE (0x40044000)
#define CY_U3P_MEM_HEAP_SIZE (0x8000)
/*
diff -r -u cyfx3sdk/fw_build/fx3_fw/fx3_512k.ld cyfx3sdk-modified/fw_build/fx3_fw/fx3_512k.ld
--- cyfx3sdk/fw_build/fx3_fw/fx3_512k.ld 2018-05-23 02:25:01.000000000 -0700
+++ cyfx3sdk-modified/fw_build/fx3_fw/fx3_512k.ld 2020-08-21 12:34:14.345050200 -0700
@@ -32,11 +32,11 @@
The default memory map used for FX3 applications is as follows:
Descriptor area Base: 0x40000000 Size: 12KB
- Code area Base: 0x40003000 Size: 180KB
- Data area Base: 0x40030000 Size: 32KB
- Driver heap Base: 0x40038000 Size: 32KB (Update cyfxtx.c to change this.)
- Buffer area Base: 0x40040000 Size: 224KB (Update cyfxtx.c to change this.)
- 2-stage boot area Base: 0x40078000 Size: 32KB (Update cyfxtx.c to change this.)
+ Code area Base: 0x40003000 Size: 212KB
+ Data area Base: 0x40038000 Size: 32KB
+ Heap Base: 0x40040000 Size: 16KB
+ Driver heap Base: 0x40044000 Size: 32KB (Update cyfxtx.c to change this.)
+ Buffer area Base: 0x4004C000 Size: 208KB (Update cyfxtx.c to change this.)
Interrupt handlers are placed in I-TCM (16KB). The first 256 bytes of ITCM are
reserved for Exception Vectors and will be loaded during firmware initialization.
@@ -58,8 +58,8 @@
MEMORY
{
I-TCM : ORIGIN = 0x100 LENGTH = 0x3F00
- SYS_MEM : ORIGIN = 0x40003000 LENGTH = 0x2D000
- DATA : ORIGIN = 0x40030000 LENGTH = 0x8000
+ SYS_MEM : ORIGIN = 0x40003000 LENGTH = 0x35000
+ DATA : ORIGIN = 0x40038000 LENGTH = 0x8000
}
SECTIONS
@@ -114,5 +114,17 @@
. = ALIGN(4);
} > DATA
__exidx_end = .;
+
+ PROVIDE(__exidx_end = __exidx_end);
+
+ . = ALIGN(4);
+ __heap_start = 0x40040000;
+ PROVIDE(__heap_start = __heap_start);
+
+ . = ALIGN(4);
+ __heap_end = 0x40044000;
+ PROVIDE(__heap_end = __heap_end);
+
+ PROVIDE(__heap_size = __heap_end - __heap_start);
}