Factor irq methods
Now methods that need interrupts turned off are wrapped. Make genbackupisr.py executable. New resources for bootloader-related information.
This commit is contained in:
parent
6eced34422
commit
954da749eb
0
examples/osd/ota-update/genbackupisr.py
Normal file → Executable file
0
examples/osd/ota-update/genbackupisr.py
Normal file → Executable file
|
@ -54,7 +54,7 @@
|
||||||
* The build system automatically compiles the resources in the
|
* The build system automatically compiles the resources in the
|
||||||
* corresponding sub-directory.
|
* corresponding sub-directory.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static size_t
|
static size_t
|
||||||
part_count (const char *name, const char *uri, char *buf, size_t bsize)
|
part_count (const char *name, const char *uri, char *buf, size_t bsize)
|
||||||
{
|
{
|
||||||
|
@ -85,3 +85,66 @@ GENERIC_RESOURCE
|
||||||
, part_size
|
, part_size
|
||||||
);
|
);
|
||||||
|
|
||||||
|
static size_t
|
||||||
|
get_boot_default (const char *name, const char *uri, char *buf, size_t bsize)
|
||||||
|
{
|
||||||
|
return snprintf (buf, bsize, "%ld", bootloader_get_boot_default ());
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
set_boot_default (const char *name, const char *uri, const char *s)
|
||||||
|
{
|
||||||
|
uint32_t tmp = strtoul (s, NULL, 10);
|
||||||
|
bootloader_set_boot_default (tmp);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
GENERIC_RESOURCE
|
||||||
|
( boot_default
|
||||||
|
, Default boot partition
|
||||||
|
, count
|
||||||
|
, 0
|
||||||
|
, set_boot_default
|
||||||
|
, get_boot_default
|
||||||
|
);
|
||||||
|
|
||||||
|
static size_t
|
||||||
|
get_boot_next (const char *name, const char *uri, char *buf, size_t bsize)
|
||||||
|
{
|
||||||
|
return snprintf (buf, bsize, "%ld", bootloader_get_boot_next ());
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
set_boot_next (const char *name, const char *uri, const char *s)
|
||||||
|
{
|
||||||
|
uint32_t tmp = strtoul (s, NULL, 10);
|
||||||
|
bootloader_set_boot_next (tmp);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
GENERIC_RESOURCE
|
||||||
|
( boot_next
|
||||||
|
, Next boot partition
|
||||||
|
, count
|
||||||
|
, 0
|
||||||
|
, set_boot_next
|
||||||
|
, get_boot_next
|
||||||
|
);
|
||||||
|
|
||||||
|
static size_t
|
||||||
|
get_callers_part (const char *name, const char *uri, char *buf, size_t bsize)
|
||||||
|
{
|
||||||
|
return snprintf (buf, bsize, "%ld", bootloader_get_callers_part ());
|
||||||
|
}
|
||||||
|
|
||||||
|
GENERIC_RESOURCE
|
||||||
|
( callers_part
|
||||||
|
, Currently booted partition
|
||||||
|
, count
|
||||||
|
, 0
|
||||||
|
, NULL
|
||||||
|
, get_callers_part
|
||||||
|
);
|
||||||
|
|
||||||
|
// FIXME: Find out how to pass two parameters, for set/clr_part_ok and
|
||||||
|
// for get_part_start
|
||||||
|
|
|
@ -70,7 +70,6 @@ res_put_handler(void *request, void *response, uint8_t *buffer, uint16_t preferr
|
||||||
coap_packet_t *const packet = (coap_packet_t *)request;
|
coap_packet_t *const packet = (coap_packet_t *)request;
|
||||||
uint8_t *in_data = NULL;
|
uint8_t *in_data = NULL;
|
||||||
size_t len = 0;
|
size_t len = 0;
|
||||||
uint8_t sreg = SREG;
|
|
||||||
const uint32_t partition_start = bootloader_get_part_start (1);
|
const uint32_t partition_start = bootloader_get_part_start (1);
|
||||||
const uint32_t partition_size = bootloader_get_part_size ();
|
const uint32_t partition_size = bootloader_get_part_size ();
|
||||||
|
|
||||||
|
@ -154,28 +153,19 @@ res_put_handler(void *request, void *response, uint8_t *buffer, uint16_t preferr
|
||||||
if (current_offset % PAGESIZE == 0) {
|
if (current_offset % PAGESIZE == 0) {
|
||||||
uint32_t dst_address = partition_start + current_offset - PAGESIZE;
|
uint32_t dst_address = partition_start + current_offset - PAGESIZE;
|
||||||
PRINTF (("Flashing: %lu to %lu\n", (uint32_t)PAGESIZE, dst_address));
|
PRINTF (("Flashing: %lu to %lu\n", (uint32_t)PAGESIZE, dst_address));
|
||||||
sreg = SREG;
|
|
||||||
cli ();
|
|
||||||
bootloader_write_page_to_flash (dst_address, PAGESIZE, current_page);
|
bootloader_write_page_to_flash (dst_address, PAGESIZE, current_page);
|
||||||
SREG = sreg;
|
|
||||||
} else if (!packet->block1_more) {
|
} else if (!packet->block1_more) {
|
||||||
uint32_t dst_address =
|
uint32_t dst_address =
|
||||||
partition_start + (current_offset / PAGESIZE) * PAGESIZE;
|
partition_start + (current_offset / PAGESIZE) * PAGESIZE;
|
||||||
PRINTF (("Flashing: last page %lu to %lu\n", (uint32_t)PAGESIZE, dst_address));
|
PRINTF (("Flashing: last page %lu to %lu\n", (uint32_t)PAGESIZE, dst_address));
|
||||||
sreg = SREG;
|
|
||||||
cli ();
|
|
||||||
bootloader_write_page_to_flash (dst_address, PAGESIZE, current_page);
|
bootloader_write_page_to_flash (dst_address, PAGESIZE, current_page);
|
||||||
SREG = sreg;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (!packet->block1_more) {
|
if (!packet->block1_more) {
|
||||||
// we are finished
|
// we are finished
|
||||||
sreg = SREG;
|
|
||||||
cli ();
|
|
||||||
bootloader_backup_irq_table (1); // FIXME: 1 is hardcoded
|
bootloader_backup_irq_table (1); // FIXME: 1 is hardcoded
|
||||||
bootloader_set_boot_next (1);
|
bootloader_set_boot_next (1);
|
||||||
SREG = sreg;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
REST.set_response_status(response, REST.status.CHANGED);
|
REST.set_response_status(response, REST.status.CHANGED);
|
||||||
|
|
|
@ -11,7 +11,8 @@ extern "C" {
|
||||||
#include "contiki.h"
|
#include "contiki.h"
|
||||||
#include "contiki-net.h"
|
#include "contiki-net.h"
|
||||||
#include "er-coap.h"
|
#include "er-coap.h"
|
||||||
extern resource_t res_upload_image;
|
#include "bootloader_if.h"
|
||||||
|
#include "resources.h"
|
||||||
char resname[] = "update";
|
char resname[] = "update";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20,9 +21,20 @@ void setup (void)
|
||||||
{
|
{
|
||||||
rest_init_engine ();
|
rest_init_engine ();
|
||||||
rest_activate_resource (&res_upload_image, resname);
|
rest_activate_resource (&res_upload_image, resname);
|
||||||
|
rest_activate_resource (&res_part_count, (char *)"part_count");
|
||||||
|
rest_activate_resource (&res_part_size, (char *)"part_size");
|
||||||
|
rest_activate_resource (&res_boot_default, (char *)"boot_default");
|
||||||
|
rest_activate_resource (&res_boot_next, (char *)"boot_next");
|
||||||
|
rest_activate_resource (&res_callers_part, (char *)"callers_part");
|
||||||
}
|
}
|
||||||
|
|
||||||
void loop (void)
|
void loop (void)
|
||||||
{
|
{
|
||||||
//printf ("Huhu\n");
|
printf ("part-count: %ld\n", bootloader_get_part_count ());
|
||||||
|
printf ("part-size: %ld\n", bootloader_get_part_size ());
|
||||||
|
printf ("part-start 0: 0x%lx\n", bootloader_get_part_start (0));
|
||||||
|
printf ("part-start 1: 0x%lx\n", bootloader_get_part_start (1));
|
||||||
|
printf ("boot-default: %ld\n", bootloader_get_boot_default ());
|
||||||
|
printf ("boot-next: %ld\n", bootloader_get_boot_next ());
|
||||||
|
printf ("callers-part: %ld\n", bootloader_get_callers_part ());
|
||||||
}
|
}
|
||||||
|
|
|
@ -100,15 +100,15 @@ TEXT_SECTION_START=0x1ef00
|
||||||
endif
|
endif
|
||||||
|
|
||||||
LDFLAGS += -Wl,--defsym,bootloader_get_mac=$(BOOTLOADER_GET_MAC) \
|
LDFLAGS += -Wl,--defsym,bootloader_get_mac=$(BOOTLOADER_GET_MAC) \
|
||||||
-Wl,--defsym,bootloader_write_page_to_flash=$(BOOTLOADER_WRITE_PAGE_TO_FLASH) \
|
-Wl,--defsym,_bootloader_write_page_to_flash=$(BOOTLOADER_WRITE_PAGE_TO_FLASH) \
|
||||||
-Wl,--defsym,bootloader_get_part_count=$(BOOTLOADER_GET_PART_COUNT) \
|
-Wl,--defsym,bootloader_get_part_count=$(BOOTLOADER_GET_PART_COUNT) \
|
||||||
-Wl,--defsym,bootloader_get_part_size=$(BOOTLOADER_GET_PART_SIZE) \
|
-Wl,--defsym,bootloader_get_part_size=$(BOOTLOADER_GET_PART_SIZE) \
|
||||||
-Wl,--defsym,bootloader_get_part_start=$(BOOTLOADER_GET_PART_START) \
|
-Wl,--defsym,bootloader_get_part_start=$(BOOTLOADER_GET_PART_START) \
|
||||||
-Wl,--defsym,bootloader_set_part_ok=$(BOOTLOADER_SET_PART_OK) \
|
-Wl,--defsym,_bootloader_set_part_ok=$(BOOTLOADER_SET_PART_OK) \
|
||||||
-Wl,--defsym,bootloader_clr_part_ok=$(BOOTLOADER_CLR_PART_OK) \
|
-Wl,--defsym,_bootloader_clr_part_ok=$(BOOTLOADER_CLR_PART_OK) \
|
||||||
-Wl,--defsym,bootloader_set_boot_default=$(BOOTLOADER_SET_BOOT_DEFAULT) \
|
-Wl,--defsym,_bootloader_set_boot_default=$(BOOTLOADER_SET_BOOT_DEFAULT) \
|
||||||
-Wl,--defsym,bootloader_set_boot_next=$(BOOTLOADER_SET_BOOT_NEXT) \
|
-Wl,--defsym,_bootloader_set_boot_next=$(BOOTLOADER_SET_BOOT_NEXT) \
|
||||||
-Wl,--defsym,bootloader_backup_irq_table=$(BOOTLOADER_BACKUP_IRQ_TABLE) \
|
-Wl,--defsym,_bootloader_backup_irq_table=$(BOOTLOADER_BACKUP_IRQ_TABLE) \
|
||||||
-Wl,--defsym,bootloader_get_boot_default=$(BOOTLOADER_GET_BOOT_DEFAULT) \
|
-Wl,--defsym,bootloader_get_boot_default=$(BOOTLOADER_GET_BOOT_DEFAULT) \
|
||||||
-Wl,--defsym,bootloader_get_boot_next=$(BOOTLOADER_GET_BOOT_NEXT) \
|
-Wl,--defsym,bootloader_get_boot_next=$(BOOTLOADER_GET_BOOT_NEXT) \
|
||||||
-Wl,--defsym,bootloader_get_callers_part=$(BOOTLOADER_GET_CALLERS_PART) \
|
-Wl,--defsym,bootloader_get_callers_part=$(BOOTLOADER_GET_CALLERS_PART) \
|
||||||
|
|
|
@ -1,20 +1,74 @@
|
||||||
#ifndef BOOTLOADER_IF_H_
|
#ifndef BOOTLOADER_IF_H_
|
||||||
#define BOOTLOADER_IF_H_
|
#define BOOTLOADER_IF_H_
|
||||||
|
|
||||||
extern int bootloader_write_page_to_flash
|
extern uint8_t bootloader_get_mac (uint8_t);
|
||||||
|
extern uint32_t bootloader_get_part_count (void);
|
||||||
|
extern uint32_t bootloader_get_part_size (void);
|
||||||
|
extern uint32_t bootloader_get_part_start (uint32_t part_index);
|
||||||
|
extern uint32_t bootloader_get_boot_default (void);
|
||||||
|
extern uint32_t bootloader_get_boot_next (void);
|
||||||
|
extern uint32_t bootloader_get_callers_part (void);
|
||||||
|
|
||||||
|
/* These write to flash and need to turn off interrupts before start */
|
||||||
|
extern void _bootloader_set_part_ok (uint32_t part_index);
|
||||||
|
extern void _bootloader_clr_part_ok (uint32_t part_index);
|
||||||
|
extern void _bootloader_set_boot_default (uint32_t part_index);
|
||||||
|
extern void _bootloader_set_boot_next (uint32_t part_index);
|
||||||
|
extern void _bootloader_backup_irq_table (uint32_t part_index);
|
||||||
|
extern int _bootloader_write_page_to_flash
|
||||||
(uint32_t address, unsigned int size, unsigned char *p);
|
(uint32_t address, unsigned int size, unsigned char *p);
|
||||||
|
|
||||||
extern uint8_t bootloader_get_mac (uint8_t);
|
/* Wrap the routines that write to flash (see above) */
|
||||||
extern uint32_t bootloader_get_part_count (void);
|
|
||||||
extern uint32_t bootloader_get_part_size (void);
|
static inline void bootloader_set_part_ok (uint32_t part_index)
|
||||||
extern uint32_t bootloader_get_part_start (uint32_t part_index);
|
{
|
||||||
extern void bootloader_set_part_ok (uint32_t part_index);
|
uint8_t sreg = SREG;
|
||||||
extern void bootloader_clr_part_ok (uint32_t part_index);
|
cli ();
|
||||||
extern void bootloader_set_boot_default (uint32_t part_index);
|
_bootloader_set_part_ok (part_index);
|
||||||
extern void bootloader_set_boot_next (uint32_t part_index);
|
SREG = sreg;
|
||||||
extern void bootloader_backup_irq_table (uint32_t part_index);
|
}
|
||||||
extern uint32_t bootloader_get_boot_default (void);
|
|
||||||
extern uint32_t bootloader_get_boot_next (void);
|
static inline void bootloader_clr_part_ok (uint32_t part_index)
|
||||||
extern uint32_t bootloader_get_callers_part (void);
|
{
|
||||||
|
uint8_t sreg = SREG;
|
||||||
|
cli ();
|
||||||
|
_bootloader_clr_part_ok (part_index);
|
||||||
|
SREG = sreg;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void bootloader_set_boot_default (uint32_t part_index)
|
||||||
|
{
|
||||||
|
uint8_t sreg = SREG;
|
||||||
|
cli ();
|
||||||
|
_bootloader_set_boot_default (part_index);
|
||||||
|
SREG = sreg;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void bootloader_set_boot_next (uint32_t part_index)
|
||||||
|
{
|
||||||
|
uint8_t sreg = SREG;
|
||||||
|
cli ();
|
||||||
|
_bootloader_set_boot_next (part_index);
|
||||||
|
SREG = sreg;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void bootloader_backup_irq_table (uint32_t part_index)
|
||||||
|
{
|
||||||
|
uint8_t sreg = SREG;
|
||||||
|
cli ();
|
||||||
|
_bootloader_backup_irq_table (part_index);
|
||||||
|
SREG = sreg;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int bootloader_write_page_to_flash
|
||||||
|
(uint32_t address, unsigned int size, unsigned char *p)
|
||||||
|
{
|
||||||
|
int ret = 0;
|
||||||
|
uint8_t sreg = SREG;
|
||||||
|
cli ();
|
||||||
|
ret = _bootloader_write_page_to_flash (address, size, p);
|
||||||
|
SREG = sreg;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* BOOTLOADER_IF_H_ */
|
#endif /* BOOTLOADER_IF_H_ */
|
||||||
|
|
Loading…
Reference in a new issue