Fix for `ARCH_FLASH_OFFSET` when make script is gathering `.wolfboot-offset` and `.wolfboot-partition-size` files. Updates to Target.md. Cleanups to test tools.

pull/14/head
David Garske 2019-06-07 14:17:15 -07:00
parent 0f00f8e700
commit 317bca179c
6 changed files with 86 additions and 42 deletions

2
.gitignore vendored
View File

@ -75,3 +75,5 @@ image_v1_signed.bin
factory.bin
wolfboot-align.bin
wolfboot.bin
tools/test-expect-version/test-expect-version
tools/test-update-server/server

View File

@ -48,7 +48,7 @@ ifeq ($(ARCH),RISCV)
CFLAGS+=-fno-builtin-printf -DUSE_PLIC -DUSE_M_TIME -g -march=rv32imac -mabi=ilp32 -mcmodel=medany -nostartfiles -DARCH_RISCV
LDFLAGS+=-march=rv32imac -mabi=ilp32 -mcmodel=medany
OBJS+=src/boot_riscv.o src/vector_riscv.o
ARCH_FLASH_OFFSET=0x20010000
ARCH_FLASH_OFFSET=0x20000000
endif
CFLAGS+=-DARCH_FLASH_OFFSET=$(ARCH_FLASH_OFFSET)

View File

@ -24,21 +24,21 @@ The default wolfBoot configuration will add a second stage bootloader, leaving t
For testing wolfBoot here are the changes required:
1. Makefile arguments:
* ARCH?=RISCV
* TARGET?=hifive1
* ARCH=RISCV
* TARGET=hifive1
```
make ARCH=RISCV TARGET=hifive1 clean
make ARCH=RISCV TARGET=hifive1
```
```
make ARCH=RISCV TARGET=hifive1 clean
make ARCH=RISCV TARGET=hifive1
```
If using the `riscv64-unknown-elf-` cross compiler you can add `CROSS_COMPILE=riscv64-unknown-elf-` to your `make` or modify `arch.mk` as follows:
```
ifeq ($(ARCH),RISCV)
- CROSS_COMPILE:=riscv32-unknown-elf-
+ CROSS_COMPILE:=riscv64-unknown-elf-
```
If using the `riscv64-unknown-elf-` cross compiler you can add `CROSS_COMPILE=riscv64-unknown-elf-` to your `make` or modify `arch.mk` as follows:
```
ifeq ($(ARCH),RISCV)
- CROSS_COMPILE:=riscv32-unknown-elf-
+ CROSS_COMPILE:=riscv64-unknown-elf-
```
2. `include/target.h`
@ -58,6 +58,32 @@ Application Size 0x40000 (256KB)
#define WOLFBOOT_PARTITION_SWAP_ADDRESS 0x20060000
```
### Build Options
* To use ECC instead of ED25519 use make argument `SIGN=ECC256`
* To output wolfboot as hex for loading with JLink use make argument `wolfboot.hex`
### Loading
Loading with JLink:
```
JLinkExe -device FE310 -if JTAG -speed 4000 -jtagconf -1,-1 -autoconnect 1
loadfile wolfboot.hex
reset
```
### Debugging
Debugging with JLink:
In one terminal:
`JLinkGDBServer -device FE310 -port 3333`
In another terminal:
`riscv64-unknown-elf-gdb wolfboot.elf -ex "set remotetimeout 240" -ex "target extended-remote localhost:3333"`
## STM32-F407
Example 512KB partitioning on STM32-F407
@ -67,12 +93,12 @@ starting at address 0x20000. The flash layout is provided by the default example
configuration in `target.h`:
```C
#define WOLFBOOT_SECTOR_SIZE 0x20000
#define WOLFBOOT_PARTITION_SIZE 0x20000
#define WOLFBOOT_SECTOR_SIZE 0x20000
#define WOLFBOOT_PARTITION_SIZE 0x20000
#define WOLFBOOT_PARTITION_BOOT_ADDRESS 0x20000
#define WOLFBOOT_PARTITION_BOOT_ADDRESS 0x20000
#define WOLFBOOT_PARTITION_UPDATE_ADDRESS 0x40000
#define WOLFBOOT_PARTITION_SWAP_ADDRESS 0x60000
#define WOLFBOOT_PARTITION_SWAP_ADDRESS 0x60000
```
This results in the following partition configuration:

View File

@ -20,7 +20,7 @@
*
*=============================================================================
*
* OTA Upgrade mechanism implemented using DTLS 1.2
* Update tool to verify update version
*
*/
@ -42,8 +42,10 @@
#include <errno.h>
#define MSGLEN (4 + 4 + 8)
#define PORT "/dev/ttyS0"
#ifndef UART_DEV
#define UART_DEV "/dev/ttyS0"
#endif
#ifndef B115200
#define B115200 115200
#endif
@ -55,7 +57,6 @@ void alarm_handler(int signo)
}
int main(int argc, char** argv)
{
struct termios tty;
@ -71,7 +72,7 @@ int main(int argc, char** argv)
exit(1);
}
serialfd = open(PORT, O_RDWR | O_NOCTTY);
serialfd = open(UART_DEV, O_RDWR | O_NOCTTY);
tcgetattr(serialfd, &tty);
cfsetospeed(&tty, B115200);
cfsetispeed(&tty, B115200);
@ -110,4 +111,3 @@ int main(int argc, char** argv)
close(serialfd);
return 0;
}

View File

@ -0,0 +1,7 @@
# Update Server Tool
Tool to send binary image over UART to test application.
Usage:
`./server ../../factory.bin`

View File

@ -20,7 +20,7 @@
*
*=============================================================================
*
* OTA Upgrade mechanism implemented using DTLS 1.2
* OTA Upgrade mechanism implemented using UART
*
*/
@ -42,8 +42,16 @@
#include <errno.h>
#define MSGLEN (4 + 4 + 8)
#define PORT "/dev/ttyACM0"
#ifndef UART_DEV
#ifdef _MACH_
#define UART_DEV "/dev/usbmodem144241"
#else
#define UART_DEV "/dev/ttyACM0"
#endif
#endif
#ifndef B115200
#define B115200 115200
#endif
static volatile int cleanup; /* To handle shutdown */
union usb_ack {
@ -52,8 +60,8 @@ union usb_ack {
};
static uint8_t pktbuf[MSGLEN];
static unsigned int pktbuf_size = 0;
static uint8_t pktbuf[MSGLEN];
static unsigned int pktbuf_size = 0;
static int serialfd = -1;
static uint32_t high_ack;
@ -79,7 +87,7 @@ static int recv_ack(union usb_ack *ack)
if (c == '#') {
int i = 0;
err = 0;
ack->offset = 0;
ack->offset = 0;
while (i < 4) {
res = read(serialfd, &c, 1);
if (res < 1) {
@ -121,27 +129,27 @@ int main(int argc, char** argv)
union usb_ack ack;
struct termios tty;
sigset(SIGALRM, alarm_handler);
if (argc != 2) {
printf("Usage: %s firmware_filename\n", argv[0]);
exit(1);
}
/* open file and get size */
ffd = open(argv[1], O_RDONLY);
if (ffd < 0) {
perror("opening file");
exit(2);
}
res = fstat(ffd, &st);
if (res != 0) {
perror("fstat file");
exit(2);
}
tot_len = st.st_size;
serialfd = open(PORT, O_RDWR | O_NOCTTY);
/* open UART */
serialfd = open(UART_DEV, O_RDWR | O_NOCTTY);
tcgetattr(serialfd, &tty);
cfsetospeed(&tty, B115200);
cfsetispeed(&tty, B115200);
@ -155,8 +163,8 @@ int main(int argc, char** argv)
tty.c_cc[VMIN] = 0;
tty.c_cc[VTIME] = 5;
tcsetattr(serialfd, TCSANOW, &tty);
/* Await Start hash */
/* Wait for start hash (asterisk) */
while (1) {
char c;
@ -172,18 +180,17 @@ int main(int argc, char** argv)
printf("%c",c);
fflush(stdout);
}
}
printf("Target connected.\n");
usleep(500000);
printf("Starting update.\n");
do {
uint8_t hdr[2] = { 0xA5, 0x5A};
len = 0;
lseek(ffd, 0, SEEK_SET);
write(serialfd, &hdr, 2);
lseek(ffd, 0, SEEK_SET);
write(serialfd, &hdr, 2);
write(serialfd, &tot_len, sizeof(uint32_t));
printf("Sent image file size (%d)\n", tot_len);
while (len < tot_len) {
@ -201,7 +208,7 @@ int main(int argc, char** argv)
pktbuf_size = 0;
if (ack.offset != len) {
printf("buf rewind %u\n", ack.offset);
lseek(ffd, ack.offset, SEEK_SET);
lseek(ffd, ack.offset, SEEK_SET);
len = ack.offset;
}
memcpy(pktbuf + 4, &len, sizeof(len));
@ -215,7 +222,9 @@ int main(int argc, char** argv)
check(pktbuf);
write(serialfd, pktbuf, pktbuf_size);
len += res;
printf("Sent bytes: %d/%d %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x \r", len, tot_len, pktbuf[0], pktbuf[1], pktbuf[2], pktbuf[3], pktbuf[4], pktbuf[5], pktbuf[6], pktbuf[7]);
printf("Sent bytes: %d/%d %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x \r",
len, tot_len, pktbuf[0], pktbuf[1], pktbuf[2], pktbuf[3], pktbuf[4], pktbuf[5], pktbuf[6], pktbuf[7]);
fflush(stdout);
alarm(2);
@ -223,17 +232,17 @@ int main(int argc, char** argv)
}
printf("\n\n");
} while (0);
printf("waiting for last ack...\n");
while(!cleanup) {
res = recv_ack(&ack);
if ((res == 0 ) && (ack.offset == tot_len)) {
printf("Transfer complete.\n");
break;
}
}
}
printf("All done.\n");
close(serialfd);
return 0;
}