Skip to content

Commit 92ed578

Browse files
committed
Fixes for long jump. Targets.md fix for RAM_CODE typo.
1 parent 7a28c9e commit 92ed578

5 files changed

Lines changed: 50 additions & 25 deletions

File tree

Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,7 @@ test-app/image.bin:
153153
KINETIS_CMSIS=$(KINETIS_CMSIS) NVM_FLASH_WRITEONCE=$(NVM_FLASH_WRITEONCE) \
154154
FREEDOM_E_SDK=$(FREEDOM_E_SDK)
155155
@rm -f src/*.o hal/*.o
156+
@$(SIZE) test-app/image.elf
156157

157158
include tools/test.mk
158159

docs/Targets.md

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,8 @@ For testing wolfBoot here are the changes required:
6464
* TARGET=hifive1
6565
6666
```
67-
make ARCH=RISCV TARGET=hifive1 RAMCODE=1 clean
68-
make ARCH=RISCV TARGET=hifive1 RAMCODE=1
67+
make ARCH=RISCV TARGET=hifive1 RAM_CODE=1 clean
68+
make ARCH=RISCV TARGET=hifive1 RAM_CODE=1
6969
```
7070
7171
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:
@@ -119,3 +119,7 @@ In another terminal:
119119
riscv64-unknown-elf-gdb wolfboot.elf -ex "set remotetimeout 240" -ex "target extended-remote localhost:3333"
120120
add-symbol-file test-app/image.elf 0x20020100
121121
```
122+
123+
```
124+
riscv64-unknown-elf-objdump -D test-app/image.elf
125+
```

hal/hifive1.c

Lines changed: 28 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,11 @@
5858
#define FESPI_TXDATA_FIFO_FULL (1 << 31)
5959
#define FESPI_FMT_DIR_TX (1 << 3)
6060

61-
#define FESPI_CSMODE_AUTO 0
62-
#define FESPI_CSMODE_HOLD 2
63-
#define FESPI_CSMODE_OFF 3
61+
#define FESPI_CSMODE_AUTO 0x0UL
62+
#define FESPI_CSMODE_HOLD 0x2UL
63+
#define FESPI_CSMODE_MASK 0x3UL
64+
65+
#define FESPI_FCTRL_MODE_SEL 0x1UL
6466

6567
#define FESPI_FFMT_CMD_EN 0x1
6668
#define FESPI_FFMT_ADDR_LEN(x) (((x) & 0x7) << 1)
@@ -84,7 +86,7 @@
8486
#define FESPI_PROTO_D 1 /* Dual */
8587
#define FESPI_PROTO_Q 2 /* Quad */
8688

87-
89+
//#define SPI_QUAD_MODE
8890
/* SPI Flash Commands */
8991
#define FESPI_READ_ID 0x9F /* Read Flash Identification */
9092
#define FESPI_READ_MID 0xAF /* Read Flash Identification, multi-io */
@@ -93,7 +95,11 @@
9395
#define FESPI_PAGE_PROGRAM 0x02 /* Page Program */
9496
#define FESPI_FAST_READ 0x0B /* Fast Read */
9597
#define FESPI_READ 0x03 /* Normal Read */
98+
#ifdef SPI_QUAD_MODE
9699
#define FESPI_ERASE_SECTOR 0x20 /* Sector Erase */
100+
#else
101+
#define FESPI_ERASE_SECTOR 0xD7 /* Sector Erase */
102+
#endif
97103

98104
/* SPI flash status fields (from FESPI_READ_STATUS command) */
99105
#define FESPI_RX_BSY (1 << 0)
@@ -258,41 +264,42 @@ void fespi_init(uint32_t cpu_clock, uint32_t flash_freq)
258264
FESPI_REG_SCKDIV |= FESPI_SCKDIV_VAL(cpu_clock, flash_freq);
259265
}
260266

261-
static inline void fespi_swmode(void)
267+
static RAMFUNCTION void fespi_swmode(void)
262268
{
263-
if (FESPI_REG_FCTRL & 1)
264-
FESPI_REG_FCTRL &= ~1UL;
269+
if (FESPI_REG_FCTRL & FESPI_FCTRL_MODE_SEL)
270+
FESPI_REG_FCTRL &= ~FESPI_FCTRL_MODE_SEL;
265271
}
266272

267-
static inline void fespi_hwmode(void)
273+
static RAMFUNCTION void fespi_hwmode(void)
268274
{
269-
if ((FESPI_REG_FCTRL & 1) == 0)
270-
FESPI_REG_FCTRL |= 1;
275+
if ((FESPI_REG_FCTRL & FESPI_FCTRL_MODE_SEL) == 0)
276+
FESPI_REG_FCTRL |= FESPI_FCTRL_MODE_SEL;
271277
}
272278

273-
static inline void fespi_csmode_hold(void)
279+
static RAMFUNCTION void fespi_csmode_hold(void)
274280
{
275-
uint32_t reg = FESPI_REG_CSMODE & (~ 0x03);
276-
FESPI_REG_CSMODE = reg | FESPI_CSMODE_HOLD;
281+
FESPI_REG_CSMODE & ~FESPI_CSMODE_MASK;
282+
FESPI_REG_CSMODE |= FESPI_CSMODE_HOLD;
277283
}
278284

279-
static inline void fespi_csmode_auto(void)
285+
static RAMFUNCTION void fespi_csmode_auto(void)
280286
{
281-
FESPI_REG_CSMODE &= (~0x03);
287+
FESPI_REG_CSMODE & ~FESPI_CSMODE_MASK;
288+
FESPI_REG_CSMODE |= FESPI_CSMODE_AUTO;
282289
}
283290

284-
static inline void fespi_wait_txwm(void)
291+
static RAMFUNCTION void fespi_wait_txwm(void)
285292
{
286293
while((FESPI_REG_IP & FESPI_IP_TXWM) == 0);
287294
}
288295

289-
static inline void fespi_sw_tx(uint8_t b)
296+
static RAMFUNCTION void fespi_sw_tx(uint8_t b)
290297
{
291298
while((FESPI_REG_TXDATA & FESPI_TXDATA_FIFO_FULL) != 0);
292299
FESPI_REG_TXDATA = b;
293300
}
294301

295-
static inline uint8_t fespi_sw_rx(void)
302+
static RAMFUNCTION uint8_t fespi_sw_rx(void)
296303
{
297304
volatile uint32_t reg;
298305
do {
@@ -301,22 +308,22 @@ static inline uint8_t fespi_sw_rx(void)
301308
return (uint8_t)(reg & 0xFF);
302309
}
303310

304-
static inline void fespi_sw_setdir(int tx)
311+
static RAMFUNCTION void fespi_sw_setdir(int tx)
305312
{
306313
if (tx)
307314
FESPI_REG_FMT |= FESPI_FMT_DIR_TX;
308315
else
309316
FESPI_REG_FMT &= ~FESPI_FMT_DIR_TX;
310317
}
311318

312-
static inline void fespi_write_address(uint32_t address)
319+
static RAMFUNCTION void fespi_write_address(uint32_t address)
313320
{
314321
fespi_sw_tx((address & 0xFF0000) >> 16);
315322
fespi_sw_tx((address & 0xFF00) >> 8);
316323
fespi_sw_tx((address & 0xFF));
317324
}
318325

319-
static inline void fespi_wait_flash_busy(void)
326+
static RAMFUNCTION void fespi_wait_flash_busy(void)
320327
{
321328
uint8_t rx;
322329
fespi_sw_setdir(FESPI_DIR_RX);

src/boot_riscv.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,13 @@ void __attribute__((naked,section(".init"))) _reset(void) {
7575

7676
void do_boot(const uint32_t *app_offset)
7777
{
78+
#if 1
79+
/* workaround for long jump */
80+
asm volatile("la a2, reloc_iv;" \
81+
"jalr a2" ::: "a2");
82+
#else
7883
reloc_iv(app_offset);
84+
#endif
7985
asm volatile("jr %0":: "r"((uint8_t *)(app_offset)));
8086
}
8187

test-app/hifive1.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ static int check(uint8_t *pkt, int size)
6161
return -1;
6262
}
6363

64-
volatile void RAMFUNCTION write_page(uint32_t dst)
64+
static RAMFUNCTION void write_page(uint32_t dst)
6565
{
6666
hal_flash_erase(dst, PAGESIZE);
6767
hal_flash_write(dst, flash_page, PAGESIZE);
@@ -132,8 +132,15 @@ void main(void) {
132132
memcpy(&flash_page[recv_seq % PAGESIZE], msg + 8, psize);
133133
flash_page_idx += psize;
134134
if ((flash_page_idx == PAGESIZE) || (next_seq + psize >= tot_len)) {
135-
uint32_t dst = (WOLFBOOT_PARTITION_UPDATE_ADDRESS + recv_seq + psize) - flash_page_idx;
135+
uint32_t dst = ((WOLFBOOT_PARTITION_UPDATE_ADDRESS - 0x20000000) + recv_seq + psize) - flash_page_idx;
136+
#if 1
137+
/* workaround for long jump */
138+
asm volatile("mv a0, %0;" \
139+
"la a2, write_page;" \
140+
"jalr a2" :: "r" (dst) : "a2");
141+
#else
136142
write_page(dst);
143+
#endif
137144
memset(flash_page, 0xFF, PAGESIZE);
138145
}
139146
next_seq += psize;

0 commit comments

Comments
 (0)