Remove obsolete target. Cleanup and update ReadMe. (#279)
This commit is contained in:
		
							parent
							
								
									14d1325b17
								
							
						
					
					
						commit
						4a9e4074f7
					
				| @ -30,9 +30,9 @@ You can run firmware locally (with HAL stub): | |||||||
| * `docker-compose exec dev make -C firmware TARGET=local APP_TEST=1 run` for running tests | * `docker-compose exec dev make -C firmware TARGET=local APP_TEST=1 run` for running tests | ||||||
| * `docker-compose exec dev make -C firmware TARGET=local APP_*=1 run` for running examples (see `applications/applications.mk` for list of applications/examples) | * `docker-compose exec dev make -C firmware TARGET=local APP_*=1 run` for running examples (see `applications/applications.mk` for list of applications/examples) | ||||||
| 
 | 
 | ||||||
| Or you can use your dev. board: | Or on your flipper: | ||||||
| 
 | 
 | ||||||
| `docker-compose exec dev make -C firmware TARGET=f2 APP_*=1 flash` for build and flash dev board (see `applications/applications.mk` for list of applications/examples) | `docker-compose exec dev make -C firmware TARGET=f4 APP_*=1 flash` for build and flash dev board (see `applications/applications.mk` for list of applications/examples) | ||||||
| 
 | 
 | ||||||
| # Links | # Links | ||||||
| * Task tracker: [Jira](https://flipperzero.atlassian.net/) | * Task tracker: [Jira](https://flipperzero.atlassian.net/) | ||||||
| @ -3,20 +3,22 @@ | |||||||
| What it does? | What it does? | ||||||
| 
 | 
 | ||||||
| - [+] Hardware initialization | - [+] Hardware initialization | ||||||
| - [ ] Firmware CRC check |  | ||||||
| - [+] Firmware update |  | ||||||
| - [ ] Interactive UI |  | ||||||
| - [+] Boot process LED indicators | - [+] Boot process LED indicators | ||||||
|  | - [+] Firmware update | ||||||
|  | - [ ] Firmware CRC check | ||||||
|  | - [ ] Interactive UI | ||||||
| - [ ] FS check | - [ ] FS check | ||||||
| - [ ] Recovery mode | - [ ] Recovery mode | ||||||
|  | - [ ] Errata crutches | ||||||
| 
 | 
 | ||||||
| # Targets | # Targets | ||||||
| 
 | 
 | ||||||
| | Name      | Bootloader    | Firmware      | Reset     | DFU               | | | Name      | Bootloader    | Firmware      | Reset     | DFU               | | ||||||
| |           | Address       | Address       | Combo     | Combo             | | |           | Address       | Address       | Combo     | Combo             | | ||||||
| --------------------------------------------------------------------- | ----------------------------------------------------------------------------- | ||||||
| | f2        | 0x08000000    | 0x00008000    | L+R   | L+R, hold R   | | | f4        | 0x08000000    | 0x00008000    | L+Back    | L+Back, hold L    | | ||||||
| 
 | 
 | ||||||
|  | Also there is a ST bootloader combo available on empty device: L+Ok+Back, release Back,Left. | ||||||
| Target independend code and headers in `src`and `target/include` folders. | Target independend code and headers in `src`and `target/include` folders. | ||||||
| 
 | 
 | ||||||
| # Building | # Building | ||||||
| @ -27,21 +29,25 @@ Target independend code and headers in `src`and `target/include` folders. | |||||||
| 
 | 
 | ||||||
| ## With toolchain installed in path: | ## With toolchain installed in path: | ||||||
| 
 | 
 | ||||||
| `make` | `make -C bootloader ` | ||||||
| 
 | 
 | ||||||
| ## Build Options | ## Build Options | ||||||
| 
 | 
 | ||||||
| - `DEBUG` - 0/1 - enable or disable debug build. Default is 1. | - `DEBUG` - 0/1 - enable or disable debug build. Default is 1. | ||||||
| - `TARGET` - string - target to build. Default is `f2`. | - `TARGET` - string - target to build. Default is `f4`. | ||||||
| 
 | 
 | ||||||
| # Flashing  | # Flashing  | ||||||
| 
 | 
 | ||||||
| Using stlink(st-flash): | Using stlink(st-flash): | ||||||
| 
 | 
 | ||||||
| `make flash` | `make -C bootloader flash` | ||||||
|  | 
 | ||||||
|  | Or use ST bootloader: | ||||||
|  | 
 | ||||||
|  | `make -C bootloader upload` | ||||||
| 
 | 
 | ||||||
| # Debug | # Debug | ||||||
| 
 | 
 | ||||||
| Using stlink (st-util + gdb): | Using stlink (st-util + gdb): | ||||||
| 
 | 
 | ||||||
| `make debug` | `make -C bootloader  debug` | ||||||
|  | |||||||
| @ -1,204 +0,0 @@ | |||||||
| /* |  | ||||||
| ****************************************************************************** |  | ||||||
| ** |  | ||||||
| 
 |  | ||||||
| **  File        : LinkerScript.ld |  | ||||||
| ** |  | ||||||
| **  Author		: Auto-generated by System Workbench for STM32 |  | ||||||
| ** |  | ||||||
| **  Abstract    : Linker script for STM32L476RGTx series |  | ||||||
| **                1024Kbytes FLASH and 128Kbytes RAM |  | ||||||
| ** |  | ||||||
| **                Set heap size, stack size and stack location according |  | ||||||
| **                to application requirements. |  | ||||||
| ** |  | ||||||
| **                Set memory bank area and size if external memory is used. |  | ||||||
| ** |  | ||||||
| **  Target      : STMicroelectronics STM32 |  | ||||||
| ** |  | ||||||
| **  Distribution: The file is distributed “as is,” without any warranty |  | ||||||
| **                of any kind. |  | ||||||
| ** |  | ||||||
| ***************************************************************************** |  | ||||||
| ** @attention |  | ||||||
| ** |  | ||||||
| ** <h2><center>© COPYRIGHT(c) 2019 STMicroelectronics</center></h2> |  | ||||||
| ** |  | ||||||
| ** Redistribution and use in source and binary forms, with or without modification, |  | ||||||
| ** are permitted provided that the following conditions are met: |  | ||||||
| **   1. Redistributions of source code must retain the above copyright notice, |  | ||||||
| **      this list of conditions and the following disclaimer. |  | ||||||
| **   2. Redistributions in binary form must reproduce the above copyright notice, |  | ||||||
| **      this list of conditions and the following disclaimer in the documentation |  | ||||||
| **      and/or other materials provided with the distribution. |  | ||||||
| **   3. Neither the name of STMicroelectronics nor the names of its contributors |  | ||||||
| **      may be used to endorse or promote products derived from this software |  | ||||||
| **      without specific prior written permission. |  | ||||||
| ** |  | ||||||
| ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |  | ||||||
| ** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |  | ||||||
| ** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |  | ||||||
| ** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE |  | ||||||
| ** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |  | ||||||
| ** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR |  | ||||||
| ** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER |  | ||||||
| ** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |  | ||||||
| ** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |  | ||||||
| ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |  | ||||||
| ** |  | ||||||
| ***************************************************************************** |  | ||||||
| */ |  | ||||||
| 
 |  | ||||||
| /* Entry Point */ |  | ||||||
| ENTRY(Reset_Handler) |  | ||||||
| 
 |  | ||||||
| /* Highest address of the user mode stack */ |  | ||||||
| _estack = 0x20018000;    /* end of RAM */ |  | ||||||
| /* Generate a link error if heap and stack don't fit into RAM */ |  | ||||||
| _Min_Heap_Size = 0x200;      /* required amount of heap  */ |  | ||||||
| _Min_Stack_Size = 0x400; /* required amount of stack */ |  | ||||||
| 
 |  | ||||||
| /* Specify the memory areas */ |  | ||||||
| MEMORY |  | ||||||
| { |  | ||||||
| RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 96K |  | ||||||
| RAM2 (xrw)      : ORIGIN = 0x10000000, LENGTH = 32K |  | ||||||
| FLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 1024K |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /* Define output sections */ |  | ||||||
| SECTIONS |  | ||||||
| { |  | ||||||
|   /* The startup code goes first into FLASH */ |  | ||||||
|   .isr_vector : |  | ||||||
|   { |  | ||||||
|     . = ALIGN(8); |  | ||||||
|     KEEP(*(.isr_vector)) /* Startup code */ |  | ||||||
|     . = ALIGN(8); |  | ||||||
|   } >FLASH |  | ||||||
| 
 |  | ||||||
|   /* The program code and other data goes into FLASH */ |  | ||||||
|   .text : |  | ||||||
|   { |  | ||||||
|     . = ALIGN(8); |  | ||||||
|     *(.text)           /* .text sections (code) */ |  | ||||||
|     *(.text*)          /* .text* sections (code) */ |  | ||||||
|     *(.glue_7)         /* glue arm to thumb code */ |  | ||||||
|     *(.glue_7t)        /* glue thumb to arm code */ |  | ||||||
|     *(.eh_frame) |  | ||||||
| 
 |  | ||||||
|     KEEP (*(.init)) |  | ||||||
|     KEEP (*(.fini)) |  | ||||||
| 
 |  | ||||||
|     . = ALIGN(8); |  | ||||||
|     _etext = .;        /* define a global symbols at end of code */ |  | ||||||
|   } >FLASH |  | ||||||
| 
 |  | ||||||
|   /* Constant data goes into FLASH */ |  | ||||||
|   .rodata : |  | ||||||
|   { |  | ||||||
|     . = ALIGN(8); |  | ||||||
|     *(.rodata)         /* .rodata sections (constants, strings, etc.) */ |  | ||||||
|     *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */ |  | ||||||
|     . = ALIGN(8); |  | ||||||
|   } >FLASH |  | ||||||
| 
 |  | ||||||
|   .ARM.extab   :  |  | ||||||
|   {  |  | ||||||
|   . = ALIGN(8); |  | ||||||
|   *(.ARM.extab* .gnu.linkonce.armextab.*) |  | ||||||
|   . = ALIGN(8); |  | ||||||
|   } >FLASH |  | ||||||
|   .ARM : { |  | ||||||
| 	. = ALIGN(8); |  | ||||||
|     __exidx_start = .; |  | ||||||
|     *(.ARM.exidx*) |  | ||||||
|     __exidx_end = .; |  | ||||||
| 	. = ALIGN(8); |  | ||||||
|   } >FLASH |  | ||||||
| 
 |  | ||||||
|   .preinit_array     : |  | ||||||
|   { |  | ||||||
| 	. = ALIGN(8); |  | ||||||
|     PROVIDE_HIDDEN (__preinit_array_start = .); |  | ||||||
|     KEEP (*(.preinit_array*)) |  | ||||||
|     PROVIDE_HIDDEN (__preinit_array_end = .); |  | ||||||
| 	. = ALIGN(8); |  | ||||||
|   } >FLASH |  | ||||||
|    |  | ||||||
|   .init_array : |  | ||||||
|   { |  | ||||||
| 	. = ALIGN(8); |  | ||||||
|     PROVIDE_HIDDEN (__init_array_start = .); |  | ||||||
|     KEEP (*(SORT(.init_array.*))) |  | ||||||
|     KEEP (*(.init_array*)) |  | ||||||
|     PROVIDE_HIDDEN (__init_array_end = .); |  | ||||||
| 	. = ALIGN(8); |  | ||||||
|   } >FLASH |  | ||||||
|   .fini_array : |  | ||||||
|   { |  | ||||||
| 	. = ALIGN(8); |  | ||||||
|     PROVIDE_HIDDEN (__fini_array_start = .); |  | ||||||
|     KEEP (*(SORT(.fini_array.*))) |  | ||||||
|     KEEP (*(.fini_array*)) |  | ||||||
|     PROVIDE_HIDDEN (__fini_array_end = .); |  | ||||||
| 	. = ALIGN(8); |  | ||||||
|   } >FLASH |  | ||||||
| 
 |  | ||||||
|   /* used by the startup to initialize data */ |  | ||||||
|   _sidata = LOADADDR(.data); |  | ||||||
| 
 |  | ||||||
|   /* Initialized data sections goes into RAM, load LMA copy after code */ |  | ||||||
|   .data :  |  | ||||||
|   { |  | ||||||
|     . = ALIGN(8); |  | ||||||
|     _sdata = .;        /* create a global symbol at data start */ |  | ||||||
|     *(.data)           /* .data sections */ |  | ||||||
|     *(.data*)          /* .data* sections */ |  | ||||||
| 
 |  | ||||||
|     . = ALIGN(8); |  | ||||||
|     _edata = .;        /* define a global symbol at data end */ |  | ||||||
|   } >RAM AT> FLASH |  | ||||||
| 
 |  | ||||||
|    |  | ||||||
|   /* Uninitialized data section */ |  | ||||||
|   . = ALIGN(4); |  | ||||||
|   .bss : |  | ||||||
|   { |  | ||||||
|     /* This is used by the startup in order to initialize the .bss secion */ |  | ||||||
|     _sbss = .;         /* define a global symbol at bss start */ |  | ||||||
|     __bss_start__ = _sbss; |  | ||||||
|     *(.bss) |  | ||||||
|     *(.bss*) |  | ||||||
|     *(COMMON) |  | ||||||
| 
 |  | ||||||
|     . = ALIGN(4); |  | ||||||
|     _ebss = .;         /* define a global symbol at bss end */ |  | ||||||
|     __bss_end__ = _ebss; |  | ||||||
|   } >RAM |  | ||||||
| 
 |  | ||||||
|   /* User_heap_stack section, used to check that there is enough RAM left */ |  | ||||||
|   ._user_heap_stack : |  | ||||||
|   { |  | ||||||
|     . = ALIGN(8); |  | ||||||
|     PROVIDE ( end = . ); |  | ||||||
|     PROVIDE ( _end = . ); |  | ||||||
|     . = . + _Min_Heap_Size; |  | ||||||
|     . = . + _Min_Stack_Size; |  | ||||||
|     . = ALIGN(8); |  | ||||||
|   } >RAM |  | ||||||
| 
 |  | ||||||
|    |  | ||||||
| 
 |  | ||||||
|   /* Remove information from the standard libraries */ |  | ||||||
|   /DISCARD/ : |  | ||||||
|   { |  | ||||||
|     libc.a ( * ) |  | ||||||
|     libm.a ( * ) |  | ||||||
|     libgcc.a ( * ) |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   .ARM.attributes 0 : { *(.ARM.attributes) } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| @ -1,154 +0,0 @@ | |||||||
| #include <target.h> |  | ||||||
| #include <stm32l4xx.h> |  | ||||||
| #include <stm32l4xx_ll_system.h> |  | ||||||
| #include <stm32l4xx_ll_bus.h> |  | ||||||
| #include <stm32l4xx_ll_utils.h> |  | ||||||
| #include <stm32l4xx_ll_rcc.h> |  | ||||||
| #include <stm32l4xx_ll_rtc.h> |  | ||||||
| #include <stm32l4xx_ll_pwr.h> |  | ||||||
| #include <stm32l4xx_ll_gpio.h> |  | ||||||
| 
 |  | ||||||
| // Boot request enum
 |  | ||||||
| #define BOOT_REQUEST_NONE 0x00000000 |  | ||||||
| #define BOOT_REQUEST_DFU 0xDF00B000 |  | ||||||
| // Boot to DFU pin
 |  | ||||||
| #define BOOT_DFU_PORT GPIOB |  | ||||||
| #define BOOT_DFU_PIN LL_GPIO_PIN_8 |  | ||||||
| // LCD backlight
 |  | ||||||
| #define BOOT_LCD_BL_PORT GPIOB |  | ||||||
| #define BOOT_LCD_BL_PIN LL_GPIO_PIN_6 |  | ||||||
| // LEDs
 |  | ||||||
| #define LED_RED_PORT GPIOA |  | ||||||
| #define LED_RED_PIN LL_GPIO_PIN_8 |  | ||||||
| #define LED_GREEN_PORT GPIOB |  | ||||||
| #define LED_GREEN_PIN LL_GPIO_PIN_14 |  | ||||||
| #define LED_BLUE_PORT GPIOB |  | ||||||
| #define LED_BLUE_PIN LL_GPIO_PIN_1 |  | ||||||
| // USB pins
 |  | ||||||
| #define BOOT_USB_PORT GPIOA |  | ||||||
| #define BOOT_USB_DM_PIN LL_GPIO_PIN_11 |  | ||||||
| #define BOOT_USB_DP_PIN LL_GPIO_PIN_12 |  | ||||||
| #define BOOT_USB_PIN (BOOT_USB_DM_PIN | BOOT_USB_DP_PIN) |  | ||||||
| 
 |  | ||||||
| void clock_init() { |  | ||||||
|     LL_FLASH_SetLatency(LL_FLASH_LATENCY_4); |  | ||||||
|     LL_RCC_MSI_Enable(); |  | ||||||
|     while(LL_RCC_MSI_IsReady() != 1) { |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /* Main PLL configuration and activation */ |  | ||||||
|     LL_RCC_PLL_ConfigDomain_SYS(LL_RCC_PLLSOURCE_MSI, LL_RCC_PLLM_DIV_1, 40, LL_RCC_PLLR_DIV_2); |  | ||||||
|     LL_RCC_PLL_Enable(); |  | ||||||
|     LL_RCC_PLL_EnableDomain_SYS(); |  | ||||||
|     while(LL_RCC_PLL_IsReady() != 1) { |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /* Sysclk activation on the main PLL */ |  | ||||||
|     LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_1); |  | ||||||
|     LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_PLL); |  | ||||||
|     while(LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_PLL) { |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     /* Set APB1 & APB2 prescaler*/ |  | ||||||
|     LL_RCC_SetAPB1Prescaler(LL_RCC_APB1_DIV_1); |  | ||||||
|     LL_RCC_SetAPB2Prescaler(LL_RCC_APB2_DIV_1); |  | ||||||
| 
 |  | ||||||
|     /* Set systick to 1ms in using frequency set to 80MHz */ |  | ||||||
|     /* This frequency can be calculated through LL RCC macro */ |  | ||||||
|     /* ex: __LL_RCC_CALC_PLLCLK_FREQ(__LL_RCC_CALC_MSI_FREQ(LL_RCC_MSIRANGESEL_RUN, LL_RCC_MSIRANGE_6), 
 |  | ||||||
|                                     LL_RCC_PLLM_DIV_1, 40, LL_RCC_PLLR_DIV_2)*/ |  | ||||||
|     LL_Init1msTick(80000000); |  | ||||||
| 
 |  | ||||||
|     /* Update CMSIS variable (which can be updated also through SystemCoreClockUpdate function) */ |  | ||||||
|     LL_SetSystemCoreClock(80000000); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void gpio_init() { |  | ||||||
|     LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOA); |  | ||||||
|     LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOB); |  | ||||||
|     // USB D+
 |  | ||||||
|     LL_GPIO_SetPinMode(BOOT_USB_PORT, BOOT_USB_DP_PIN, LL_GPIO_MODE_OUTPUT); |  | ||||||
|     LL_GPIO_SetPinSpeed(BOOT_USB_PORT, BOOT_USB_DP_PIN, LL_GPIO_SPEED_FREQ_VERY_HIGH); |  | ||||||
|     LL_GPIO_SetPinOutputType(BOOT_USB_PORT, BOOT_USB_DP_PIN, LL_GPIO_OUTPUT_OPENDRAIN); |  | ||||||
|     // USB D-
 |  | ||||||
|     LL_GPIO_SetPinMode(BOOT_USB_PORT, BOOT_USB_DM_PIN, LL_GPIO_MODE_OUTPUT); |  | ||||||
|     LL_GPIO_SetPinSpeed(BOOT_USB_PORT, BOOT_USB_DM_PIN, LL_GPIO_SPEED_FREQ_VERY_HIGH); |  | ||||||
|     LL_GPIO_SetPinOutputType(BOOT_USB_PORT, BOOT_USB_DM_PIN, LL_GPIO_OUTPUT_OPENDRAIN); |  | ||||||
|     // Button: back
 |  | ||||||
|     LL_GPIO_SetPinMode(BOOT_DFU_PORT, BOOT_DFU_PIN, LL_GPIO_MODE_INPUT); |  | ||||||
|     LL_GPIO_SetPinPull(BOOT_DFU_PORT, BOOT_DFU_PIN, LL_GPIO_PULL_DOWN); |  | ||||||
|     // Display backlight
 |  | ||||||
|     LL_GPIO_SetPinMode(BOOT_LCD_BL_PORT, BOOT_LCD_BL_PIN, LL_GPIO_MODE_OUTPUT); |  | ||||||
|     LL_GPIO_SetPinSpeed(BOOT_LCD_BL_PORT, BOOT_LCD_BL_PIN, LL_GPIO_SPEED_FREQ_LOW); |  | ||||||
|     LL_GPIO_SetPinOutputType(BOOT_LCD_BL_PORT, BOOT_LCD_BL_PIN, LL_GPIO_OUTPUT_PUSHPULL); |  | ||||||
|     // LEDs
 |  | ||||||
|     LL_GPIO_SetPinMode(LED_RED_PORT, LED_RED_PIN, LL_GPIO_MODE_OUTPUT); |  | ||||||
|     LL_GPIO_SetPinOutputType(LED_RED_PORT, LED_RED_PIN, LL_GPIO_OUTPUT_OPENDRAIN); |  | ||||||
|     LL_GPIO_SetOutputPin(LED_RED_PORT, LED_RED_PIN); |  | ||||||
|     LL_GPIO_SetPinMode(LED_GREEN_PORT, LED_GREEN_PIN, LL_GPIO_MODE_OUTPUT); |  | ||||||
|     LL_GPIO_SetPinOutputType(LED_GREEN_PORT, LED_GREEN_PIN, LL_GPIO_OUTPUT_OPENDRAIN); |  | ||||||
|     LL_GPIO_SetOutputPin(LED_GREEN_PORT, LED_GREEN_PIN); |  | ||||||
|     LL_GPIO_SetPinMode(LED_BLUE_PORT, LED_BLUE_PIN, LL_GPIO_MODE_OUTPUT); |  | ||||||
|     LL_GPIO_SetPinOutputType(LED_BLUE_PORT, LED_BLUE_PIN, LL_GPIO_OUTPUT_OPENDRAIN); |  | ||||||
|     LL_GPIO_SetOutputPin(LED_BLUE_PORT, LED_BLUE_PIN); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void rtc_init() { |  | ||||||
|     LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_PWR); |  | ||||||
|     LL_PWR_EnableBkUpAccess(); |  | ||||||
|     LL_RCC_EnableRTC(); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void lcd_backlight_on() { |  | ||||||
|     LL_GPIO_SetOutputPin(BOOT_LCD_BL_PORT, BOOT_LCD_BL_PIN); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void usb_wire_reset() { |  | ||||||
|     LL_GPIO_ResetOutputPin(BOOT_USB_PORT, BOOT_USB_PIN); |  | ||||||
|     LL_mDelay(10); |  | ||||||
|     LL_GPIO_SetOutputPin(BOOT_USB_PORT, BOOT_USB_PIN); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void target_init() { |  | ||||||
|     clock_init(); |  | ||||||
|     rtc_init(); |  | ||||||
|     gpio_init(); |  | ||||||
| 
 |  | ||||||
|     usb_wire_reset(); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| int target_is_dfu_requested() { |  | ||||||
|     if(LL_RTC_BAK_GetRegister(RTC, LL_RTC_BKP_DR0) == BOOT_REQUEST_DFU) { |  | ||||||
|         LL_RTC_BAK_SetRegister(RTC, LL_RTC_BKP_DR0, BOOT_REQUEST_NONE); |  | ||||||
|         return 1; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     if(LL_GPIO_IsInputPinSet(BOOT_DFU_PORT, BOOT_DFU_PIN)) { |  | ||||||
|         return 1; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     return 0; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void target_switch(void* offset) { |  | ||||||
|     asm volatile("ldr    r3, [%0]    \n" |  | ||||||
|                  "msr    msp, r3     \n" |  | ||||||
|                  "ldr    r3, [%1]    \n" |  | ||||||
|                  "mov    pc, r3      \n" |  | ||||||
|                  : |  | ||||||
|                  : "r"(offset), "r"(offset + 0x4) |  | ||||||
|                  : "r3"); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void target_switch2dfu() { |  | ||||||
|     LL_GPIO_ResetOutputPin(LED_BLUE_PORT, LED_BLUE_PIN); |  | ||||||
|     // Remap memory to system bootloader
 |  | ||||||
|     LL_SYSCFG_SetRemapMemory(LL_SYSCFG_REMAP_SYSTEMFLASH); |  | ||||||
|     target_switch(0x0); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void target_switch2os() { |  | ||||||
|     LL_GPIO_ResetOutputPin(LED_RED_PORT, LED_RED_PIN); |  | ||||||
|     SCB->VTOR = BOOT_ADDRESS + OS_OFFSET; |  | ||||||
|     target_switch((void*)(BOOT_ADDRESS + OS_OFFSET)); |  | ||||||
| } |  | ||||||
| @ -1,30 +0,0 @@ | |||||||
| TOOLCHAIN = arm |  | ||||||
| 
 |  | ||||||
| BOOT_ADDRESS	= 0x08000000 |  | ||||||
| FW_ADDRESS		= 0x08008000 |  | ||||||
| OS_OFFSET		= 0x00008000 |  | ||||||
| FLASH_ADDRESS	= 0x08000000 |  | ||||||
| 
 |  | ||||||
| OPENOCD_OPTS	= -f interface/stlink.cfg -c "transport select hla_swd" -f target/stm32l4x.cfg -c "init" -c "adapter speed 4000" |  | ||||||
| BOOT_CFLAGS		= -DBOOT_ADDRESS=$(BOOT_ADDRESS) -DFW_ADDRESS=$(FW_ADDRESS) -DOS_OFFSET=$(OS_OFFSET) |  | ||||||
| MCU_FLAGS		= -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard |  | ||||||
| 
 |  | ||||||
| CFLAGS			+= $(MCU_FLAGS) $(BOOT_CFLAGS) -DSTM32L476xx -Wall -fdata-sections -ffunction-sections |  | ||||||
| LDFLAGS			+= $(MCU_FLAGS) -specs=nosys.specs -specs=nano.specs |  | ||||||
| 
 |  | ||||||
| CUBE_DIR		= ../lib/STM32CubeL4 |  | ||||||
| CUBE_CMSIS_DIR	= $(CUBE_DIR)/Drivers/CMSIS |  | ||||||
| CUBE_HAL_DIR	= $(CUBE_DIR)/Drivers/STM32L4xx_HAL_Driver |  | ||||||
| 
 |  | ||||||
| ASM_SOURCES		+= $(CUBE_CMSIS_DIR)/Device/ST/STM32L4xx/Source/Templates/gcc/startup_stm32l476xx.s |  | ||||||
| C_SOURCES		+= $(CUBE_CMSIS_DIR)/Device/ST/STM32L4xx/Source/Templates/system_stm32l4xx.c |  | ||||||
| C_SOURCES		+= $(CUBE_HAL_DIR)/Src/stm32l4xx_ll_utils.c |  | ||||||
| 
 |  | ||||||
| CFLAGS			+= -I$(CUBE_CMSIS_DIR)/Include |  | ||||||
| CFLAGS			+= -I$(CUBE_CMSIS_DIR)/Device/ST/STM32L4xx/Include |  | ||||||
| CFLAGS			+= -I$(CUBE_HAL_DIR)/Inc |  | ||||||
| LDFLAGS			+= -Ttargets/f2/STM32L476RGTx_FLASH.ld |  | ||||||
| 
 |  | ||||||
| ASM_SOURCES		+= $(wildcard $(TARGET_DIR)/*.s) |  | ||||||
| C_SOURCES		+= $(wildcard $(TARGET_DIR)/*.c) |  | ||||||
| CPP_SOURCES		+= $(wildcard $(TARGET_DIR)/*.cpp) |  | ||||||
							
								
								
									
										62032
									
								
								debug/STM32L4x6.svd
									
									
									
									
									
								
							
							
						
						
									
										62032
									
								
								debug/STM32L4x6.svd
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @ -1,77 +1,52 @@ | |||||||
| _Overview of Flipper firmware architecture:_ |  | ||||||
| 
 |  | ||||||
|  |  | ||||||
| 
 |  | ||||||
| # Project structure | # Project structure | ||||||
| 
 | 
 | ||||||
| ``` | ``` | ||||||
| . | . | ||||||
| ├── applications    # Flipper applications | ├── applications    # Flipper applications | ||||||
|  | ├── assets          # Assets: icons, animation | ||||||
| ├── bootloader      # Bootloader make project | ├── bootloader      # Bootloader make project | ||||||
| ├── core            # Main feature like OS, HAL (target-independed) | ├── core            # Main feature like OS, HAL (target-independed) | ||||||
| ├── core-rs         # Rust code | ├── core-rs         # Rust code | ||||||
|  | ├── debug           # Debug helpers, configs and plugins | ||||||
| ├── docker          # Docker toolchain container | ├── docker          # Docker toolchain container | ||||||
| ├── firmware        # Firmware make project | ├── firmware        # Firmware make project | ||||||
| ├── lib             # Libs and 3rd parties | ├── lib             # Libs and 3rd parties | ||||||
| ├── make            # Makefile scripts | ├── make            # Makefile scripts | ||||||
| ├── wiki            # Documentation (wiki) generates from this files |  | ||||||
| └── wiki_static     # Static files for wiki |  | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| # HAL |  | ||||||
| 
 |  | ||||||
| We use STM32 HAL/LL. Description available here: [dm00105879.pdf](https://github.com/Flipper-Zero/flipperzero-firmware-community/raw/master/wiki_static/dm00105879-description-of-stm32f4-hal-and-ll-drivers-stmicroelectronics.pdf) |  | ||||||
| 
 |  | ||||||
| ## Flipper HAL |  | ||||||
| 
 |  | ||||||
| Some flipper-specific implementation of gpio/HAL: |  | ||||||
| 
 |  | ||||||
| * Init gpio pin: `app_gpio_init` |  | ||||||
| * Fast write gpio (inline): `app_gpio_write` |  | ||||||
| * Fast read gpio (inline): `app_gpio_read` |  | ||||||
| * Microsecond delay `delay_us` |  | ||||||
| * Set PWM on timer's pin: `pwm_set` |  | ||||||
| 
 |  | ||||||
| Files location: `/app/app_hal.[ch]` |  | ||||||
| 
 |  | ||||||
| # Bootloader | # Bootloader | ||||||
| 
 | 
 | ||||||
| For production targets('f2' and newer) bootloader must be flashed first. | Bootloader must be flashed first. | ||||||
| Detailed instruction on how to compile and flash it you can find in `bootloader` folder. | Detailed instruction on how to compile and flash it you can find in `bootloader` folder. | ||||||
| 
 | 
 | ||||||
| Production version is going to have following features: |  | ||||||
| 
 |  | ||||||
| - Hardware initialization |  | ||||||
| - Firmware CRC check |  | ||||||
| - Firmware update |  | ||||||
| - Interactive UI |  | ||||||
| - Boot process LED indicators |  | ||||||
| - FS check |  | ||||||
| - Recovery mode |  | ||||||
| 
 |  | ||||||
| # OS | # OS | ||||||
| 
 | 
 | ||||||
| CMSIS-RTOS2 over FreeRTOS | CMSIS-RTOS2 over FreeRTOS | ||||||
| 
 | 
 | ||||||
| **[Timers map](Timers)** | ## Platform code | ||||||
| 
 |  | ||||||
| # Platform code |  | ||||||
| 
 | 
 | ||||||
| CMSIS, Freertos and HAL files are generated by CubeMX. | CMSIS, Freertos and HAL files are generated by CubeMX. | ||||||
| You can find platform code for L476 version in `f2` folder: | You can find platform code for STM32WB55 version in `f4` folder: | ||||||
| 
 | 
 | ||||||
| * `Inc` `Src` — CubeMX generated headers & code | ``` | ||||||
| * `Middlewares/Third_Party/FreeRTOS/Source` — freeRTOS | ├── Inc                             # CubeMX generated headers | ||||||
| * `deploy.sh` — flash firmware to device | ├── Src                             # CubeMX generated code | ||||||
| * `STM32L476RGTx_FLASH.ld` — linker script | ├── api-hal                         # Our HAL wrappers and platform specifics | ||||||
| * `startup_stm32l476xx.s` — board startup/initialization assembler code | ├── ble-glue                        # BLE specific code(Glue for STMWPAN) | ||||||
| * `cube.ioc` — CubeMX project file | ├── f4.ioc                          # CubeMX project file | ||||||
|  | ├── startup_stm32wb55xx_cm4.s       # Board startup/initialization assembler code | ||||||
|  | ├── stm32wb55xx_flash_cm4*.ld       # Linker scripts | ||||||
|  | ├── target.mk                       # Makefile include | ||||||
| 
 | 
 | ||||||
| You can regenerate platform code: | ``` | ||||||
|  | 
 | ||||||
|  | Working with CubeMX: | ||||||
| 1. Download CubeMX from [st.com](https://www.st.com/en/development-tools/stm32cubemx.html) | 1. Download CubeMX from [st.com](https://www.st.com/en/development-tools/stm32cubemx.html) | ||||||
| 2. Open `*.ioc` file | 2. Open `*.ioc` file | ||||||
|  | 3. Do whatever you want to | ||||||
| 3. Click `generate code` | 3. Click `generate code` | ||||||
| 4. After regenerating, look at git status, regenerating may broke some files. | 4. After regenerating, look at git status, regeneration may brake some files. | ||||||
|  | 5. Check one more time that things that you've changes are not covered in platform api-hal. Because you know... | ||||||
| 
 | 
 | ||||||
| # Flipper Universal Registry Implementation (FURI) | # Flipper Universal Registry Implementation (FURI) | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 あく
						あく