diff options
Diffstat (limited to 'wirish')
| -rw-r--r-- | wirish/boards.cpp | 12 | ||||
| -rw-r--r-- | wirish/syscalls.c | 18 | ||||
| -rw-r--r-- | wirish/usb_serial.cpp | 13 | 
3 files changed, 31 insertions, 12 deletions
diff --git a/wirish/boards.cpp b/wirish/boards.cpp index dbc308e..a693fa6 100644 --- a/wirish/boards.cpp +++ b/wirish/boards.cpp @@ -143,13 +143,10 @@ static void setup_clocks(void) {   * These addresses are where usercode starts when a bootloader is   * present. If no bootloader is present, the user NVIC usually starts   * at the Flash base address, 0x08000000. - * - * FIXME Let the build specify the vector table address numerically to - * avoid having these magic values -- some people have been fixing up - * the bootloader so it uses less space.   */  #define USER_ADDR_ROM 0x08005000  #define USER_ADDR_RAM 0x20000C00 +extern char __text_start__;  static void setup_nvic(void) {  #ifdef VECT_TAB_FLASH @@ -158,8 +155,13 @@ static void setup_nvic(void) {      nvic_init(USER_ADDR_RAM, 0);  #elif defined VECT_TAB_BASE      nvic_init((uint32)0x08000000, 0); +#elif defined VECT_TAB_ADDR +    // A numerically supplied value +    nvic_init((uint32)VECT_TAB_ADDR, 0);  #else -#error "You must select a base address for the vector table." +    // Use the __text_start__ value from the linker script; this +    // should be the start of the vector table. +    nvic_init((uint32)&__text_start__, 0);  #endif  } diff --git a/wirish/syscalls.c b/wirish/syscalls.c index 1e62d51..d5f2d9f 100644 --- a/wirish/syscalls.c +++ b/wirish/syscalls.c @@ -37,17 +37,18 @@  #include <sys/stat.h>  #include <errno.h> +#include <stddef.h>  /* If CONFIG_HEAP_START (or CONFIG_HEAP_END) isn't defined, then   * assume _lm_heap_start (resp. _lm_heap_end) is appropriately set by   * the linker */  #ifndef CONFIG_HEAP_START  extern char _lm_heap_start; -#define CONFIG_HEAP_START               ((caddr_t)&_lm_heap_start) +#define CONFIG_HEAP_START               ((void *)&_lm_heap_start)  #endif  #ifndef CONFIG_HEAP_END  extern char _lm_heap_end; -#define CONFIG_HEAP_END                 ((caddr_t)&_lm_heap_end) +#define CONFIG_HEAP_END                 ((void *)&_lm_heap_end)  #endif  /* @@ -56,9 +57,9 @@ extern char _lm_heap_end;   * Get incr bytes more RAM (for use by the heap).  malloc() and   * friends call this function behind the scenes.   */ -caddr_t _sbrk(int incr) { -    static caddr_t pbreak = NULL; /* current program break */ -    caddr_t ret; +void *_sbrk(int incr) { +    static void * pbreak = NULL; /* current program break */ +    void * ret;      if (pbreak == NULL) {          pbreak = CONFIG_HEAP_START; @@ -67,7 +68,7 @@ caddr_t _sbrk(int incr) {      if ((CONFIG_HEAP_END - pbreak < incr) ||          (pbreak - CONFIG_HEAP_START < -incr)) {          errno = ENOMEM; -        return (caddr_t)-1; +        return (void *)-1;      }      ret = pbreak; @@ -168,3 +169,8 @@ __weak char *fgets(char *s, int bufsize, void *f) {      cgets(s, bufsize);      return s;  } + +__weak void _exit(int exitcode) { +    while (1) +        ; +} diff --git a/wirish/usb_serial.cpp b/wirish/usb_serial.cpp index 380f197..d21766f 100644 --- a/wirish/usb_serial.cpp +++ b/wirish/usb_serial.cpp @@ -92,13 +92,24 @@ void USBSerial::write(const void *buf, uint32 len) {      uint32 old_txed = 0;      uint32 start = millis(); +    uint32 sent = 0; +      while (txed < len && (millis() - start < USB_TIMEOUT)) { -        txed += usb_cdcacm_tx((const uint8*)buf + txed, len - txed); +        sent = usb_cdcacm_tx((const uint8*)buf + txed, len - txed); +        txed += sent;          if (old_txed != txed) {              start = millis();          }          old_txed = txed;      } + + +    if (sent == USB_CDCACM_TX_EPSIZE) { +        while (usb_cdcacm_is_transmitting() != 0) { +        } +        /* flush out to avoid having the pc wait for more data */ +        usb_cdcacm_tx(NULL, 0); +    }  }  uint32 USBSerial::available(void) {  | 
