update chopstx
authorNIIBE Yutaka <gniibe@fsij.org>
Tue, 14 Jul 2015 07:33:29 +0000 (16:33 +0900)
committerNIIBE Yutaka <gniibe@fsij.org>
Tue, 14 Jul 2015 11:54:05 +0000 (20:54 +0900)
ChangeLog
chopstx
src/configure
src/main.c
src/neug.ld.in
src/sys.c
src/sys.h

index a64a249..8ac6249 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2015-07-14  Niibe Yutaka  <gniibe@fsij.org>
+
+       * src/{sys.c,sys.h}: Update to 2.1 from chopstx.
+       * src/main.c (main): Determine flash page size at runtime.
+
 2015-07-11  Niibe Yutaka  <gniibe@fsij.org>
 
        * src/neug.ld.in (.fill_ffff): Add ALIGN 2.
 2015-07-11  Niibe Yutaka  <gniibe@fsij.org>
 
        * src/neug.ld.in (.fill_ffff): Add ALIGN 2.
diff --git a/chopstx b/chopstx
index 2bb0e0d..27f71ff 160000 (submodule)
--- a/chopstx
+++ b/chopstx
@@ -1 +1 @@
-Subproject commit 2bb0e0de5d7d25d0bb036e6ee9cc0c94b62375ec
+Subproject commit 27f71ff5c093f740c78a28644e3be2843c660b7d
index b57e245..f0d52fb 100755 (executable)
@@ -257,7 +257,7 @@ fi
 
 if test "$sys1_compat" = "no"; then
    # Disable when you are sure that it's sys version 2.0.
 
 if test "$sys1_compat" = "no"; then
    # Disable when you are sure that it's sys version 2.0.
-   # Note that Gnuk 1.0 and Neug (until 0.06) uses sys version 1.0.
+   # Note that Gnuk 1.0 and NeuG (until 0.06) uses sys version 1.0.
    # Disabling the compatibility, executable will be target independent,
    # assuming the clock initialization will be done by SYS (before entry).
    have_sys_h="-DHAVE_SYS_H"
    # Disabling the compatibility, executable will be target independent,
    # assuming the clock initialization will be done by SYS (before entry).
    have_sys_h="-DHAVE_SYS_H"
index 26c2179..9bb31a1 100644 (file)
@@ -1042,15 +1042,20 @@ main (int argc, char **argv)
 #ifdef DFU_SUPPORT
 #define FLASH_SYS_START_ADDR 0x08000000
 #define FLASH_SYS_END_ADDR (0x08000000+0x1000)
 #ifdef DFU_SUPPORT
 #define FLASH_SYS_START_ADDR 0x08000000
 #define FLASH_SYS_END_ADDR (0x08000000+0x1000)
+#define CHIP_ID_REG ((uint32_t *)0xE0042000)
   {
     extern uint8_t _sys;
     uint32_t addr;
     handler *new_vector = (handler *)FLASH_SYS_START_ADDR;
     void (*func) (void (*)(void)) = (void (*)(void (*)(void)))new_vector[9];
   {
     extern uint8_t _sys;
     uint32_t addr;
     handler *new_vector = (handler *)FLASH_SYS_START_ADDR;
     void (*func) (void (*)(void)) = (void (*)(void (*)(void)))new_vector[9];
+    uint32_t flash_page_size = 1024; /* 1KiB default */
+
+   if ((*CHIP_ID_ADDR)&0x07 == 0x04) /* High dencity device.  */
+     flash_page_size += 0x0400; /* It's 2KiB. */
 
     /* Kill DFU */
     for (addr = FLASH_SYS_START_ADDR; addr < FLASH_SYS_END_ADDR;
 
     /* Kill DFU */
     for (addr = FLASH_SYS_START_ADDR; addr < FLASH_SYS_END_ADDR;
-        addr += FLASH_PAGE_SIZE)
+        addr += flash_page_size)
       flash_erase_page (addr);
 
     /* copy system service routines */
       flash_erase_page (addr);
 
     /* copy system service routines */
index 4b8e4c4..5212ff9 100644 (file)
@@ -14,10 +14,6 @@ MEMORY
     ram : org = 0x20000000, len = @MEMORY_SIZE@k
 }
 
     ram : org = 0x20000000, len = @MEMORY_SIZE@k
 }
 
-/* __flash_start__: flash ROM start address regardless of DFU_SUPPORT */
-__flash_start__         = 0x08001000;
-__flash_end__           = ORIGIN(flash) + LENGTH(flash);
-
 __ram_start__           = ORIGIN(ram);
 __ram_size__            = LENGTH(ram);
 __ram_end__             = __ram_start__ + __ram_size__;
 __ram_start__           = ORIGIN(ram);
 __ram_size__            = LENGTH(ram);
 __ram_end__             = __ram_start__ + __ram_size__;
@@ -28,18 +24,20 @@ SECTIONS
 
     .sys : ALIGN(4) SUBALIGN(4)
     {
 
     .sys : ALIGN(4) SUBALIGN(4)
     {
-        _sys = .;
-        KEEP(*(.vectors))
-        . = ALIGN(16);
-        *(.sys.version)
-        build/sys.o(.text)
-        build/sys.o(.text.*)
-        build/sys.o(.rodata)
-        build/sys.o(.rodata.*)
-        . = ALIGN(1024);
-        *(.sys.0)
-        *(.sys.1)
-        *(.sys.2)
+       _sys = .;
+       KEEP(*(.vectors))
+       . = ALIGN(16);
+       KEEP(*(.sys.version))
+       KEEP(*(.sys.board_id))
+       KEEP(*(.sys.board_name))
+       build/sys.o(.text)
+       build/sys.o(.text.*)
+       build/sys.o(.rodata)
+       build/sys.o(.rodata.*)
+       . = ALIGN(1024);
+       *(.sys.0)
+       *(.sys.1)
+       *(.sys.2)
     } > flash0
 
     _text = .;
     } > flash0
 
     _text = .;
@@ -131,6 +129,7 @@ SECTIONS
         PROVIDE(_bss_end = .);
     } > ram
 
         PROVIDE(_bss_end = .);
     } > ram
 
+    . = ALIGN(16);
     PROVIDE(end = .);
     _end            = .;
     . = ALIGN(512);
     PROVIDE(end = .);
     _end            = .;
     . = ALIGN(512);
@@ -141,7 +140,7 @@ SECTIONS
     {
         . = ALIGN (@FLASH_PAGE_SIZE@);
        *(.passwd)
     {
         . = ALIGN (@FLASH_PAGE_SIZE@);
        *(.passwd)
-        . = ALIGN(2);
+        . = ALIGN(4);
     } > flash =0xffffffff
 }
 
     } > flash =0xffffffff
 }
 
index 0f0c1ac..586a79f 100644 (file)
--- a/src/sys.c
+++ b/src/sys.c
@@ -243,16 +243,19 @@ flash_check_blank (const uint8_t *p_start, size_t size)
   return 1;
 }
 
   return 1;
 }
 
-extern uint8_t __flash_start__, __flash_end__;
+#define FLASH_START_ADDR 0x08000000 /* Fixed for all STM32F1.  */
+#define FLASH_OFFSET     0x1000     /* First pages are not-writable.  */
+#define FLASH_START      (FLASH_START_ADDR+FLASH_OFFSET)
+#define CHIP_ID_REG      ((uint32_t *)0xe0042000)
+#define FLASH_SIZE_REG   ((uint16_t *)0x1ffff7e0)
 
 static int
 flash_write (uint32_t dst_addr, const uint8_t *src, size_t len)
 {
   int status;
 
 static int
 flash_write (uint32_t dst_addr, const uint8_t *src, size_t len)
 {
   int status;
-  uint32_t flash_start = (uint32_t)&__flash_start__;
-  uint32_t flash_end = (uint32_t)&__flash_end__;
+  uint32_t flash_end = FLASH_START_ADDR + (*FLASH_SIZE_REG)*1024;
 
 
-  if (dst_addr < flash_start || dst_addr + len > flash_end)
+  if (dst_addr < FLASH_START || dst_addr + len > flash_end)
     return 0;
 
   while (len)
     return 0;
 
   while (len)
@@ -305,17 +308,21 @@ flash_protect (void)
 static void __attribute__((naked))
 flash_erase_all_and_exec (void (*entry)(void))
 {
 static void __attribute__((naked))
 flash_erase_all_and_exec (void (*entry)(void))
 {
-  uint32_t addr = (uint32_t)&__flash_start__;
-  uint32_t end = (uint32_t)&__flash_end__;
+  uint32_t addr = FLASH_START;
+  uint32_t end = FLASH_START_ADDR + (*FLASH_SIZE_REG)*1024;
+  uint32_t page_size = 1024;
   int r;
 
   int r;
 
+  if (((*CHIP_ID_REG) & 0xfff) == 0x0414)
+    page_size = 2048;
+
   while (addr < end)
     {
       r = flash_erase_page (addr);
       if (r != 0)
        break;
 
   while (addr < end)
     {
       r = flash_erase_page (addr);
       if (r != 0)
        break;
 
-      addr += FLASH_PAGE_SIZE;
+      addr += page_size;
     }
 
   if (addr >= end)
     }
 
   if (addr >= end)
@@ -415,7 +422,13 @@ handler vector[] __attribute__ ((section(".vectors"))) = {
 
 const uint8_t sys_version[8] __attribute__((section(".sys.version"))) = {
   3*2+2,            /* bLength */
 
 const uint8_t sys_version[8] __attribute__((section(".sys.version"))) = {
   3*2+2,            /* bLength */
-  0x03,                     /* bDescriptorType = USB_STRING_DESCRIPTOR_TYPE*/
-  /* sys version: "2.0" */
-  '2', 0, '.', 0, '0', 0,
+  0x03,                     /* bDescriptorType = USB_STRING_DESCRIPTOR_TYPE */
+  /* sys version: "2.1" */
+  '2', 0, '.', 0, '1', 0,
 };
 };
+
+const uint32_t __attribute__((section(".sys.board_id")))
+sys_board_id = BOARD_ID;
+
+const uint8_t __attribute__((section(".sys.board_name")))
+sys_board_name[] = BOARD_NAME;
index 25d33f1..3127341 100644 (file)
--- a/src/sys.h
+++ b/src/sys.h
@@ -1,4 +1,16 @@
+#define BOARD_ID_CQ_STARM          0xc5480875
+#define BOARD_ID_FST_01_00         0x613870a9
+#define BOARD_ID_FST_01            0x696886af
+#define BOARD_ID_MAPLE_MINI        0x7a445272
+#define BOARD_ID_OLIMEX_STM32_H103 0xf92bb594
+#define BOARD_ID_STBEE_MINI        0x1f341961
+#define BOARD_ID_STBEE             0x945c37e8
+#define BOARD_ID_STM32_PRIMER2     0x21e5798d
+#define BOARD_ID_STM8S_DISCOVERY   0x2f0976bb
+
 extern const uint8_t sys_version[8];
 extern const uint8_t sys_version[8];
+extern const uint32_t sys_board_id;
+extern const uint8_t sys_board_name[];
 
 typedef void (*handler)(void);
 extern handler vector[16];
 
 typedef void (*handler)(void);
 extern handler vector[16];