Skip to content

Commit

Permalink
Merge branch 'mainline' into TS80P-flip
Browse files Browse the repository at this point in the history
  • Loading branch information
discip authored Jun 19, 2024
2 parents 40d3979 + c157229 commit 090ff5c
Show file tree
Hide file tree
Showing 10 changed files with 174 additions and 55 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/push.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ jobs:
image: alpine:3.15
strategy:
matrix:
model: ["TS100", "TS80", "TS80P", "MHP30", "S60P", "S60"]
model: ["TS100", "TS80", "TS80P", "MHP30", "S60P", "S60", "S99"]
fail-fast: true
steps:
- name: Install dependencies (apk)
Expand Down
37 changes: 22 additions & 15 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -7,21 +7,28 @@ ifeq ($(build_type), runtime)
ifeq ($(model), S60P)
VECTOR_TABLE_OFFSET := 0x5000
SRC_LD = src/stm32f103_runtime_s60p.ld
else
ifeq ($(model), S60)
VECTOR_TABLE_OFFSET := 0x4400
SRC_LD = src/stm32f103_runtime_s60.ld
else
# For MHP30 override the runtime to offset to 32k
ifeq ($(model),"MHP30")
VECTOR_TABLE_OFFSET := 0x8000
SRC_LD = stm32f103_32k_runtime.ld
else

VECTOR_TABLE_OFFSET := 0x4000
SRC_LD = src/stm32f103_runtime.ld
endif
endif
endif

ifeq ($(model), S60)
VECTOR_TABLE_OFFSET := 0x4400
SRC_LD = src/stm32f103_runtime_s60.ld
endif

ifeq ($(model), S99)
VECTOR_TABLE_OFFSET := 0x4C00
SRC_LD = src/stm32f103_runtime_s99.ld
endif



# For MHP30 override the runtime to offset to 32k
ifeq ($(model),MHP30)
VECTOR_TABLE_OFFSET := 0x8000
SRC_LD = src/stm32f103_32k_runtime.ld
endif
ifeq ($(model),$(filter $(model), TS100 TS80 TS80P ))
VECTOR_TABLE_OFFSET := 0x4000
SRC_LD = src/stm32f103_runtime.ld
endif
BIN = runtime

Expand Down
9 changes: 8 additions & 1 deletion build_all.sh
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
!# bin/sh
#! bin/sh

set -eux

make clean
make -j build_type=bootloader model=TS100
Expand All @@ -25,3 +27,8 @@ make -j build_type=bootloader model=S60P
rm -rf build/*.o build/*.d
make -j build_type=runtime model=S60P
rm -rf build/*.o build/*.d

make -j build_type=bootloader model=S99
rm -rf build/*.o build/*.d
make -j build_type=runtime model=S99
rm -rf build/*.o build/*.d
5 changes: 5 additions & 0 deletions docs/BackUp.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,10 @@ However, we will publish known checksums of the backups so you can check if your

`sudo dfu-util -d 28e9:0189 -U backup.bin -s 0x08000000:0x5000`

### S99

`sudo dfu-util -d 28e9:0189 -U backup.bin -s 0x08000000:0x4C00`

### MHP30

`sudo dfu-util -d 28e9:0189 -U backup.bin -s 0x08000000:0x8000`
Expand Down Expand Up @@ -70,6 +74,7 @@ Known recorded MD5 checksums:
| TS80P | 3.50 | 1805EC83F64C74DD89F87A1B57B7E631 |
| TS80 | 3.45 | FADAE45B4249D4F156C30B7D4B0A853E |
| S60P | V14.00 | 631C8823D84D3F53ED80266ACE37139E |
| S99 | V12.00 | ca373fe47f4d3f736479e671c481fd6e |

In the mean time, you can validate if your backup looks valid by loading it into [hexed.it](https://hexed.it/).

Expand Down
56 changes: 38 additions & 18 deletions src/config.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,23 +5,6 @@
#define ENABLE_DFU_UPLOAD
#define ENABLE_WATCHDOG 26

#if VECTOR_TABLE_OFFSET != 0
#define SHOW_HASH
#define HASH_REGION_START FLASH_BASE_ADDR
#define HASH_REGION_END (FLASH_BASE_ADDR + (1024 * FLASH_BOOTLDR_SIZE_KB))
#define DFU_VALID_FLASH_START (FLASH_BASE_ADDR)
#define DFU_VALID_FLASH_END (FLASH_BASE_ADDR + (FLASH_BOOTLDR_SIZE_KB * 1024))
#define RUNTIME_MODE
#else
#define BOOTLOADER_MODE
#define DFU_VALID_FLASH_START (FLASH_BASE_ADDR + (FLASH_BOOTLDR_SIZE_KB * 1024))
#define DFU_VALID_FLASH_END (FLASH_BASE_ADDR + (FLASH_BOOTLDR_PAYLOAD_SIZE_KB * 1024))
// In DFU mode, we use button to enter

#define ENABLE_GPIO_DFU_BOOT

#endif

/* Commands sent with wBlockNum == 0 as per ST implementation. */
#define CMD_SETADDR 0x21
#define CMD_ERASE 0x41
Expand All @@ -36,7 +19,8 @@
#define FLASH_SIZE_KB 128
#define FLASH_BOOTLDR_SIZE_KB 16
#define FLASH_BOOTLDR_PAYLOAD_SIZE_KB 112
#elif MODEL_S60 || MODEL_S60P

#elif MODEL_S60
#define GPIO_DFU_BOOT_PORT GPIOB
#define GPIO_DFU_BOOT_PIN 0
#define GPIO_DP_PULLUP_PORT GPIOA
Expand All @@ -45,6 +29,24 @@
#define FLASH_BOOTLDR_SIZE_KB 17
#define FLASH_BOOTLDR_PAYLOAD_SIZE_KB 111

#elif MODEL_S60P
#define GPIO_DFU_BOOT_PORT GPIOB
#define GPIO_DFU_BOOT_PIN 0
#define GPIO_DP_PULLUP_PORT GPIOA
#define GPIO_DP_PULLUP_PIN 8
#define FLASH_SIZE_KB 128
#define FLASH_BOOTLDR_SIZE_KB 20
#define FLASH_BOOTLDR_PAYLOAD_SIZE_KB 108

#elif MODEL_S99
#define GPIO_DFU_BOOT_PORT GPIOB
#define GPIO_DFU_BOOT_PIN 0
#define GPIO_DP_PULLUP_PORT GPIOA
#define GPIO_DP_PULLUP_PIN 8
#define FLASH_SIZE_KB 128
#define FLASH_BOOTLDR_SIZE_KB 19
#define FLASH_BOOTLDR_PAYLOAD_SIZE_KB 109

#elif MODEL_TS80P
#define GPIO_DFU_BOOT_PORT GPIOB
#define GPIO_DFU_BOOT_PIN 1
Expand Down Expand Up @@ -82,4 +84,22 @@
#define SDA_Pin 7
#define SDA_GPIO_Port GPIOB

// Setup defines for other code so we protect writing OOB

#if VECTOR_TABLE_OFFSET != 0
#define SHOW_HASH
#define HASH_REGION_START FLASH_BASE_ADDR
#define HASH_REGION_END (FLASH_BASE_ADDR + (1024 * FLASH_BOOTLDR_SIZE_KB))
#define DFU_VALID_FLASH_START (FLASH_BASE_ADDR)
#define DFU_VALID_FLASH_END (FLASH_BASE_ADDR + (FLASH_BOOTLDR_SIZE_KB * 1024))
#define RUNTIME_MODE
#else
#define BOOTLOADER_MODE
#define DFU_VALID_FLASH_START (FLASH_BASE_ADDR + (FLASH_BOOTLDR_SIZE_KB * 1024))
#define DFU_VALID_FLASH_END (FLASH_BASE_ADDR + (FLASH_BOOTLDR_PAYLOAD_SIZE_KB * 1024))
// In DFU mode, we use button to enter

#define ENABLE_GPIO_DFU_BOOT

#endif
#endif
2 changes: 1 addition & 1 deletion src/display.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,6 @@ void display_show_version(void) {
void display_splash(void) {
// Print the splash screen directly to the OLED
oled_clearScreen();
oled_DrawArea(0, 0, 96, 16, logo_buffer);
oled_DrawArea(OLED_AREA_X, OLED_AREA_Y, 96, 16, logo_buffer);
oled_Refresh();
}
9 changes: 6 additions & 3 deletions src/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,10 @@
#include "watchdog.h"

// Payload/app comes inmediately after Bootloader
#define APP_ADDRESS (FLASH_BASE_ADDR + (FLASH_BOOTLDR_SIZE_KB)*1024)
#define APP_ADDRESS (FLASH_BASE_ADDR + (FLASH_BOOTLDR_SIZE_KB) * 1024)
#ifndef VECTOR_TABLE_OFFSET
#error MUST set VTOR
#endif

#ifdef ENABLE_PINRST_DFU_BOOT
static inline int reset_due_to_pin() { return (RCC_CSR & RCC_CSR_PINRSTF) && !(RCC_CSR & (RCC_CSR_LPWRRSTF | RCC_CSR_WWDGRSTF | RCC_CSR_IWDGRSTF | RCC_CSR_SFTRSTF | RCC_CSR_PORRSTF)); }
Expand All @@ -38,9 +41,9 @@ int main(void) {
* asked to reboot into DFU mode. This should make the CPU to
* boot into DFU if the user app has been erased. */

// Setup vector table to use out offset whatever it is
// Setup vector table to use our offset whatever it is
volatile uint32_t *_csb_vtor = (uint32_t *)0xE000ED08U;
*_csb_vtor = 0;
*_csb_vtor = VECTOR_TABLE_OFFSET;

#ifdef ENABLE_WATCHDOG
// Enable the watchdog
Expand Down
15 changes: 7 additions & 8 deletions src/oled.c
Original file line number Diff line number Diff line change
Expand Up @@ -151,12 +151,11 @@ void oled_DrawArea(uint8_t x, uint8_t y, uint8_t wide, uint8_t height, const uin
// Y is the height value (affects the bits)
// Y is either 0 or 8, we dont do smaller bit blatting
uint8_t lines = height / 8;
// We draw the 1 or two stripes seperately
for (uint8_t i = 0; i < (wide * lines); i++) {
uint8_t xp = x + (i % wide);
uint8_t yoffset = i < wide ? 0 : OLED_WIDTH;
if (y == 8)
yoffset = OLED_WIDTH;
// We draw the 1 or two stripes separately
for (uint16_t i = 0; i < (wide * lines); i++) {
uint16_t xp = x + (i % wide);

uint16_t yoffset = ((i / wide) + (y / 8)) * OLED_WIDTH;

displayBuffer[xp + yoffset] = ptr[i];
}
Expand All @@ -166,7 +165,7 @@ void oled_DrawArea(uint8_t x, uint8_t y, uint8_t wide, uint8_t height, const uin
Function:Clear_Screen
Description:Clear the entire screen to off (black)
*******************************************************************************/
void oled_clearScreen(void) { memset(displayBuffer, 0, 96 * 2); }
void oled_clearScreen(void) { memset(displayBuffer, 0, OLED_WIDTH * (OLED_HEIGHT / 8)); }

/*
* Draws a string onto the screen starting at the left
Expand Down Expand Up @@ -202,5 +201,5 @@ void OLED_DrawChar(char c, uint8_t x, const uint8_t row) {
offset *= (FONT_WIDTH * (FONT_HEIGHT / 8));
ptr += offset;

oled_DrawArea(x, row * 8, FONT_WIDTH, FONT_HEIGHT, (uint8_t *)ptr);
oled_DrawArea(OLED_AREA_X + x, OLED_AREA_Y + (row * 8), FONT_WIDTH, FONT_HEIGHT, (uint8_t *)ptr);
}
21 changes: 13 additions & 8 deletions src/oled.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,30 +5,35 @@

#define DEVICEADDR_OLED (0x3c << 1)

#if MODEL_S60 || MODEL_S60P
// TODO; for now just cropping in on the screen from 128x32 to 96x16
#define OLED_WIDTH 96
#define OLED_HEIGHT 16
#define OLED_GRAM_START 0x10 // Should be 0x00 when we have full width
#define OLED_GRAM_END 0x6F // Should be 0x7F when we have full width
#if MODEL_S60 || MODEL_S60P || MODEL_S99
#define OLED_AREA_X 16
#define OLED_AREA_Y 8
#define OLED_WIDTH 128
#define OLED_HEIGHT 32
#define OLED_GRAM_START 0x00
#define OLED_GRAM_END 0x7F
#define OLED_VCOM_LAYOUT 0x12
#define OLED_SEGMENT_MAP 0xA1
#else

#define OLED_AREA_X 0
#define OLED_AREA_Y 0
#define OLED_WIDTH 96
#define OLED_HEIGHT 16
#define OLED_VCOM_LAYOUT 0x02

#ifdef OLED_FLIP
#define OLED_GRAM_START 0 // Should be 0x00 when we have full width
#define OLED_GRAM_START 0 // Aligned to top left of buffer
#define OLED_GRAM_END 95
#define OLED_SEGMENT_MAP 0xA1
#else
#define OLED_GRAM_START 0x20 // Should be 0x00 when we have full width
#define OLED_GRAM_START 0x20 // Align to bottom right of buffer
#define OLED_GRAM_END 0x7F
#define OLED_SEGMENT_MAP 0xA0
#endif

#endif

#define FRAMEBUFFER_START 17

// Run OLED init
Expand Down
73 changes: 73 additions & 0 deletions src/stm32f103_runtime_s99.ld
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
/*
* This file is part of the libopenstm32 project.
*
* Copyright (C) 2010 Thomas Otto <[email protected]>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/

/* Define memory regions. */
MEMORY
{
rom (rx) : ORIGIN = 0x08004C00, LENGTH = 19K
ram (rwx) : ORIGIN = 0x20000000, LENGTH = 8k
}

/* Enforce emmition of the vector table. */
EXTERN (vector_table)

/* Define the entry point of the output file. */
ENTRY(reset_handler)

/* Define sections. */
SECTIONS
{
.text : {
*(.vectors) /* Vector table */
*(.text*) /* Program code */
. = ALIGN(4);
*(.rodata*) /* Read-only data */
. = ALIGN(4);
} >rom

_etext = .;

.data : {
_data = .;
*(.data*) /* Read-write initialized data */
. = ALIGN(4);
_edata = .;
} >ram AT >rom
_data_loadaddr = LOADADDR(.data);

.bss : {
*(.bss*) /* Read-write zero initialized data */
*(COMMON)
. = ALIGN(4);
_ebss = .;
} >ram

/*
* The .eh_frame section appears to be used for C++ exception handling.
* You may need to fix this if you're using C++.
*/
/DISCARD/ : { *(.eh_frame) }

. = ALIGN(4);
end = .;
}

PROVIDE(_stack = ORIGIN(ram) + LENGTH(ram));


0 comments on commit 090ff5c

Please sign in to comment.