# HG changeset patch # User jeandet # Date 2013-12-02 12:20:08 # Node ID 441084ecfbce44d7effd12b9f9a1cf4e2ac4cac4 # Parent 230ad3b6f43f25186e8316d840e6d51dab440f1c Sync diff --git a/bsp/src/stm32f4/BEAGLESYNTH/bsp.c b/bsp/src/stm32f4/BEAGLESYNTH/bsp.c --- a/bsp/src/stm32f4/BEAGLESYNTH/bsp.c +++ b/bsp/src/stm32f4/BEAGLESYNTH/bsp.c @@ -36,6 +36,7 @@ uint32_t INTOSC =16000000; uint32_t RTCOSC =32768; uint32_t currentCpuFreq=0; extern streamdevice* __opnfiles__[__MAX_OPENED_FILES__]; +gpio_t TickLed = LED1; LCD_IF_t lcdIF0={ .init = &bsp_FSMC_init, diff --git a/bsp/src/stm32f4/M4Stick/bsp.c b/bsp/src/stm32f4/M4Stick/bsp.c --- a/bsp/src/stm32f4/M4Stick/bsp.c +++ b/bsp/src/stm32f4/M4Stick/bsp.c @@ -30,6 +30,7 @@ uint32_t INTOSC =16000000; uint32_t RTCOSC =32768; uint32_t currentCpuFreq=0; extern streamdevice* __opnfiles__[__MAX_OPENED_FILES__]; +gpio_t TickLed = LED1; float VREF0 =(float)3.3; diff --git a/bsp/src/stm32f4/M4StickV2/bsp.c b/bsp/src/stm32f4/M4StickV2/bsp.c --- a/bsp/src/stm32f4/M4StickV2/bsp.c +++ b/bsp/src/stm32f4/M4StickV2/bsp.c @@ -32,6 +32,7 @@ uint32_t INTOSC =16000000; uint32_t RTCOSC =32768; uint32_t currentCpuFreq=0; extern streamdevice* __opnfiles__[__MAX_OPENED_FILES__]; +gpio_t TickLed = LED1; float VREF0 =(float)3.3; diff --git a/bsp/src/stm32f4/OPLAYER/bsp.c b/bsp/src/stm32f4/OPLAYER/bsp.c --- a/bsp/src/stm32f4/OPLAYER/bsp.c +++ b/bsp/src/stm32f4/OPLAYER/bsp.c @@ -39,7 +39,7 @@ uint32_t INTOSC =16000000; uint32_t RTCOSC =32768; uint32_t currentCpuFreq=0; extern streamdevice* __opnfiles__[__MAX_OPENED_FILES__]; - +gpio_t TickLed = LED1; LCD_IF_t lcdIF0={ diff --git a/bsp/src/stm32f4/SOLAR_LFR_PSU/bsp.c b/bsp/src/stm32f4/SOLAR_LFR_PSU/bsp.c --- a/bsp/src/stm32f4/SOLAR_LFR_PSU/bsp.c +++ b/bsp/src/stm32f4/SOLAR_LFR_PSU/bsp.c @@ -32,6 +32,7 @@ uint32_t INTOSC =16000000; uint32_t RTCOSC =32768; uint32_t currentCpuFreq=0; extern streamdevice* __opnfiles__[__MAX_OPENED_FILES__]; +gpio_t TickLed = LED1; float VREF0 =(float)3.3; diff --git a/bsp/src/stm32f4/STM32-E407/bsp.c b/bsp/src/stm32f4/STM32-E407/bsp.c --- a/bsp/src/stm32f4/STM32-E407/bsp.c +++ b/bsp/src/stm32f4/STM32-E407/bsp.c @@ -39,7 +39,7 @@ uint32_t INTOSC =16000000; uint32_t RTCOSC =32768; uint32_t currentCpuFreq=0; extern streamdevice* __opnfiles__[__MAX_OPENED_FILES__]; - +gpio_t TickLed = LED1; float VREF0 =(float)3.3; diff --git a/bsp/src/stm32f4/STM32F429Discovery/bsp.c b/bsp/src/stm32f4/STM32F429Discovery/bsp.c --- a/bsp/src/stm32f4/STM32F429Discovery/bsp.c +++ b/bsp/src/stm32f4/STM32F429Discovery/bsp.c @@ -30,6 +30,7 @@ uint32_t INTOSC =16000000; uint32_t RTCOSC =32768; uint32_t currentCpuFreq=0; extern streamdevice* __opnfiles__[__MAX_OPENED_FILES__]; +gpio_t TickLed = LED1; float VREF0 =(float)3.3; diff --git a/bsp/src/stm32f4/STM32F4Discovery-EXT/bsp.c b/bsp/src/stm32f4/STM32F4Discovery-EXT/bsp.c --- a/bsp/src/stm32f4/STM32F4Discovery-EXT/bsp.c +++ b/bsp/src/stm32f4/STM32F4Discovery-EXT/bsp.c @@ -36,6 +36,7 @@ uint32_t INTOSC =16000000; uint32_t RTCOSC =32768; uint32_t currentCpuFreq=0; extern streamdevice* __opnfiles__[__MAX_OPENED_FILES__]; +gpio_t TickLed = LED1; float VREF0 =(float)3.3; diff --git a/bsp/src/stm32f4/STM32F4Discovery-ILI9328-8bits/bsp.c b/bsp/src/stm32f4/STM32F4Discovery-ILI9328-8bits/bsp.c --- a/bsp/src/stm32f4/STM32F4Discovery-ILI9328-8bits/bsp.c +++ b/bsp/src/stm32f4/STM32F4Discovery-ILI9328-8bits/bsp.c @@ -38,6 +38,7 @@ uint32_t INTOSC =16000000; uint32_t RTCOSC =32768; uint32_t currentCpuFreq=0; extern streamdevice* __opnfiles__[__MAX_OPENED_FILES__]; +gpio_t TickLed = LED1; volatile uint8_t* lcd0_CMD=(volatile uint8_t*)0x60000000; volatile uint8_t* lcd0_DATA=(volatile uint8_t*)0x61FFFFF0; diff --git a/bsp/src/stm32f4/STM32F4Discovery/bsp.c b/bsp/src/stm32f4/STM32F4Discovery/bsp.c --- a/bsp/src/stm32f4/STM32F4Discovery/bsp.c +++ b/bsp/src/stm32f4/STM32F4Discovery/bsp.c @@ -30,6 +30,7 @@ uint32_t INTOSC =16000000; uint32_t RTCOSC =32768; uint32_t currentCpuFreq=0; extern streamdevice* __opnfiles__[__MAX_OPENED_FILES__]; +gpio_t TickLed = LED1; float VREF0 =(float)3.3; diff --git a/bsp/src/stm32f4/STM32F4Discovery_35LCD/STM32F4Discovery_35LCD.pro b/bsp/src/stm32f4/STM32F4Discovery_35LCD/STM32F4Discovery_35LCD.pro new file mode 100644 --- /dev/null +++ b/bsp/src/stm32f4/STM32F4Discovery_35LCD/STM32F4Discovery_35LCD.pro @@ -0,0 +1,20 @@ +TEMPLATE = lib + +TARGET=bsp +CONFIG += bsp gui + +BSP=STM32F4Discovery_35LCD + +UCMODEL=stm32f4 + +SOURCES += bsp.c \ + bsp_lcd.c + +HEADERS += bsp.h + +LIBS+= -lgpio -luart -li2c -lspi + +BSPFILE = bsp.pri + + + diff --git a/bsp/src/stm32f4/STM32F4Discovery_35LCD/bsp.c b/bsp/src/stm32f4/STM32F4Discovery_35LCD/bsp.c new file mode 100644 --- /dev/null +++ b/bsp/src/stm32f4/STM32F4Discovery_35LCD/bsp.c @@ -0,0 +1,151 @@ +/*------------------------------------------------------------------------------ +-- This file is a part of the libuc, microcontroler library +-- Copyright (C) 2011, Alexis Jeandet +-- +-- 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, write to the Free Software +-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +------------------------------------------------------------------------------- +-- Author : Alexis Jeandet +-- Mail : alexis.jeandet@member.fsf.org +-------------------------------------------------------------------------------*/ +#include "bsp.h" +#include +#include +#include +#include +#include +uint32_t OSC0 =8000000; +uint32_t INTOSC =16000000; +uint32_t RTCOSC =32768; +uint32_t currentCpuFreq=0; +extern streamdevice* __opnfiles__[__MAX_OPENED_FILES__]; + +gpio_t TickLed = LED1; + +float VREF0 =(float)3.3; + +LCD_IF_t lcdIF0={ + .init = &bsp_FSMC_init, + .writereg = &bsp_lcd0_write_reg, + .readreg = &bsp_lcd0_read_reg, + .writeGRAM = &bsp_lcd0_writeGRAM, + .readGRAM = &bsp_lcd0_readGRAM +}; + +LCD_t lcd0={ + .interface = &lcdIF0, + .init = &ili9328init, + .paint = &ili9328paint, + .paintText = &ili9328paintText, + .paintFilRect = &ili9328paintFilRect, + .getPix = &ili9328getPix, + .refreshenable = &ili9328refreshenable, + .width= 240, + .height = 320 +}; + +int bsp_init() +{ + int i=0; + for(i=0;i<32;i++) + { + __opnfiles__[i] = NULL; + } + bsp_GPIO_init(); + bsp_uart_init(); + bsp_FSMC_init(); + printf("\r================================================================\n\r"); + printf("================================================================\n\r"); + printf(BSP); + printf(" initialised\n\r"); + printf("================================================================\n\r"); + return 1; +} + +void bsp_GPIO_init() +{ + gpio_t gpio1 = gpioopen(LED1);//gpioopen(LED1); //PD9 D=> 0x0300 9 => 0x0009 + gpio_t gpio2 = gpioopen(LED2);//gpioopen(LED2); + gpiosetspeed(&gpio1,gpiohighspeed); + gpiosetspeed(&gpio2,gpiohighspeed); + gpiosetdir(&gpio1,gpiooutdir); + gpiosetdir(&gpio2,gpiooutdir); +} + +void bsp_uart_init() +{ + if(__opnfiles__[1]==NULL) + { + //uart_t* uart1 = (uart_t*)malloc(sizeof(uart_t)); + streamdevice* fd1 = (streamdevice*)malloc(sizeof(streamdevice)); + uart_t uart = uartopenandconfig(uart3,uartparitynone | uart8bits | uartonestop,19200,PB10,PB11,-1,-1); + uartmkstreamdev(uart,fd1); + __opnfiles__[1] = fd1; //stdo + __opnfiles__[0] = fd1; //stdi + } + else + { + uartopenandconfig(2,uartparitynone | uart8bits | uartonestop,115200,PB10,PB11,-1,-1); + } +} + +void bsp_spi_init() +{ + +} + + +void bsp_iic_init() +{ + +} + +void bsp_SD_init() +{ + +} + + +void vs10XXclearXCS(){} +void vs10XXsetXCS(){} +int vs10XXDREQ() +{ + return 1; +} + + +void bsppowersdcard(char onoff) //always ON +{ + +} + +char bspsdcardpresent() +{ + return 0; +} + +char bspsdcardwriteprotected() +{ + return 0; +} + +void bspsdcardselect(char YESNO) +{ + +} + + + + + diff --git a/bsp/src/stm32f4/STM32F4Discovery_35LCD/bsp.h b/bsp/src/stm32f4/STM32F4Discovery_35LCD/bsp.h new file mode 100644 --- /dev/null +++ b/bsp/src/stm32f4/STM32F4Discovery_35LCD/bsp.h @@ -0,0 +1,104 @@ +/*------------------------------------------------------------------------------ +-- This file is a part of the libuc, microcontroler library +-- Copyright (C) 2011, Alexis Jeandet +-- +-- 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, write to the Free Software +-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +------------------------------------------------------------------------------- +-- Author : Alexis Jeandet +-- Mail : alexis.jeandet@member.fsf.org +-------------------------------------------------------------------------------*/ +#ifndef BSP_H +#define BSP_H +#include +#include +#include +#include +/* +#ifndef PD12 + #define PD12 +#endif +#ifndef PD13 + #define PD13 +#endif +*/ +#define __MAX_OPENED_FILES__ 32 +#define __FS_ROOT_SIZE__ 32 + +#define LED1 PD12 +#define LED2 PD13 + +#define LCD_RESET PD10 +#define LCD_BACKL PE11 +#define LCD_RS PE4 +#define LCD_CS PD7 + + +#define GPIOGETPORT(gpio) ((GPIO_TypeDef*)(((((uint32_t)gpio) & (uint32_t)0x0000FF00)*(uint32_t)4) + (uint32_t)GPIOA)) +#define GPIOPORTNUM(gpio) (((uint32_t)(gpio) & (uint32_t)0x0000FF00)>>(uint32_t)8) + + +extern float VREF0; +extern LCD_t lcd0; +extern uint32_t OSC0; +extern uint32_t currentCpuFreq; + + + +extern int bsp_init(); + +extern void bsp_GPIO_init(); +extern void bsp_uart_init(); +extern void bsp_iic_init(); +extern void bsp_spi_init(); +extern void bsp_SD_init(); +extern int bsp_FSMC_init(); + +/* VS1053 */ +extern void clearXCS(); +extern void setXCS(); +extern int vs10XXDREQ(); + +/* SD CARD */ +void bsppowersdcard(char onoff); +char bspsdcardpresent(); +void bspsdcardselect(char YESNO); +char bspsdcardwriteprotected(); + +void bsp_lcd0_write_reg(uint32_t reg,uint32_t data); +uint32_t bsp_lcd0_read_reg(uint32_t reg); +void bsp_lcd0_writeGRAM(void *buffer, uint32_t count); +void bsp_lcd0_readGRAM(void *buffer, uint32_t count); + + +#endif + + + + + + + + + + + + + + + + + + + diff --git a/bsp/src/stm32f4/STM32F4Discovery_35LCD/bsp.pri b/bsp/src/stm32f4/STM32F4Discovery_35LCD/bsp.pri new file mode 100644 --- /dev/null +++ b/bsp/src/stm32f4/STM32F4Discovery_35LCD/bsp.pri @@ -0,0 +1,3 @@ +CPU=stm32f4xxxG +DEFINES+=BSP=\\\"STM32F4Discovery_35LCD\\\" +UCMODEL=stm32f4 diff --git a/bsp/src/stm32f4/STM32F4Discovery_35LCD/bsp_lcd.c b/bsp/src/stm32f4/STM32F4Discovery_35LCD/bsp_lcd.c new file mode 100644 --- /dev/null +++ b/bsp/src/stm32f4/STM32F4Discovery_35LCD/bsp_lcd.c @@ -0,0 +1,267 @@ +/*------------------------------------------------------------------------------ +-- This file is a part of the libuc, microcontroler library +-- Copyright (C) 2013, Alexis Jeandet +-- +-- 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, write to the Free Software +-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +------------------------------------------------------------------------------- +-- Author : Alexis Jeandet +-- Mail : alexis.jeandet@member.fsf.org +-------------------------------------------------------------------------------*/ +#include "bsp.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#define clr_RS gpioclr(LCD_RS) +#define set_RS gpioset(LCD_RS) + +#define clr_CS gpioclr(LCD_CS) +#define set_CS gpioset(LCD_CS) + +volatile int8_t* lcd0_CMD=(volatile int8_t*)0x60000000; +volatile int16_t* lcd0_CMD16=(volatile int16_t*)0x60000000; +volatile int8_t* lcd0_DATA=(volatile int8_t*)0x61FFFFF0; +volatile int16_t* lcd0_DATA16=(volatile int16_t*)0x61FFFFF0; + +/* +D0 PD14 D1 PD15 D2 PD0 D3 PD1 D4 PE7 +D5 PE8 D6 PE9 D7 PE10 +A20 PE4 = RS FSMC_NE1 PD7 CS FSMC_NWE PD5 W/S +FSMC_NOE PD4 RD +*/ + +int bsp_FSMC_init() +{ + + gpio_t LCD_DBxList[]={PD14,PD15,PD0,PD1,PE7,PE8,PE9,PE10\ + ,PD4,PD5}; +// gpio_t LCD_DBxList[]={PD14,PD15,PD0,PD1,PE7,PE8,PE9,PE10\ +// ,PD4,PD5,PD7,PE4}; + for(int i=0;i<10;i++) + { + gpio_t LCD_DBx = gpioopen(LCD_DBxList[i]); + LCD_DBx |= gpiohighspeed | gpioaf | gpiopushpulltype | gpionopulltype; + gpiosetconfig(&LCD_DBx); + GPIO_PinAFConfig(GPIOGETPORT(LCD_DBx), (uint8_t)(LCD_DBx & 0xF), GPIO_AF_FSMC); + } + + FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure; + FSMC_NORSRAMTimingInitTypeDef p; + + /* Enable FSMC clock */ + RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC, ENABLE); + + /*-- FSMC Configuration ------------------------------------------------------*/ + /*----------------------- SRAM Bank 3 ----------------------------------------*/ + /* FSMC_Bank1_NORSRAM4 configuration */ + p.FSMC_AddressSetupTime = 1;//3 + p.FSMC_AddressHoldTime = 1;//3 + //ili9328 -> data setup time > 10ns + p.FSMC_DataSetupTime = 6; + p.FSMC_CLKDivision = 3; + if(getCpuFreq()>=100*1000*1000) + { + p.FSMC_CLKDivision = 3; + p.FSMC_DataSetupTime = 6;// 11; + } + p.FSMC_BusTurnAroundDuration = 0; + p.FSMC_DataLatency = 3; + //ili9328 -> data hold time > 15ns + if(getCpuFreq()>66*1000*1000) + p.FSMC_DataLatency = 3; + p.FSMC_AccessMode = FSMC_AccessMode_D; + + + FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1; + FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; + FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_NOR; + FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b; + FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable; + FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable; + FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low; + FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable; + FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState; + FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable; + FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable; + FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Enable; //Dis + FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable; + FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p; + FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p; + + FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); + + FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE); + gpioset(LCD_RESET); + gpioclr(LCD_RESET); + delay_100us(500); + gpioset(LCD_RESET); + delay_100us(500); + lcd0.init(&lcd0); + gpioset(LCD_BACKL); + return 1; +} + + + +void bsp_lcd0_write_reg(uint32_t reg,uint32_t data) +{ + uint8_t* pt8 = (uint8_t*)(void*)(®); +#if __BYTE_ORDER__==__ORDER_BIG_ENDIAN__ + *lcd0_CMD=pt8[3]; + *lcd0_CMD=pt8[2]; + pt8 = (uint8_t*)(void*)&data; + *lcd0_DATA=pt8[3]; + *lcd0_DATA=pt8[2]; +#else + clr_CS; + clr_RS; + *lcd0_CMD=pt8[1]; + *lcd0_CMD=pt8[0]; + set_RS; + pt8 = (uint8_t*)(void*)&data; + *lcd0_DATA=pt8[1]; + *lcd0_DATA=pt8[0]; + set_CS; +#endif + +} + +uint32_t bsp_lcd0_read_reg(uint32_t reg) +{ + uint8_t* pt8 = (uint8_t*)(void*)(®); + uint32_t DATA=0; + +#if __BYTE_ORDER__==__ORDER_BIG_ENDIAN__ + *lcd0_CMD=pt8[3]; + *lcd0_CMD=pt8[2]; + pt8 = (uint8_t*)(void*)&DATA; + pt8[3]=*lcd0_DATA; + pt8[2]=*lcd0_DATA; +#else + clr_CS; + clr_RS; + *lcd0_CMD=pt8[1]; + *lcd0_CMD=pt8[0]; + set_RS; + pt8 = (uint8_t*)(void*)&DATA; + pt8[1]=*lcd0_DATA; + pt8[0]=*lcd0_DATA; + set_CS; +#endif + + return DATA; +} + +void bsp_lcd0_writeGRAM(void* buffer,uint32_t count) +{ + uint32_t reg =ILI9328_REGISTER_WRITEDATATOGRAM; + uint8_t* pt8 = (uint8_t*)(void*)(®); +#if __BYTE_ORDER__==__ORDER_BIG_ENDIAN__ + *lcd0_CMD=pt8[3]; + *lcd0_CMD=pt8[2]; + pt8 = (uint8_t*)(void*)buffer; + for(int i=0;i<(int)count;i++) + { + *lcd0_DATA=pt8[(2*i) +1]; + *lcd0_DATA=pt8[2*i]; + } +#else + clr_CS; + clr_RS; + *lcd0_CMD=pt8[1]; + *lcd0_CMD=pt8[0]; + set_RS; + pt8 = (uint8_t*)(void*)buffer; + for(int i=0;i<(int)count;i++) + { + + *lcd0_DATA=pt8[(2*i) +1]; + *lcd0_DATA=pt8[2*i]; + } + set_CS; +#endif +} + + +void bsp_lcd0_readGRAM(void* buffer,uint32_t count) +{ + //uint32_t reg =ILI9328_REGISTER_WRITEDATATOGRAM; + volatile uint8_t* pt8;// = (uint8_t*)(void*)® + /* #if __BYTE_ORDER__==__ORDER_BIG_ENDIAN__ + *lcd0_CMD=pt8[3]; + *lcd0_CMD=pt8[2]; + pt8 = (uint8_t*)(void*)buffer; + for(int i=0;i<(int)count;i++) + { + pt8[(2*i) +1]=*lcd0_DATA; + pt8[2*i]=*lcd0_DATA; + } +#else + *lcd0_CMD=(uint8_t)0; + *lcd0_CMD=(uint8_t)0; + *lcd0_CMD=(uint8_t)0; + *lcd0_CMD=(uint8_t)0; + *lcd0_CMD=pt8[1]; + *lcd0_CMD=pt8[0]; + pt8 = (uint8_t*)buffer;*/ + /* + * x dummy reads Cf ili9328 datasheet p79! + */ + /* pt8[0]=*lcd0_DATA; + pt8[1]=*lcd0_DATA; + + for(int i=0;i<(int)count;i++) + { + pt8[(2*i) +1]=*lcd0_DATA; + pt8[2*i]=*lcd0_DATA; + pt8[(2*i) +1]=*lcd0_DATA; + pt8[2*i]=*lcd0_DATA; + } +#endif*/ + //clr_CS; + //clr_RS; + //*lcd0_CMD=(int8_t)0; + //*lcd0_CMD=(int8_t)0x22; +// *lcd0_CMD=(int8_t)0x00; + //set_RS; + pt8 = (uint8_t*)buffer; + //pt8[1]=*lcd0_DATA; + //pt8[0]=*lcd0_DATA; + pt8[0]=0xFF; + pt8[1]=0xFF; +/* for(int i=0;i<(int)count;i++) + { + pt8[(2*i)+1]= *lcd0_DATA; + pt8[2*i]= *lcd0_DATA; + }*/ + set_CS; +} + + + + + + + + diff --git a/bsp/src/stm32f4/STM32F4Eval/bsp.c b/bsp/src/stm32f4/STM32F4Eval/bsp.c --- a/bsp/src/stm32f4/STM32F4Eval/bsp.c +++ b/bsp/src/stm32f4/STM32F4Eval/bsp.c @@ -35,6 +35,7 @@ uint32_t INTOSC =16000000; uint32_t RTCOSC =32768; uint32_t currentCpuFreq=0; extern streamdevice* __opnfiles__[__MAX_OPENED_FILES__]; +gpio_t TickLed = LED1; LCD_IF_t lcdIF0={ .init = &bsp_FSMC_init, @@ -71,6 +72,8 @@ int bsp_init() { __opnfiles__[i] = NULL; } + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOF | + RCC_AHB1Periph_GPIOG, ENABLE); bsp_GPIO_init(); bsp_uart_init(); bsp_iic_init(); @@ -226,35 +229,47 @@ int bsp_FSMC_init() /* Enable FSMC NOR/SRAM Bank1 */ FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM3, ENABLE); + gpio_t SRAM_DBxList[]={ + PF0,PF1,PF2,PF3,PF4,PF5,PF12,PF13, + PF14,PF15, + PD11,PD12,PD13,PG9,PE0,PE1}; - p.FSMC_AddressSetupTime = getCpuFreq()/50000000; - p.FSMC_AddressHoldTime = 0; - p.FSMC_DataSetupTime = getCpuFreq()/25000000; - p.FSMC_BusTurnAroundDuration = 1; - p.FSMC_CLKDivision = 0; - p.FSMC_DataLatency = 0; - p.FSMC_AccessMode = FSMC_AccessMode_A; + for(int i=0;i<22;i++) + { + gpio_t SRAM_DBx = gpioopen(SRAM_DBxList[i]); + SRAM_DBx |= gpiohighspeed | gpioaf | gpiopushpulltype | gpionopulltype; + gpiosetconfig(&SRAM_DBx); + GPIO_PinAFConfig(GPIOGETPORT(SRAM_DBx), (uint8_t)(SRAM_DBx & 0xF), GPIO_AF_FSMC); + } + /*-- FSMC Configuration ------------------------------------------------------*/ + p.FSMC_AddressSetupTime = 3; + p.FSMC_AddressHoldTime = 0; + p.FSMC_DataSetupTime = 6; + p.FSMC_BusTurnAroundDuration = 1; + p.FSMC_CLKDivision = 0; + p.FSMC_DataLatency = 0; + p.FSMC_AccessMode = FSMC_AccessMode_A; - FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM2; - FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; - FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_PSRAM; - FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b; - FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable; - FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable; - FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low; - FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable; - FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState; - FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable; - FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable; - FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable; - FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable; - FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p; - FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p; + FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM2; + FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; + FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_PSRAM; + FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b; + FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable; + FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable; + FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low; + FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable; + FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState; + FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable; + FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable; + FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable; + FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable; + FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p; + FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p; - FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); + FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); - /*!< Enable FSMC Bank1_SRAM2 Bank */ - FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM2, ENABLE); + /*!< Enable FSMC Bank1_SRAM2 Bank */ + FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM2, ENABLE); lcd0.init(&lcd0); return 1; } @@ -346,17 +361,12 @@ void bsp_lcd0_readGRAM(void* buffer,uint void bsp_GTerm_init() { - if(__opnfiles__[1]==NULL) - { + streamdevice* fd1 = (streamdevice*)malloc(sizeof(streamdevice)); ili9328paintFilRect(&lcd0,0,0,240,320,0x7FFF,5,0); terminal_init(&terminal0,&lcd0,&ComicSansMS_8,fd1); + terminal_setgeometry(&terminal0,5,5,terminal0.LCD->width-10,(terminal0.LCD->height)-10); __opnfiles__[1] = fd1; - } - else - { - - } } diff --git a/bsp/src/stm32f4/stm32f4.pro b/bsp/src/stm32f4/stm32f4.pro --- a/bsp/src/stm32f4/stm32f4.pro +++ b/bsp/src/stm32f4/stm32f4.pro @@ -10,7 +10,8 @@ SUBDIRS += STM32F4Discovery \ STM32F4Discovery-ILI9328-8bits \ OPLAYER \ STM32-E407 \ - STM32F429Discovery + STM32F429Discovery \ + STM32F4Discovery_35LCD diff --git a/examples/TEST_SIMULATOR/bin-simulator/TEST_SIMULATOR b/examples/TEST_SIMULATOR/bin-simulator/TEST_SIMULATOR new file mode 100755 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..e095f959daa9d7ed2857b30fabb09a4f1a1ae65f GIT binary patch literal 111262 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

3GaiJDBim*$?=Lvf9!uD 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 diff --git a/examples/helloWorld/bin-simulator/helloWorld b/examples/helloWorld/bin-simulator/helloWorld new file mode 100755 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..6bf34a60ccd26580ad1bd7d430f6599ef330ea6e GIT binary patch literal 100666 zc%1CL3w)Ht)jvMZUb4@ICA)zD;hI&zCMp^PH3&+;tS(420#Q_u07(Q15FydDa)}0P z)__9m1uMRy)s`x+Qj36AAwh(ww2jJZX{9x_v<;HhSgFJs+28q|ndjMOFA355fB*mg z@8h$Zoy)n*nKNf*&Rll0Dlp{=o2Cilv5CtBQsq5zIi0KWH{TS&$rU-mO`pTW86t_& zP77YH$c+ly6`2w03eQe|4*JWn$#jk_H!2*Y@QhHigic|7a-+hd+eB0-gx{ottj({= z+~!w{qC&qzn|ehR@>m$gd?{H@&?l15c-=K_@CBa{`m*X58pOp(5`i#q>TAz-Js*|ew@-(y;FtJ zve8d3DyUb2{4t&6LtTmTb34I*x)b~>JHa2{N&X0tSpLDC;P>k!|Nc(o@pOVeu9I?~ z>x9qUo#b!qB>&b<@?D+Cb3rHh1)a$G>rVK$cancjC;V^FVB6_J>@AAQFXR0FqJDpL zev!(L#b3_l_7E-Z+^GCv8f-LzZ;U5@Wc(DdZ+0}kpnf~=Usr#mn~*bnw~$q zxMXR`Een=alq{W|e|g!G#U<0{%q=SsvuEG3XvyN)%PQt9t(ZMq%$|Jv?5PUx^0GP0 zmX$1%704QZo%RO6`X%%Nkw4k(j`kdaYfmJa*j+WE}p(% zQHji*WZ)K-7tg6EnOZVWCa0BDT(_XOWJ&&#Vp+x%YYC-P1giKwRBj|$-(|^9x8w(FTJ>O^)49Vhf@|t4oGm}(%zgT6BI*fW z_|F&pB0T&AeR?x;DTefXfQ~hX=^6eJ(y+c`O`QG^X_(TndQSfyX_(NlZJd4wX_(Hj z&76J{X_(Bh^_<>|G)(1KHK$)j8sZ--=kyCm!!(W+arzmgVG_p*IQ=BjFok2eocJ*PTz|(n*5lL(|02cpW&F`^!JcP(;sU)h4fOSeO!M|-->i9*PqjK zk?zIy=k$$8_vZR@dMeUsTz^WB{QIQP+cyV89|miVwiQgDbfCVTM)cr;h5`-_EcfJ! zmfsTMiPH7Z|1KAGKsf9$@vXUw=Yrpf4l%;+8 z8srJqT)OM$gitZW6d|o}PaAoQgdc92b?iPd)laOjNbBxFT-Ju&3dhL zJzz4s7fX)V!LW(IaI#z9fj|dxRB*gcU7#blF?hi7dXXCBY62Zv&592DO2uxY$?gF& z_JkR`$Bb>a8L<^+-WoGjNgsRkB17~uN%TEun91Hqjxm!CBri9U|LTZB{wpPSq0hYW z8Y(r*^2yn=;r;{FGubZ~ES z8Qkx_#%Q2Wdu^bjtEiG zv8N5y1-G2p>u1E7_LHrHtOp&?Y4^H^s&lS z)2>yd9KX4y-Cl8KO}nFF^6{y4fg?1$)dkvWea8c4qBP_?ez66F&)~WOjj|eA^je!r z+c@p3wH;4JPF>-VkZ=90m^yqj6&My% z!J56AcSkSpj&~Y9)ZJXGU`@SEA~ZDn+)c-OauvjJXVmzL@e_6v3{|#qLxEYSAYH~u z_8nqekBa`*q^Ba8E%w;2G#G^h)D<}Dob#Udi!pmEsU+tiiU!99+AA(MFzAo;oSRD} zP5-Bd^DonT!)B_(T#D8$g-SgQZ5^7du>4) zrTbXYeJpK&D4Cp%OOWIq1a&eX8|~xW(a1Tu4)5~~29l4B!t9>X9BNjyi%Qon4D81* zrc|4m%3=dULxu{nIes8FXJT5eQ1RSNebm%u4o1?-tSrw`a%a~S_@orW5bV#*RPB49 zWq@W1RnuBd95#|*>xs)oQJKtKj)mZ5)T~%zq5E^$Y5sm1%0UA}O31Td8Y}*;_F| zjcM7|e#_l9pRy-qcim(A&?lPHIsIAgsghI3*+5B>pX509kWFxudPX(K$Nj~-`nxfC ztLrP(II~YeYU+DL2z(W1$7cB}`o(5x-Zf|1BA%g_)Y(F{dX~ia5rqJE%0%E&$#?l&QCG(X)xd%uO$bA0(Zq08i9H-*cV5T z+8IF_gL}mh^zMwHFN4$K2>NtJkj~(~aRmK3BN)Ko0dWKaJ0lpv;6ZT&gX0J|dq{M) zPi1FBXUie9B_yX}GGH2F2(O{VX*5oz?7byS?dR#Z?b0w=o%f!ZUvgKJ*1L{OBfmZL zYjnN^v>2r>gsxoCi#{FHp<$=TGsx+ z8XcMr1X_W$Kkz9!%3;-IxwFEHILw{(XkDM=E$BK&X>LV#J*>KG`4-t-FPC|--SsF> zuZK_HVJ~;0e;o}ufBaMKu!mKL^>L{kHT6jt_GFJ*>3yJH4}3~JA!B6@fGvI#h|#7w zcTK(b!MzOW6Cv{w*%?hlcx;6x3#0bPKWY}Xj-+Mf{x*pRVkOzn$Z4;x`0g$yQ%)GbambOA>Vs+9gqo1f13u>4yUPeDCQ*m1utYo2kSvY^oByqbpJU zG*_ZogXrztaYs_OBELOUctTFoO*~DvYxOmaTBre|d864ln6%q9bl8<|5IweZj-Q>7 zzJvODETN4E`>&)P+dk;46K1SzI<^Cm~;(DH~6d*HSH%WQ}_G}yE|te3x{`M|M~cp2JBzAr|xmgAy^7v*ho5l4r``B zk;_IrY-zx~7R?81_T}7^xG9wba3Ij4+;+2JquVsp5NeVQ^hqevykTqeVo}h|=7nYx zH1AW7N18Wn^MBO5H`!G47Cde?Zv#bZ7PV+pXLwl0o@5hft!c4Gyf)R!lxeeOMq0TQ z%BWA=%B@{A@Yul7%IvSuX2%}UFkH7fYF4z`z2Bc6W@iw}A`N-(`OPUK{dJXn@qa~> z{nP*YkCgonqc8pWF;m&oiDgZImCe<8Tq-+G&-Geodak#1s%Pp=(Xa%{9`O~Fef<2I zK&#`f6|K_qHkHkr7Nj$W)&#BB>?f^rl~s>Y=Lf;NTC-vNp;z1Cvxi=6qaf5&yQUSJ z?&;{bg?}MH&8q;2ia``>=UA`mSApYL<(3h1S79-CrZsK626#}iMP1f#6uVgKUKDHt z%!%8D8y)T9UHt>>erBWKBS*tw?~XMt!p&o?uSue)cXvC*oE&STm_vdaDQcHdnswIL z7>-PhW5^R6tIrGN4fBPT57R@VhXq1Sq5XSu=NN|xj~se z5qwbyFU2FUZLu8KQ;VR!+=U>&Je?q~oKBEeyB0*>a|2rU)Q478Ytoo6gl>&pzrZPu z)l&-0CqL_>Hs3%CF4R~X*hfR%zDMM-gIY4r#V8PLXm$s&*W&yMLFMVA zTzi~HiXv~syF0KCIP+*A?0NSi*dSFI?1AmpnBqXosy~rl$Gk?&)t;OdJ^QN7GE>12 zidH<%^P`2D#15G$RBDV+kD!#gp8wv+avU|~Xfx$F`6qQq`G!SrD3BC4%eo1Wu&H<7 zONO#%9qj9B6cuvbzY*iQvv#9AocHW`2*A6V`M_%n;+4&6-|&D?js$k{TOvF8h0Q^^ z4T3neNoY$c5LCkk(n!0Ja<$i9?Z=$;{{of{23V(H+MC1+4T)oQb{NwzbRO= zqM4SOJT}*?I84#uGTKDZ0W#V`QLpq|S}anwSfp$zJ)pKUOAq8K)cv`GRXE7lV$38r zTQ@xJ9l3+4-?1BQ0VhYmgB17#(g$+WY3vs=n&xdY#L4v&(Iqu4MAvA^$>AL4G$GU& zdi!N~i@Tkw@q^OMZc_U9ar}VT+)%{X2Xb}QLM^~P#}+9}{uQ?5)lE#3;pDWs!V`Jk zo$u5YwtIKJiA?X#3nXtiFv&*4 z3?ZMRgZt6Ypt-edvNVprXw8(2E!9ZD^{Ifva)tqS&;2(YOg#tACCK^y&;++jjA1HB#o#&p%J}dJ%vVb zWRszSv{?zW(~XHDw4yCk*&5`dO`N#4YU+r#z-DC1FgK}m%--9}WI|VYHk^=ncix!9 zBXsG>PuHbslH4aTghZI^PzawyK@IxJ2K^^kP=^fxZi*VMTfP}^G8%)H<~4J-;Nrfc|r~q9#jhrOH~eAs&c{tPL6<$s=~fw{-v)ek-%*!1+S ze#j_;nrTWM&!30$cu9u5s!YiMr#;^1n-sScK7Y`RMf;#oL;W$A*4Wfux)ED6a{4$d z?fXQ8jMjomxoi{bDw_kLhDjlu{!IwK6IG3-4pgHj}o zOq5D!9Z80VX&?Jl*|6?R07*P|H*8?0NItqhl@ zgwJaB(=0=h&--l3y0nWGf`3ZrJ;QY2Oa`fbjbyv^p~6?#XN;<2qot0`7I1O|Y}D}x zr!64MRA*%H@j2nPs(qQ`%K)HpRY=|i*)&XH7TXIQ%|qkX2en3+y^V94WDai~Ci7C* zC}-UaYQok>PJW>_=b~m>D)G33mcklV?!;(p;FaZTl>9?h*H>PsD6mKm1&$u?Q&)%v zZQ9LcBXky-kM@iG;}%aq>=nD%DPM;akq+lkOq6A)5yg)Ii*v;>6R)`GPesq*{tLT^yrsoroK z;3VZY^KAp~>IcjP0ag#*)vGOO^le&ER0QR{5#{5cdPm{oEWb$slzYSu4g)57cdlqw z?hxhj1l~S@hb|tOEd?m7X7BTFhu-E34P;usH7jygYa5SouV#j6u}4)|L(X`ZtMlS8 zij{^Q^mDLg5C`khC@{|K`_=_~A$c*QH1t3KH-62V8Apu?p?@8-1YWzu%MP29f_LSg zygS!`XX#ij!CP}JIZ~8|#L2@n8G3g<2)N3^fF6SHz$vUwcRn~sg40ZJ%YndAxv|^K z+i(ALBYuSA@AGuos*yq)am=-sC{aV64A2>Oa=o+mho}(hBx|6U3A>D$z{%$>Ep>&h zD5{}7qoHMxwzuX(uPk|O&5E_6B14g>CaB9_8(jAwYOQo%7g$THO?c>5G=;O<$3+oZ zP2jLEQr6hO;Z?tmB-f?MYK+ zyF;tq_-2&T)D7h{MJcCg)vs#;N64m*2=9FZPr*nJCTei97r!!;ZZ&w?7hN`ZZOw|> z1a+#7ty66%(AbSSHAdB`@jqbs$w`Y7epqrneS zgC8^-{1tBS>9WDOxm#nK`)FuCb$B$mW^L|J<4Z<^5BQG=; zH|n%2s!qGC4L+8nUsn^;(qB=ef*6succYoNM>q4>!1h&d)dXH4O}|2#ev&o4ts9z7 z+_5a0e(7YFny#){QJtV#)v=nc4h6P$L(^NMG`;m}X}SxM3Svas(hW^-iPiKLXnGrI zdYh@~r&!Z-O-(B`cSpZBd}h@zSMvVTS8~mAOwX_4Q&gN8Q`L3Ij;SpZgaVtpQQ^(8 z72dq+tZ-(>Sw~i$=o#*L+&8FvkRF%$N^0C8gsV8V%c!JiYDC?izv+G-u z-w22Q={=VgtVc{}vk7f&G@yrx88mQC;0SqtIQK0)BF8)$&W&VrcBkn8|e zQ6AHWpP(I^9%=Y!kk(Yw?9C!32Qf`o3{tq}zwtmRl zTYi|uBCm>yf+y0rVrgAr6YpGSQHBOUV|Qh!w#v|&K!$3o46QyktwzZ3^{Ux&x@xxg zcmsl}iHlFFp~q4K-k*NTwC0+9)wq-oJ3f#X%3ocV@1w=%1GErbPYcntrJ)tIv=FVP zwPG!;0@us?*Oy=+BwCz7xD7?Phb zBwr25PneRQAjwaVuPOr#Hn7F6D%|F`FdrLeLxl}#snR5|)>L{9L3cLAh`#q9 z7!v*i!CJc%tTkG&Ru&8fP@O=H7fD%azqTwbUCPqpw=f?YXo;1DtcB#!+N7e|EP_4u z_y16^qg@JiG+MButKOA;YC_?J>Dcg`PaSJZFjToY)HsDEHtJo}oeDQmx7rvCH3vhl z5%2ZpUSOk2C39*Yr*`Ce`1@$}YUANR;ILpPpb;CCH6LlgP~k3$P6{2Gz`yRo@pmTt zlH(hLT0OoJw~NPwniegnHSIxM9)+Jg8C+QJ3uf(uFu0TVb_)nXfo-J+0`KwBz#&|0 ze^(r9mj|Mou^F1N%7y5D;pa_C8X@Ca@(ku)A9^uoGc> z6k(%DxR(j#u6pG*CT6Edwdv1z8%D0mNAq-b@R5@%8gZr0y9R4FB7cu6O`3kM6nkY` zq{7(y3cQCBvFE$5yYk*}oOi;um_|bFRJhGF5>zCPFSdfaU!&jZ=Ef3DM>Wl^HT9LF z(fq+WT`3)RWvLrHPa1nZP#@Y)Q!8JOJ*>6y7ZLfi=3VcOz`Hfg+M4=`-q`=ZeYR~h z0|)25QyTIVU}K|c(Ysjg)-j((oI>3H3QYyFy_Ip1u!pDuWTl6K?p&-oJ7 zk>I+LmYXKboG?p$gZcUi*GZGVtF_kZ8BGbTDPqrP9o&!H+63N_(GM8W>8L~HQ zGct@0u~nJCfk30w+xAF@*o{wBk+s>A?O?idNifI*B&VE3Q7qzJcoozdJwrCP8MI=dOtwClr z%85x(Zaq(p_=3R3y25%G(g8;SzKmZ_Hbnl?_T@*74U=iy7hj>ixLx+e!_t=a%f7gu z`{F*?Rfo_9~*eZd;epnjP7@syWfPHC(MpH5t7FRd+pK31ut0Ab-6m{{a19}Zv0ry z9;hVh*kU(+Wn_;nE*lqu_SoaG$zb-l;<9aa{LDf;Ha&aXiL;XvXZzx^QQDr=#Mr$O zXZPl8{&9hpT5q%(wxyY+>^VW|Xt^Z@!BU(56iAflDPPbe9ln9IB6_k^I2-mO3 zwddcLPy_W_e~PTwZkN{^5>>AyarIgfRj)a&dQ|QqNF*!RLkVZpP(hp6=cl#w?P08? zEobDR6&>=Y7@TJ=^NYINOqwTp;rkd!iQ&#%{xaSe%CS)nYW1U?_+tBa&uW>lQ{B*W zUb)yWcKaXA1zg@ZesKrp@{Z#Z2>QlSN%*H7n0lNqFSVAlb*Z%+FXjA5q1$#ci^%bF zXhmzNvL#e_G?Z`bC$Y9#GIv0tigQ|?-(g7f;v$kL*DBFag7K8m@)Be#JX%+Yn+UMx zTq|n5`i1@bDnEV#VdVP4CwO)sAi`C!W z+ho0N+@bWRnbNuz#p3c)4G^ zgz+KtZ!oCQt#)eMh*Bazc&d4vm*0hiEem{#Cg=oZZ zygvW2ToG=jqN>YLN#EE&`yFZc!vFp~>mN0)xTkGL#o9y8_ZRxbvA;t*bI6jN8_biE(r_sco zW?-KM?DGkGLmYPcV+Qtc16u%FTmMGl-|G3l=x1-tIwX=frgkuGi}dY=2>4x=#6PF= zHJHkqD!69&f6FiQSbr^m<~rkdP3oLp9s>CS)nUxvly#!aI^g`ZEOxXzR3-&UY4CHMDPG?2!DzLMi%yZISJ5^ID~; zd)$wN;+-{7>?#+=Dtw+|_r>!{;ZHtqD11w4tit;e?AT`(g+H&xKQLiCb@ryHG}XpB z=e@)M2RRK5$1=3Wx7%U3&f6$c*=>D{e%m7Ybxtl-I-F1n9gfAPGf--%dsHcOIGl5b z8mI#pHH|Zelp5;xFzTrii@J|`?+!?H&%4#CpTb*X)qVM`Qa{f=XSrb*ZRVM`Mw_{z zod1cpMyU0Z1yEKH%KGa9Ls@Ng&RHc;*8b4`hJR#eZBQ0v=9NfgwXw2H<%}p%H6B*d zeT!``hF)wXh6>w?p_dOix4Bp`{4J7w-sa5riwzaN!KlA1j<(ngQeotKROtUrp~{2i zZ~HjC3s^BN%71TG5Yzp};jOPQ< zLf^ubK4Dh6*-~jc*Q95$QRy${p(cNyhuq`y6vGdZ>~n-O|2og8^dUyw4p;%H}|(iy@J3WV}o zrjWv?gz^ttf6I@{jG>6)Tk6fgwM$y4T|Xfdo^aiy&}S10Cx!lJ!t^QYhF9I}r~0lN zfpFTCtiOzWKiKf49lyxhQt}KbWzF9!h8XlyLLW^DeU?W&!f8i>HLq#GF~=)E!Vk6H zG|Sl5d9AecJOlsJ*Gkv(Z@b3-lq)}4)UW&sF~6j&Y>EGlB}>bSlkp>{#_!bkyfo26 zD4pd`o0MNTWy17prV2lP271AqvIWaZ!1MAsi@#Ih$4@c)OXpOKy1-vPXK4i?ELrRy zX$3A>>c>wo`|~GG?TY4tu7IPu0*+QdL%i>m_^0JvK4EH}$eT1ZaP{=r6Xz69!_QEw zB5oOvo6i9 z8h+jdGgNw{kv=0?ES)RPFD|+L{AI=S#FB-63g#>==F%6J6pO1PS&NrcnAu{##c*+tA#FE-PwNR*49mZz;2`?M-87DrdFE@h^&^_cqWl;^kLIGBqs>ZLPP zbZIL^`e`&|NOjq1<+9>?610c$4Cy8pM*<$CU4G$r>!l8CF{6SI*&--bTV6qtolrtO z>NO}1r;2E+>6J_LvaF6coE);3T>dX2x%|o#ISFJgBAW>kY@#@&@M511=3gP!sxlMt z@vAmmZq}?S4(F6bL%vRIsmi48oKKZSe^smjPaKYXj8;n2TCq4Xo)p(&c%)4yvDJ3| zEVq0ner#;}>1-MC&k$-0?xS2Do_PJV36H%v=>o@_^jd0Xezvxlo+?{$Gmi)DLf0Jh zisdtoN0U72U$VvW_&-m?mQ`z7FW(e7yP z&h*@->7+ZUyoru|jkU<25uW&YtDV$_I1EnQ>Bf=ZThEj$qw+ z%6V3iuU&CaS<}&Cip7c&KbSEkcA|NwnqL^Hj2R(*Y>Dv6qY^y{`82C>z^cEl_~2D6 zW~lKxqUlJz^2}H4V~p+ASNx;L;o#-A{I?H7D;R?Yu{W8htoT>rXS*oVhMBL#I9=CE zJ~vRpv+>E6=%9>(0h8LmptHbH9oAqpbd8*ZRq`yyC~z2u^0F z|nO>RpU%Fod?ornX=}xMVs0lj`hVf^bmJ{7kuIKt(eJPQ)TgU=$11#w zJa}g(iBse8rbxOS@2)uTyV)+X9CV0#Tq4OOQd}%g zH>Q^K==axqiZH%l=_Q%yoix3K<}h+mB0gl|DHcp0^NfE>=paV!?7s*4_)W8I2Ua+u zOeFBAzS3isPCV&tCcnW))~h?cBj#D&^*ZTmJ>3<9ZP+y9dT!aG=$7gZt2X{;n`S)ys}r$NS&$4+PLevnDocV!b9dvaU|K@UGS(@6$d~Y>(7~1_7jO z^4)zs*Yglm&e~2lxOwdAy{X&vl2tG@Tpw*ezHX08?Oe4K!(dKvMeehhP&ez^jj2NeuZe>VqHI6jt*gYrOBH!}x@gW2^{y@% z3I6wl+|%om@Ghda3$8*Hc^WAq-6K5wKJByI(mg#qP*4&**CjkjVy%liayOJieoLEO zBhJU!Y=uA zvs2KBO0AQV6w%LTUc8e$A}NXeD0{cY4NrRPdu@j3$Pmk;Gf(@(co*?+iE!Gd&5O5n zYLM@H`2A}h9=kI>dmP-{JT?MS>mqlD)o;Tb19Il|M8VUY#| z8WzfPL{7Fy&jyKlr;9=9BF6*kYVL+TFXzGYAW!S`KFE&i@~>{s7|K{45@t}j@Dv&E zIU;?Y$hkS?c1}t!pN5V>DOgp- z?zksVz5~q2e_KEMO>P^CUL=MZ-o%T{gAB`LG&8x_4yIPTL)6`tn4L&wcihWRu zJ)PbI?dgwd*^g@59?`b_PHg_2Xg(~Ot3-2ox9TPBt(<3^dg)NvMUkBsxm3GB-5P&r z&`aX}PSx3HsY`vdV|Lo7gGWC!v|ahG^#-{dX%#}3PdmTUyZx5<37>Ss&&f6_l4~qj zBF?it`o9RrJ(uyji@`bOE%D=@T(*sDO{6C}xcYzYIps~9@3AQ78+>SPZ8w%G=9@-< z^3&BiX3%Tp*8owjaRzu?Uif(uLKJ8D(?)`pMJB*Ttr>7&vVyaDa z+MyCYF@ZngjO7292|Db^Z$<5m35`5N-D=^mtaPjR@Xn9);I^%ObeJ)U;a z9sS6K?GfJaDVI7owsgKKpCr3d%VB|cxrmIq=HAq4ciH9Qv|fwaH0#d(VL59ue)LPR zY?YhuL5!TxRqVdU(zPL_@QtqcQ7gx?6KH*>@cXn66<6gDjY;C5ORWBiZS>7Pu{S6D zCZvF0@el5rbl7V}Ev?EUr?`IV+&H%^=X-#gsbM6)YU&?T#ZqxDdDR8B8Ma!prxo%2 zhh1W;*cWxepZE?(u6ggvc=>rDr<->gjF)lu38(QnRBmUrZckWF1j84X*VUrL;8d;7 znIm`9BGk2(SGk2U+ai5=6uxl>M7MbPGQXVfEm--;n|Qd3*AaEn-A>e1OcRR_&Q)>p zbVTVoR{ruhd?Tlg>7r+Je@qygAFF3sS6>`{o8{B`NL*jkfK;XKHA>C~_jcjXmfC)A zd(-xUW}|pSpYo23?3TE3+t!^nD`;0|+L3bG zH0ZZ2?zTuX^)T>15px?(*YIlBboDawqwkz7xA0GV`wVr;rJChBG>?`>uVJ|FYq=rVrfv+z-sUUk`-FIvN7Yx}I>T$2EvS*FVwaa2b4WV8 za$@9cX1z7@oiOW7uGpJk#-1?m;SKf`f`W2$YcZL&6*Z!#Ot-F!F07k8^- zHA@+}%N3C)(t91|PG5O~dsgM9{v%_V(Svj1ZnydQR!lbEBkJCRvb(-@1)Em=TFGfx zfiYf1@0b^HAJ8r1K;#~kF&bE(9KK~V$a15n-ZBQqkNA;0QdR1Hl$2+_*l3nuJbn>9 ziy4pX{nl46;fcHR6q&zbU)JXV%iShxej<7BM8^8)IV1k|WUT(%lqL;61qpAHm8+32 z*K$J&I60l%KCA7dU5p+OTVK?3yVx$a#Mqd;Z!YhkTOVDk~i>*iVru zU%DA95{dLLWlA^WMP@8A$7~dv#8>=sMf}sgDmvW}j!yq0CLIn(*+BL4UqpFu^&dpT zn?DXm!MBCO(!0-!J+@xxEMZ-^xm+%i%`uTrzP`>I5nGT2;5c$EgcBYbaI zHqh=b`A0g!>*a4jRnPv&3wGfrPqM(x-{!=(S9J!D)?Ix{$+=P|Lp_Rr=#PPfzRnvr;PM(RXQAvFVm!-KU>o#{&Ev8@$rMZ)G%hc z%7p(W0_XI{v1yk7GNi|&{XXUn5lM$5=~WSUh80eRF@LQFe8%A=nC$oUea~C zIjqvBBz?0XmrA!G_;F0SM~X_@$*duM&**fxhfM#*NV{Zt8MIP1(twY*skB|mqu9iy zHI>#ZX)?Q2_6Yv?4h}mE_?|tSZd35;55nOu&HC9*{WhzR+G{22$IuhmgEejFsXCJW z0%-$I<@_TiZGp4iPANM!^?1rmv!1?CcF6KmdJocVDlO|3R&Wd-VV4zOro+~>JwDBL z`K8hm{^=*upUdyME5n#gz7!FI})00RNK83jdN) z|J)^&i;I`}gV#)*bmKKwPoFU5%Bd6bC*GDq5ePw({M!XHx!$ z{9>dNqW^WdT<^&$yy*IG!~f0jPNny)D*U|)bp_W3+Q%-ZA#XAA7KX!(6rW!f4sWDz z#-eZ-Cz2Hu`e?{_fWmAF7c35k3n*MdVL64B6t1VRn!;@q-a}y%g=;Bnqwoh5`e@ua zqnzj|JeR@(3NNOxoWh9|uBR}c!fh1Jps6rMq0Gll0+C}@OipfHodoO{FJAca>^IG@5n zb>VO=g}1K@hqqAp{rjl>C_L-_aJYrSODWXJC7MoQCWW6kov(hbjD$!gdPN9}I`nJwlvKVGf1kD4apzJrq_^_(KXeQn>b^aCjGmg%1-w zg_l1`^c1E(P4wiVm24q;3a39y^``K*&r!J)?tFpDrEu9VNZ%9|Z6|$G*yBagH_b~Q z?x6Ofu!X_`3PpzZ%%N}$g)=A&QdmXdE(+^Yx%-JU83^rrQ-xOL(*}B6`g+af zLq2Bh#`)p!*&^~J#uxm(eBkHYLORCsEyZ_5O8R7Pk2~~gF@C_KQ~0lzThbrUQF=ox`3}H_ymG` ztne!>^(XiUf~Q#FlPvWo_&|d9w8Ddy`V(C50`8zW>0i`7k4D+wL#F)=BX~K{?~8)( zG2wXxPoueRe-ymIgclS16@vG+S=&FwX0|`UpQpKSS`_`&5&I|jhXkK!g|D#GpWqIf z6Sqdu|J0;EO7QgrFN=cTV!|CXrye0Ve!(~*-+$W;`GygEG0k}&IIZyCI}JF#%|4e08#Gx7A@SA{o}K2(srDGWpxwkndD{sudj;`}(&v6tpNCMN zRpIaut2{SE^mT&Zzh9-c^$hsr2t1AI`3Aw0t?)nuKAPaa=z<41?L|YFzf1FM!kJv~KuPps~I{MkqF0QrzdqU!NmvmQqYu6>{SZxsFS&Hm}2u%6)g zvHkOMEvnz0OYy&ukC|iTvn*2IDHQpV-~+Aj>mu+ninJ5Fmld8Lfv?r258IjDZ>7i) zf=`aBN5Is>K?;*XosaXa6#10sKaZk6VbXiZM?OgOZ$!cOnecN7UP-?4Ka#C_K9+3g zc?!WVCm;6LQTFzRX>Vl&|Ac(n=~3hCH9WZS_($;JkA}k^Tj?jQv#)j3IPHI8Hhf=V zJK?oH77o`~`4rr5zt6GGxi+cBWnUaUULGa<@lVhiAgbK=&GFqq^$9-}4!;sr@12qP zkKm7z@BL8}{4bIDkKprv5)MBb1^-E8{v-IO1pjT6eZCX%e+d4}md^dBrwG2D;FF^0 z^Gy1E1b^vgo%;tz3I5Zcb>4p*$CeS?*#-Z#1V8><=XSi6;Jl}fU%(c#7O7=ZT!IYdDSAI%vSxU}?l%lY0Hzd{7Mh zU#G%L5N@M!k?&chYI(r@I4j&RfV6aFsX+O`>OCP6<(ymD^z%$3QJXZ+Nam| zgcx>0m{;Fpo{tJ8pEebaQTIXGZWoC=vg zVq{hsH;lK8WS8u(@3k@&m1#6LX3 zz#n$D#2=iT7+>mRR8H6W5SJM6JY`2`bfRF1fAduaKK`2=o}N9r!q30nz^}Sl;{PTw zx>zTS+n2f)q)%;=kpJW$k)hah7yhT6P1Apjz~+JwHiv5uXC^((nNIvbh~42_u(*N< zoG;p#?&lI^t5KXb9v~2bDmvmWcmPYQyxS*%u`MYnza3KZ&Rl(b>$H z%}z^NB;`nwVv6T&Nd6>JD8ABwLN~?NOe0&?&cZ)rbwpP(N-K8sdTrD!i-M%`?AH)$ zTmRcB>eTUVz9iR=iP~=;45+@Oe3`IkKx*NBm@w^r%=Ee&cPQ*<*eJ*69*?_5XCgmc zxVC8^J_{7?p#WrFiUG}yi%Iq@#C3NYjWG7JuV>=_LHwLD4a80zWhUc4vnDTuY>>o0 zv=;%BS5UeKYIz~0Jp3^hAIRblqQ?KX?WsHUewxC)-o#ZHmm82W145azv{;iM6>eiY zahyv*io-d26op=V2=A{5UGp}8$opNW#Jdd5<^71_POqCjlf3_+9G7q5F^x4A;ugT-RhT=WF11X;3#lLIxdN)HO-tm;5>UC3l_3{Sjv$yvKT*&Yarq4d! zk@VTudp=?I^VSe%x_7sYzsPzsgh&d~Cy^FO<4ZkFZMsYK^c^nYD{f;c;e zA)c&%LY>?>9NpJL>^flFNZ5uFOXqj+k4#;k;?`u+;6iBQU#V1H2H!c;@1{y7`EN(I zZb$r#Iy8ko7e5ww=8w?{^h(5sBJLN-5D=t2s3dUnfVO9iP#=_A3j0C4PK#vXWX|&h zGM+GVz0@%_K=%+XX_$wiE+<8Elg=6eJN-LVJt-4WC36)PDw?^Rg(Ot^W~qIUj1v(Q#^;l#Tc$B;n5>HflE! zy#ODSxg9-7M=$d%HL_(5Ko;{sm{$XHlZnZ(2-44N5rsTyV@uo035|=X0`Z?s;shl~ zJ>O}@#it%XPNldN?3oGDO8^{5;eBvQq*-ROxx#h<(3gNwHE7$ z)BstamU^!KQtTsN=?`e5YW2-0+Ym6zf-O?9A=e?ud< zYvwEm8hH%_nDt#;T+%VhyKY|XKqF(6cg@~S@mzg9Xp8<%@u2<&tpi0@&U6w zNguAO?`O0J=`#h&`~^7PfkxoigTg4lslP-SZp3XKly%J;O!*sw^6w@kn^uIwULcnGWtVWrJPG{q z5G_k~J+SEszOs7C#!)7N|7wC+ZwmY?1B}8XSV3ByY9#7oKqxbb;MrVgM;Bd1J~7kIvfo5naDRB4EI@}VAFGF9%Evd zo;&Lp6T`u9pKW)67!HQ}oOG9TFi>VM2-%BWDM;cTT93?gl2pb14DtDchaO}ZJ@-Wn z{rc+$CJK<43jVPHNjD&r=|;2mMfXS^WJmiIkVMHtc%aZ9qRx<J!9 zl_j5nc#>X543f{36A`|5kUUgQL<9QJCr?Tq-HZ5e#8Y_GO+M>3?#vi{3wZ_f=9+}*I^k0w_^vFV7)3*>!kF)RN zTH{7kk8^lM-02OAWd(Se{D4 zV0jL3Qil+VGj%_P+tgx=Ho^vC&&7+8$Z=yYY)lVW=%W~a#y-dG@*8|VVjRXEUH1}y z&!vd_^ydiCbJ+wQ95;c@cudcJ{Wvl6gnBF-k-p0jJX$=3nDsD_*QSHPcB!%d5|L(jRhxjEk^#y#gD z-iMXjvlzO9#6lob+<1!D^Y<)`(~^z9VP*K8cf3!lJbz zdP@yk^UF-gezEJOWcari;JX*StH?cm9lKk-zpG-l-ggM^=q8Fede2v}Bw+)Q_rgyx zZN2P--+b|{pkFGyIWIH)Ey6nnF|GGp;k^Vgn_fwn-mzS^uz}1wZWIRALI-=yKY}2u zNJ?)m_e34P|L&c@*(5UxumROOu@Y48kRGzVSKywKUQO!oUWusCk5cWuL6oBF9mt=A zxLf}K@yUoM>-$jnRfzY{|B6zkAnsuU_2whqQ~wTqdap)2MSq&g@?L|uSI3CzEkN9- zPeEDNBA%*0jr^(ayU~)1z;hbn>H6cKosKwlOsK68alif{@@F7EO#c-4H-b+l)pRpz zit2f9dKNYPAw_3+i>~nC#yAZ%-Z`KW`Y4n>m$T7I^Pn{!T8U%S!%$jr6H5_D)DcuuDp+)FLdXQvCMhWl52a(T$To}xBX#{0bod%#cfjqXLFr1FX^l~-h` zydq2G600z;FJ8&8H6&{8VdI|*K4g0~7T!=K}=Sc3(^2SOTB$ABV z=adnUy)e?lkZUlG?;Rb7TVdkvHF19jk@t^}!`*D+?l*Azzev`jy$O*f$Kemz0Ub9L z#sQ8IBmd2yY%&=YqtO3BvM3I}|8f9-58%T1QqoYh4{nbGTtl9+e_S$vX4T$=(*JUo z!u6QAA^aA>(vn*Uhyj^!{S9ENQuDnxsWK& z{7_|=sqB8G#Uq6lhC77{ilNtnwNESXNxXd~`5%dV*w2#~inwjVjNw&C$X+&m_;(|T zf?=a28;nl24O7mVTV5`-UJ6=v7A4ZOzcQ?dMxeRW1m776iV;karZ$52n}ttFH3}bL zEqsKva3fJ5OFQ3M+DNms%$G3eosD&B))r`LTv;kMTh^;X1-rv>3F$NITEH@(RJYxu zHe#}tBJ&)0Vs3k`BFMthM7#6_=HlNcGkd}5$$A!$@dJ~18%RO2R-zWUn9|(#dV}$& z=mrzuL(oWQVB)(r+C&KHwpSaNIOWnVmze(7R3^UBspUz`A|taWG6NEGvypiQcwQkf zHyb<$0P{+TnQLH<0%lN^Ze$(=<{+t+W_660^*TnN!7}rxk+~b0Lu6))$~^mUFCp-E zPG7g&EyL;{6T4-azmf8@@Dl;rP;6k39t;KdNAJDZ&EnM?lJtSb#$@(p@f4<0KabMA z;8kbgi!s_I5?-s|;_o_^__*7yHq!8w(#v|pA3gMNbiK>%kXvTcg}E2(kXvS@!rT^i z$SpJcT2l13utRQ{ZD5HX7TB7`HihF-uyZ*axo=Xa^EQRf+Y~x)Q|P=+q04Ow2ev63 zS8&PLrf>wCncZKZ@Z=?`Fs3;w?2x_eMF54I^B*F!4ZgKY}O48%PiY*RRH zfCxShwkaGpf;8QOZ3@RtJK>^uuub8ZxtHRZ9&A%MX5sgVvOQQUI&MBj@f;77rn!8V0s4!*xv;K4S9V=lg{H$ynEP2rgQIBy(1ja4C5p()#Vg|AK# zuv_7{3MdZjRyd~oim~5?9|1&2;S&z*Rygtjb6~f^arFsC!*3p?LZ|q_@)Y<9DICMk zSIBal`Vh+Kg}4K|6^?7pvmtl1O;JuYDW}F#G7mp5nm$oU}@@_c@y_REKOar5Vv`- zGI`zDsAt~rZX^H`d?=1yV_V`=J|hj<@01XnQ(p|1x^ zQ&$O!#nKecwF9EKN|#Vp-;o}Sx2TaZ?DbYBqS_|ROZ`Z(nxA(CHq1{4FU=2LaNs(jW%kH(_jH@_5BzuE(42+X_Cc6lf^FyHT@Qd zd6}e|FZ%j{e}kn* z+#>O33|K6*1&gF01D2L7GgHL_7Mk&*0k@iQsyWVowTDr{)%|4&A2^K?X1k0M9+o8p z)Bg-@KRlJ4-CS^bL~@#r5`LtV06A2AK9r;4#Zsn6WoqWYt14ZBtiybZ}u7pXd79j~2GLZj}V$=YItjNHNh z27<03_o_2w(NoPP#gAE?n1)(*0CIvI5RLg9|s3GtOYid@4Cz zq(Rd^C&Du^mV`Ai^cElt+AN(o`8Gox(AN;@SNe>T!};j?;-^m2 z;lcNsUiZY`op|5XwZoJ69)QK4vGvE#V>)#lc1wT8eklefm&2a>GtoVN#(u@!LiscH z;2vi8Ix30DRQfaa>B|g%#(o`tcZvNO`}MeCApIHp48)~BW4}SpR`6%+H!d^%8T(BS znf{D@<`bqrW1sb^>Cf12ZZ!QF`)r%(&)ADDHvJjv0s2c1H@M&{)|0;tKrYsuYQ-&eg}UBIz0)-+bNR5v73ca zj#J0)LiW1f@MrAT^kjDf<2+N2v>B8fvr^t~_%rr`iA)qUh~}6?T%$P_f5v|8V#cii zF218(W8g}E#y)ki;m_FTadWai<2dU>oAPHInfIIij3euQ)1Psijpmg8jN=?`X6eqJ z3sU$q_Zj|-W5gr2$h7<_`ojQp;#gbPHqF5161ZpsKI9pq<<7o5&kX>?zM=WfzW-!$ z$YI}bh2Q9?aT)0g&2gq;()?qr}jIT3Wv1hXVg6u8|;xHvJxy#r`&tqA)- zZa*0G&`K#W-#s0Po*E=BcV7gwR8Ca5UjU@HhEb@>y#a}S+7*93U$w;DHo;m0{xTTY2u_YOeL((WX*_3pk9=X?!UrZ&0_{3y>J4VfneseHmC^$g6CV8&sHA=zSx*-60geOl zAEUau{w(4@1rwi0($BZy$O?_v18objJ-n!+Tr?-={=mrXO}QJ5vsJ#oku)k_s2dxu z{=Z;mFQK3EDYzpBBmPRaEtEsXXL3?INi@qOhfxtM=&u zW5B#c#R?tEv^h&}p_JrRBnBP@FYa&|nXx*5*5q}WsgvEnp8))-k)ON~tz1J}SN3&A-zOLFdQaz1WyE;KkF zf{F^2zGXRu>m+9}q!Oq%OjCT`Hu=mVH4Z2)xt)LpAGU}aq(v0<$JD0XfT;}lHV}XKiH)XF~Mm!d~TORNyZ)kolBFkyh~ThyCj`&0$tCJ=Um-%JpDc){@{(j zz>XhhiN7A&)t%7UBKA(`Z6fwgDE9ah-U)?pPW?$?-g|ZoZWij^vm;|L+##*=P@yFHD}G!jC;?HvsY-wy=TWcKhWg%7s^b= zMrbm2-1%CPV`vTmlToc6@DXpq5jB6z!3VPVgQ!Pn^4>FUS2OMk6IWp@Fd#oLAe4zC zZX0h6pNsO1i?Ge8g1iXZ%vF#VVR34pyX8e##FO3fA}m~1T!j5A)?0koATPq=2CH!q z76<5Vc@cIp<^;FA2+MAzTV8~%ghS_+7h&tLZgITP3#H|_#zr=8`u(X z5bio3t%56Z{rEa7s*!!B!(0mYdK#l_7BpiFh&P%$0k6YB!w;=$S+C1o$uyLuWw|(2 z&>N*`SsUb_-1~LLyovWibNkF!?7WIy-#-C73MJ9V-}il_M$1%jpV8+^WaGa{;fBft z2`u9_>j^iy5HyolDqQ0~G-;czN;2e}tmNzs{cDrC?KVvB?X{!|dZP`D)Rf+61tS%d zLQYX7OCj@>$Ra%z$(i?$kmWxvjPma=%b)qW+L7;{L=CEyo_C(ajW{nqH*rf9ZtsI= zg3>Cf3ei6V;KD#0<#Cg8p+Wf|r%cM9BYE3QMftQzIn-rP-X8|NM6C-e0`*5wVcEu z5tG_Cys}Cbvqo8mEao1WD(Y7zwC@`N@Li8u@TP|C^K7;(b(qD9HX7220T_e^5bD5m zcn>0d0@!YOVx%Pcz^rz;De4x(oC-K4SxuMHJrkvbXH6wMj^sApT)9AU&Nr2S`+1V{ zw%47~)h?M2mwgHEZkR;ya*Zdv^u z5@CkubD#R+=7kpJysm0QiEYVAnuL7(j~#z&D~TO?IgusVRxL}aK8{_$2}#;pK82gy$BlGT{Zf@FU*rq8owkQ;_8+Mi=OG&*^lZGSPj? zME5BJ-KTWAzXiI_K$f3CEz{|i=X1KxAYE51nm}|IDT{spwSNs+57tg^lUnrJzsB0q z;%fna>D@H+;u!v@Ae{vdMtU_*cP$?xWBwZQzg8$+K0rdQZH96~fQ0PcMQd36ijYHH zB&F)O1i$=(Q7(fdNyDtZyaP1u02fJF0qJ}PxJb%X8zpd&a#aW|Rv}{t7fD$OXWa5` zC7jwmoBMT0+n&TuZJclj==mQ9S1)=%S&Ps6m;A8(B{>-`X zM!=reL}kcN39A({))?e9-kvYzeF0E6$x({SPY|nZ9QPKE`&(7Y>o280LEOV|@pQ48 zx9020{0;$pqb&1a>d!Kj3nw9!tHGMg zCn0U=eFEy)mfj~A&quO-f|bf`RZno0+m=0{tK7!CVybc*^NOj;ZRi!}s!u^VWNe^v z+e#WxL%m}AB5>Os;A7gCfU7S#z$>;_b;Dl40ba3vDeN0c9N-n(m%Rt}3J&m!?aLuu zCFMb1=`Mk^1k?(;xtGgawOn;8Yz-jom(xHmphBQ*;gk+7Qgi7p!3NCPS3C!NQoq=K zbq+j*1;5z7Du+JNp**jy0`J`cezE-;>Y6*iFScL%kKnyKz%RDHV+Oo;2l&PIHGhCd zZ4U5@?bV>FS_gOlcIFp5VEwnFU!1GHAJ~T8%?IBdJ_r!rmYu5>fXlptgIN!(oX=eK zYQRkDm^76}dcTqu$jyqxfA`8&pP`?0J29hIz5>5ESA`>y1sC)>7qV0&n8Wn*+kg+E zVEC=9>{T#X5WU?EJ?1AN$pA?s7bSywdT+^YJ$*w-o1Pw!iff>$hxpA2XLZ`|(`i4%`$!#-ho;ziRZ6|i zhmdAzu^~553d5G?yrnR3d9GI~ZUo^x@(=4-i!bH#7Qta)Ej|*Z9>U$ztdU2cs_n>K z)2tQD-Z5Pg*E1iUF5L_rd1R7iZ<{V1FH55yo-Xz4rOFY>2@iba??QvNBWI?ahoJCL zmOVD@`XsV;6$+!CjLPz~2N9NBrx9ZnVhkb1_qbdED31rn zvDkLxFVn7bSiTAS04K+w4@jU*awRt~jBSX~X2xiiDlTm>(=e1mfot)01s2~;xsbOqgh_1U3&_P!7}8z) zE9M}^yG>kR`HR!8FJgH;HgQm8%^(JZT2*h$3a+_t~smTguX zVEGHvu7&kx4(xfX3B))|IQVb%nH*s80rqanxiEWN2jK~2HgKAYi(zcO)X~5yKA}H5 zSXRJiu9w)%^#aaZFR}UOIh?sLd!Ei*nE4gXTraVi>uH?1u=FXMxn9DVtKw7G_%t@o zrn1-A-1Q1hWfxiYj{W6v($FQ0Y9bkrp6hk41We4;J8PWjT&HubA=g$u;MOzE<-0Kr zV~4jALD`ckrOVbO-%M5j2 znO^8mmn%oq%H()Vl2^*W257jFs$h-GmxVyHSq1-&onIyEI=B^4)+0()AwyX$b0xSI zx0tCkA&N)lK8b4*QTP^n7*W=x6;ax1M)?4uY|$0r`mBI*AELDA%BWbs-HZaoU9!HJ zr-SrYg*Zr;Nb~zZUS65s0rj#zN^M14b6(Wk-TN0(pT;YL+X~`jn)IUdKa85>d7^3h z6woWbUtyYExY|kclc?KDqUl{SUz;jN)42!tR}RI(>HPisD`TNao+pEDQ7bUcvu#Y# zyJg_oPNsgxqUXUR2V~|)wJ!Q}nIYS}hz^rM8rz~AX{z{18|yw_C_rjHnJ>F2wz-7% zVi231tWOSU{>wn}fPBLaR`-x@^zfo8Cb|PMpW&G34#+nvY>H!|J0SBpj){)ve>KfS zcK}8AW6iGN)_)$oTx$Q zcgVU6v9ild0*ddEb^idB0xY6Z?jTB`urq1c0Rmg{5-@*~R^@k}o!6E1ny##qGHxiO z`Gp|tXXQt(XV|ADjt$RI8TPX>bM)JoW}lUrr(eHd5;9!W3#QV!hw04rtZv~jvpuWJ zW6>^X^Evqf>d8Qe7=b3uS>suyX-_m(~5}Ejzf!DvJd6oW908dw% z3-zZf`v~(lxH7Nt0#|>waN1cPt3k}4@?nVAv_s6Fa{Id_eH#lge;<_e-L@S<3~f&} zLK1EOvVXT1l21VL>{=-u2?z&$F%l5sD|sX!JZI&RfRN^qfRN^qfRNTB0U@JD0zyWQ z1cZzp2?!ZI5)d+aBp_t;NI=Nwk$_{0ArkN=#SjSy9P5#QkkKOnAv{=*1cd(Tk$?~s ztVaUwQw))S@O(v&1cXpRJreMsWQYWWj2;OH89fpZGI}H+Jdn~O0f9F?5)htdWJCf& zCovLmjD}sYNI>W=j|2oF5DB;m9vi6-kX!+19M~>=54A1_z2k>MKg*#`e(4r{D(k3) z-_+>iSce(g8Feu-S988{)nV* zgp@pINK!Yk_8)hLQkQ4>boG`gxy!5?!7(-?<-J!&r>UdXft()f8V9vRQ=5)G-%IX z`(wxd<995S9fQ?(HS~}#VPDl3;9~gQw7|s?$a3j?fTACia2w!)!i`QZtH~eq$e+0h zYHp{6yCwGUtJ9DhD5s~lG3Ryuvol@RTS3;`cd~R?ntKeY?SU-6QP!dJ=Xx&`YW#}X zcD?z>a_M7(5mI;x8K*zUVQy5K_wUf+Es*6G)27e(zp2;01#3%{9pGJjXglJje_DnM zah&wb`iBB4>l$${K7<{EXMC9Mb<)%FA7X;+te^t89lKdU(jR?QVM2ANoBCG(I$G7odfxPAdzd;GnFjQV?Z zeZ$L)ozy*ioS9~ulg0%;&h*y|CiO#|B1C9Dah_cjF#jw_lwDS_S!zjOu?MMrL3)uph-+S!RiGCj5v`mQ>$jJRdO0_^n z_7@Sd%n2fN7g7F;WF)+pHd8F~9xVAP_@dKOs5TlK5-!cJI%Jy7!o z?00UBAvcH2mDk+2BD%~L%~vb#ao_j1CEs9 zAzD}}UsdERuoW#RDwWG}OXd<%E2M>p)J>%7#fexmPW1tF#quDtKo>yAx3B=Y68F zG7E)jnd7dkG+@hQz}nJf?as{CRMzO)LlsY z=#sTMk!_U<=~3y`v{IQYGa}BVBwtgIMPkNo*wWqmYkFkpLLO^7zZ}~x00|dDhafkH zb*CuZ!D8045@XLwdC$t2Je+2sx$Gte%AEuo)K+2Cqe=5~*Xjg7KJ(HB#n3(p=2V$! zW)wa@P1ZzoL8dt^ERc5+kuDMqYO&EOb<$8{NsfuLsvKRIkX>qJ%~*3;fed*`TCOAI z2*g()wH!w6Dr^h0SFbf?R~pF(ZLKm|7<6d0XmZzZTf25vTeBYDMhg^d&1e=XH;X)G z7WrmFEHGP1q1i6ya1$(ICRof3v;+*aG;NS&%z&NDE?vA|<-A`Nv&=Aa&Dxx2)@J1_ z+MI8;&;@HvH5YPSFS1e+Hon-b-X&(`SDCfFbgij$8SNd}9xN9X`~Qg=XHiKEf#QnbK6K;OA#}Z;;ecq zG3&k5Y!zi$wdge4g)6PXa(wkvTa{&7f7{~pe`fYIPY*@hH7!n)EGU>$P*|`byU$xKU*Q~()k?$_&8*_NS^V62 zvkc~0<_EK7Ey(JOT9|>sNEVx|Vo6rxsuEq%rQ(oYmhSG~=E9`qWatVU9?T~9T(g2y zaT|~a%;aYge}Uzuq;M9c%;EN1B#NMztwRz7_$$&P5P|&XqB-Oft}cb={jxOf3q`8^ zY@eQ|@E0uE7Rx;s1{H;%(i`Ta2CK@|)ivbb_*fzq^e1YDgT7=c9!%6ELgT5hFBy$X zQX=V#CsQ%ffXo`;uU#tdIC_DS{|Y7lMJw_(sYJXc6!C{sfuO|NGUsM#*;u!xzqu1w z34|ia>QNw_8udj2;ULKhGp|jtze0yI*Z(Dm)&Gwz`HLX3}-r2F52u5E|XG@~hYfS_i zkA{PBQbLyPq3{?}6UjPA<$&K850G@Or4p0D_;@Jd3zHlf)8j*NR%=(kyLMoJr1MCt zzGR(;fkD-jO+U%!v;0IT5R9g?x+UZ@TjsZh+rBT!hfzIE(^#n&(Iz2H7V|LYj^+(|y*-<_Ug?$n_B zB>C@KE`4hD>>rPy}RC{EZ`y7H!KcaYChu=kq8{Gb) zNXM>lxLw|WiA|vtXIHdQbvCXIl1TXjp?Hv1v8DB4V*=(^OWLaBOEXle&pFh?AY+HR z1M-hiprSe9TUo`vRkfGX|)-^w5mwBIb^A=!80Y zw1Z||bEI{y9^gu!7}V?Nbkz~HhR~Whr;gl9xxbHcvYBx|=sc-zy?Bgf)M|%vjf>*k z0f6TmBk7F#nqx#wsVT+n6#u>3dGvzq#w4Y2hr_nu=jw@3ni+Pa_Kc*CZt=XH>QJ3W zDY3_lt-p)PM;#eeHdKr-9!@#3;?XWCbd1Q7>Z*aL}RFsDoAr;Y(XQht#vgh_-mtt;$udnR`iE-ICT9 z8e12wO07f*I=^;w;^ff@Gz#P6?} z+^}9-zjjSL7#Q^>*Mvin)MO2PX{p{d)ABPEB1@I^gq96pS{}`7Bbk@Rg1Fl7X)X{P zW7tCFS?b2D9*7X2UXgE|(+59TCaP*Z0e~7#8jwIvcjE&W7FOKIAZk@S7iO zt7VnV?e{sR}AIH7EF&YU3 z>P!tNKs}@$AgwUFF&~167nsr<+V*B$XO@ms)d} z%o|5%RF~>HY*;0BI1bac9&^l`R&J5Y)pE$%hIiN&p4#HR0JUe7!!n_?g`}TW-r>CS z5U~(4>8+`-P3+)v%$$R#f#@ZpOY_GqQ|h34!L2S$xle#0QqzfNpMx%EIu>SP(j?au zSK5YHGJ(65FT(L|8cp=~X!Qz>QwoJc8|yq9GHuSlX%?G8r-q*iwS8QcVKrA%Zd?9+ z#3rbW53;HM8dohTxrqO#-00g7gH!rk#159b+{&i82Bi;}9EF3#QP>Jrc5V-ao}#Oj zuZ&va&uQjb$k?8v=uk;f+RM@f3R|+3Wm&51z~%k_7U612xYb0s>hE8_jg}}q46oXN zr>tT{%M3+UJ@_wD80i=x|3*hTM#=wl_>KNM!O+NAjb;sec7&#K=) zdsbQNRGHNblQkJ|=q#ar1qbs#9wIx9*${4Oj%owe6`y ztKZ66+2~ZirZia;o7x@hu#M>LE>x?3JHw}k6)v*du=wvN|A!f?|6mnhALPGLf~K^& z$ZGY2Lo;_O)lTAqc6@)tHmR==1*htiRTX48;ib=~45fwYX1Y40sAC~t&ap7KZ2v`{ zFEJ&!e3=g<$VXE%o4dK&CL6ptB@H&XaCXB)ZxM$4q$dQdT(An954$5#3ajRV66=Z>d}A zI?4W@4Dc;S_Lx6v(;v&+sX>p`lLOUB>~O|?j(i>!A0xOgq)r?%vvis`I~RxnT$*|Q zk}Y|PTR`zC9qk2DE2Gj*=LK3LrPnAj);K}hp-7pOOHR2j(o)NIOHR?P(LU;ytiP;- zAo-*5VCI4j+TxLLwiR;6Z`~&@xXIRrJ&EzaCp^+|cdk7DBRJ_BkA;JYn$ci59Nis_hXYszFt>N_tZJ&FHecnb zb=SFT-PcvE>LYa8d`Sjh<6d30W;~gS1h=5yL9)KMe{>5OK5N#mty(iuwWg=GY7Obz z7XQYL{DH5|k$=<|mlC0ygJAknI2su-b9=c*tu^UqyhDkY7K((D)bg+2+3ux@uAZI! zEsZ<9-k$EAy%f^2tEJnk^|kc3^zCYCZm@t|Cu!PnLW@VENllY>wl#D&ceYTx9X*3> z4c@LEZ+lO-0SP)lFae{ZWze#nM%)VYGX8e8H@EbVvi3bKragiNS4$$D=APZ%G~LkT zZQs>G>5)dGvB+?UC=DAlbdXlKtiyw@)u=!{uM3Dk z8V1_?k$8%bsq<(_3oUpoVCyVk>n&h)7O=I__HkcgObP_UzA4RJTboKq5q~rsjVGj? zgbnw4iJ)q``+EDlQrMSBc7`HBsVx{98BI!^jSY>#5i&|A67Je{oP&-AlG?fWQ4f& z9VH5`x`uckMB(mjAj?%vO`oh6vk|>OHqA8jp%92GG~VP8@kf?jIyc9j0!cDP%X^=e-{lniPNJ?szEYQ!c28k|i44Q?=&FjOc45j0LE z6TQKBf6!0a>}}{HoJvik2VR&(0ELthjHWQr2a)S!U%yxKrO4XY6b%IZwNf*wx3kl0 zWF!`kCWHPYG3un$KxG>XO$NgWDd~d|!Z68flT0NTXG~@>GPuYhOJ=lGA{a=+%`_$2 zi{=JzgQO)}$+k@DqjrOGmnM8+vWQb5H-Ys?+nIK|JG#NfN$vL5+O(ZOcN!C;q2Z)N zBo&Mg`^Yc?VKqP>nc&GZ9=e&d|6f;z|swactK3c)V1=4g3qe^(Q0#vcyF2&SJk9}4*yIFVvKXo`-9 z{QbU2qN`tXZ;<-g00RAyaj`2HPlTcoX&*Jm#t=1uUQm%VG?ffOjt(yPg{9Ub!TvWX z#e>6sYN)zi62UOEPqEzWs}7atmWIPoB8BFDZ-aMdKP_~-4WqM}umQ%^mzW3;18X95 zheL53)cW%@DTc!YY_q2WfAZPY(x(L@WOtqq zy6fubn#(#v7BD(aQdHbv8qCzGpfqk9+62l!8i@`M0~Nxa$(bNssY%5BhLxtjy=!M@ zgO|)9bPYi*H&V;r&J3$NHQqA}0~w?|FhFGkgBZrC6!%ZW>Fh!$ALvmlvr{_5js>SA zBGrDno-m{9r8Au&<1uFHj2SY+F%B54nb<0_fL6O5p75dBrsD7`QBy3{8V}x-Ff z)kFkE8caw;4atz74{9Qa)Odu=#Uq?Y$j6A{E04^wqh=vh_dOB!VG~BJ{$H%Zqqe+7~`=jII(MU~eduI!{ zLEe_G8mf6#ZHO?z8H*6cz>T3q34L%4>HNUNLm;$ygDAYDWRwv~OOguJAV;)5@-IHc zi4bx?rXfj8jd#b`92Fd4v$db%b@O&x6LhS%wd*2|aSGtkNlmOR7?5Vc>7pdFRg;k+ z1Jz__kHi@uC3?36WkA(9cJ)RrO12zm3Dh{ohvJlzD^NpMV;}x>1hxrgL7d~^VImui ztZUTfW4bG}&qq8JfK5pn*>u3(h*`WwH#|g-v=;f+hJ1;j#8-<*K!f)dP)|1!O;aWX z1Q_;>BoLLlLNId=!O+!-Q9PnTjSW>qrZbxXnMeUxCvyQJ1VV{1Ej=jl@76 zTwbxzxNj_oi+`FWDg}~*mQX*SNlAk%Uz5=>qHydP7iVaEgttLm7UDOJhDa|bs5{1m zrGb4hwXa`mR6Oml-hJA<7W0uMo_=}QR~`FW%f8l08uJ4@dc)`}uqS4*KF`fRVw$yb99R2pQR_NPszpS;mFMZ&Wq> zCn|xu@uw?qOJ7%ecSEPv)7!73rSXYNLZ&Wo_tP*U_K{$8JP1Qv2T~KzbF`Zgzo|}= zD2nw!MDwH}DLI&2OL~8K3V3dCDGf}5zWTI;-Mk(q-?21OlG|$>A z5hnYA#&7UUH^h>}`yBU?jk?)k)x3?Jj5H*SWuz%%c7sqz@r}PQrGMwaRE$hmNwS#I zwRcK`eKKeTRvg4&W;7o2Z~*CcYaHf%fkaa%?x(Y^pETHiv&U3Ufv6@JXE@A^C|($G zWHt;lG)6^g^N}SwNc_@C%3L%>6doU9D|9d(CrcTnP84V0nRw@<&S)?~cUYHEM*4TK zn)c3isLlwRm}`Q^NufwYZyO8!F_SFF@F4Cab0ei)zOWlUJmdpAVIeZfPgc}m0Gtkk zgki_SEAhv>qx&>s#__Okih;Dj-JwWJ1pTrgOmHw@XxFtQS@YsjH0HZ06$CeuJ_h4E zfvMC4ZU$muUnGc47_Mg+cabSN#@p(ERhP` z@@nq&a7>->Hwhn8(oQ-pHquArv#bknqmh9_XrEDh3{RSl zCg}%jg;5+LlSMVmZr}k|2ZBSX5mMO~86hJav!TdvR4*DDB0CzMql+=7X-`=atN)$; z7O-C`B(A#+NPBJx_+TW{f|gYCj1Eh3wibU&GPdFentI%K&W4mUyt7` zzgG}=iST`wP(M~skKZis^;*~Gf1eiWKZ;ipJgTvL-evedCYi_Id8~gP>#y2o#;+3U z9~bJYN9*yM<=<8|0dRd6YEQc@o%ip?cjN#{Wl-M`j5=sKL7rM zP+vN;7r#wkS?gaC>Yu^-XRuaVG0(3{H5a1nQl zY%RafH8IRog&8i&uPsaa&OHn&(iL$_C4=q_e@$3_*Jai(g&51uIlTy8J?%F$7XoGzRsHA1^W7Fh8ODVq8UC%U+>KDB7Ge*!;AIx$qX;i*Bvvw zR9{cb@G^a!FvFet{BMT4^m*M3FW2X5GrU5dht2T0>G{0$B0$-d3z9b90Dgy@N#4f%1wg@kzWtsAX)6EL8hhu_0R3rRJ0p5V{l0q|l zH>F=GsVFx-UWaKqQ@^((omzp;rzn1=ojjbSUyo#gpUnb)A`ASfEbw1tf&V58{N*h0 zx3a(;vNgOU3w)l;!jB2?Um_jx zZJfVDxOm<79}zCzS&}`SaJ}asT~oq%XdVzR-O(8$e3H-bl+ubYl>vn{T zuL-{w;kOBPbrRvdB@E85lKlpSXZjD{M11k}oMu+>yA4B}(CJwSy z^S=>ad`sS22p6x_gzLjgEavSp2g4WNlw6JQPb2>yMg49<_-D!)`~j5D4u>_Lngi#t z@3MBQ5Pp-xdVM+IVD@MYu|A4^%MWmx59WFN|m*KAx#v{CD4)7-g`(KK1@jbY;2)`ZixgHyH z8K3sOWJ;RvDj%T?~F7 z;%`)eH{zf0JC*ToE8=ex^w@!L@ly9a2wx)DTNvTuemsHjF9`BKtXj+GlZekR*x@_X z&u78^D&q5F_K%}~`*oGsZ3)^fm*+Q84x)c@7U}SNclb{A351JpAb%F&4+wtmA5^AC z3H8WdU-=s9i@zoKJpR7$XQaaqvGbj?Bagwwdz;G;?!qfSxIeG};o=R_D-pg{(C<2g zi*I*t&tr1CUsxBq5YF%9=61Ln>3l>OcL9Xgp`CmJ;mJHEpL&!}J;J9DzaITJC&E97 zaDK&!6ZLx+!o{1TzkqP@3hw)m|6`A`cKL?tA%s^6^V_$P&X^##XY#D=@Wnjq`5z2} z?nlsX;r>z?!o_!}Ek}4Gj^9Sa-;j^|f0yye{gxJlpFueHKYI`^J!;0kA>W$+v3%U$ z3G>)g7W`YYz(1A+{w3^}jN^#=+uuU?YC+DABV2qFTzw@aI<}{%bf-@}Cv9Qh4Tb<7ULaN7#4lM)>qQ7`znaA1*|{PLM+q@mmCc z@`Hue^7$Onkp%fj{&+HxObrjii8gIVQ=it^-tW~kDFD$&A$o8kIS#Rd5Ito9(zHNS z8wp2;d|@q+jK&k1F9mU7a4Iqx3{!vy1dh9y<%dqpVqEvnjsR5V&a_EyzRAG9%0|Vn@?j`x?4hw3hB>A|)m=o;GnA zkhJE(?uM@RCUXg8S<<$5_B2A&XlrYKi&yhDGgP!FSHRxoRnF_VVH`9I6ZMInGt zkLMGj9%)0vW?33f4I5$)vjqHF21=UF8)Y7dvxxOI#_(AjlQ5lnu{>R1I>;nOg_@7{ z84gx~D%%Ysz!X)C;fRJPKQX}C5Fls_IyQw|3Zdra<9|Xht{5hX(*zw$^!U12Q>Hj& zL(HY78HV6&QQyL`RMVN8VJq9nJm{rqBjeEsvZ$pG)ny!PAxtHr8oLR~I^5a%oCiI! z0QUfB^f+nexm@8~iVzbk9&;4J=QB^*W}IQSJiTg&C>2hbnvQ5#oV7Ac{T2bgIDmw6 zpX0tTF>0uyc7OJ*mLhHi?xQR$H5lmQ|QOi83 zV0AjqbSTttD$;n0lwM&FBU4L|PLJmE8&J4Cm~5d35a<;Rfq<7fTC`dOCTV`&HS5_P z)3N_-r!;0cYoJH@8^X1NlcA*GKTy#MvebwRgO1rh|F(i5@_md}j+*E$Wt zF`NZ3p3hI*6i-^s#c(Rj7{D$ZvavY-iHB@0Pu=O46$ppgEzdgfqx#l|nplXxz%o5e HV21rCs#~Rx diff --git a/include/GRAPHIC/CONTROLERS/D51E5TA7601.h b/include/GRAPHIC/CONTROLERS/D51E5TA7601.h new file mode 100644 --- /dev/null +++ b/include/GRAPHIC/CONTROLERS/D51E5TA7601.h @@ -0,0 +1,110 @@ +/*------------------------------------------------------------------------------ +-- This file is a part of the libuc, microcontroler library +-- Copyright (C) 2012, Alexis Jeandet +-- +-- 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, write to the Free Software +-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +------------------------------------------------------------------------------- +-- Author : Alexis Jeandet +-- Mail : alexis.jeandet@gmail.com +-------------------------------------------------------------------------------*/ +#ifndef D51E5TA7601_H +#define D51E5TA7601_H + +/** + @todo Make an abstract layer for framebuffer devices and a painting api for it. +*/ + + +#include + +/** + * @brief ili9328init + * @param LCD + * @return + */ + +extern int D51E5TA7601init(struct LCD_t* LCD); +extern void D51E5TA7601setFrame(LCD_t* LCD,uint16_t X,uint16_t Y,uint16_t W,uint16_t H); +extern void D51E5TA7601setGRAMaddress(LCD_t* LCD,uint16_t Haddress,uint16_t Vaddress); +extern void D51E5TA7601paint(LCD_t* LCD,void* buffer,uint16_t Xpos,uint16_t Ypos,uint16_t Width,uint16_t Height); +extern void D51E5TA7601paintText(LCD_t* LCD,char* buffer,uint16_t Xpos,uint16_t Ypos,sFONT *font,uint32_t color); +extern void D51E5TA7601paintFilRect(LCD_t* LCD,uint16_t Xpos,uint16_t Ypos,uint16_t w,uint16_t h,uint32_t contColor,uint16_t contSz,uint32_t fillColor); +extern void D51E5TA7601paintFilCirc(LCD_t* LCD,uint16_t Xpos,uint16_t Ypos,uint16_t r,uint32_t contColor,uint16_t contSz,uint32_t fillColor); +extern void D51E5TA7601paintFilCircMidPoint(LCD_t* LCD,uint16_t Xpos,uint16_t Ypos,uint16_t r,uint32_t contColor,uint16_t contSz,uint32_t fillColor); +extern void D51E5TA7601getPix(struct LCD_t* LCD,uint16_t* buffer,uint16_t Xpos,uint16_t Ypos,uint16_t w,uint16_t h); +extern void D51E5TA7601refreshenable(struct LCD_t* LCD,int enable); +extern void D51E5TA7601paintChar(LCD_t* LCD,char buffer,uint16_t Xpos,uint16_t Ypos,sFONT* font,uint32_t color); + +#define ILI9328_REGISTER_DRIVERCODEREAD ((uint32_t) 0x0000 ) +#define ILI9328_REGISTER_DRIVEROUTPUTCONTROL1 ((uint32_t) 0x0001 ) +#define ILI9328_REGISTER_LCDDRIVINGCONTROL ((uint32_t) 0x0002 ) +#define ILI9328_REGISTER_ENTRYMODE ((uint32_t) 0x0003 ) +#define ILI9328_REGISTER_RESIZECONTROL ((uint32_t) 0x0004 ) +#define ILI9328_REGISTER_DISPLAYCONTROL1 ((uint32_t) 0x0007 ) +#define ILI9328_REGISTER_DISPLAYCONTROL2 ((uint32_t) 0x0008 ) +#define ILI9328_REGISTER_DISPLAYCONTROL3 ((uint32_t) 0x0009 ) +#define ILI9328_REGISTER_DISPLAYCONTROL4 ((uint32_t) 0x000A ) +#define ILI9328_REGISTER_RGBDISPLAYINTERFACECONTROL1 ((uint32_t) 0x000C ) +#define ILI9328_REGISTER_FRAMEMAKERPOSITION ((uint32_t) 0x000D ) +#define ILI9328_REGISTER_RGBDISPLAYINTERFACECONTROL2 ((uint32_t) 0x000F ) +#define ILI9328_REGISTER_POWERCONTROL1 ((uint32_t) 0x0010 ) +#define ILI9328_REGISTER_POWERCONTROL2 ((uint32_t) 0x0011 ) +#define ILI9328_REGISTER_POWERCONTROL3 ((uint32_t) 0x0012 ) +#define ILI9328_REGISTER_POWERCONTROL4 ((uint32_t) 0x0013 ) +#define ILI9328_REGISTER_HORIZONTALGRAMADDRESSSET ((uint32_t) 0x0020 ) +#define ILI9328_REGISTER_VERTICALGRAMADDRESSSET ((uint32_t) 0x0021 ) +#define ILI9328_REGISTER_WRITEDATATOGRAM ((uint32_t) 0x0022 ) +#define ILI9328_REGISTER_POWERCONTROL7 ((uint32_t) 0x0029 ) +#define ILI9328_REGISTER_FRAMERATEANDCOLORCONTROL ((uint32_t) 0x002B ) +#define ILI9328_REGISTER_GAMMACONTROL1 ((uint32_t) 0x0030 ) +#define ILI9328_REGISTER_GAMMACONTROL2 ((uint32_t) 0x0031 ) +#define ILI9328_REGISTER_GAMMACONTROL3 ((uint32_t) 0x0032 ) +#define ILI9328_REGISTER_GAMMACONTROL4 ((uint32_t) 0x0035 ) +#define ILI9328_REGISTER_GAMMACONTROL5 ((uint32_t) 0x0036 ) +#define ILI9328_REGISTER_GAMMACONTROL6 ((uint32_t) 0x0037 ) +#define ILI9328_REGISTER_GAMMACONTROL7 ((uint32_t) 0x0038 ) +#define ILI9328_REGISTER_GAMMACONTROL8 ((uint32_t) 0x0039 ) +#define ILI9328_REGISTER_GAMMACONTROL9 ((uint32_t) 0x003C ) +#define ILI9328_REGISTER_GAMMACONTROL10 ((uint32_t) 0x003D ) +#define ILI9328_REGISTER_HORIZONTALADDRESSSTARTPOSITION ((uint32_t) 0x0050 ) +#define ILI9328_REGISTER_HORIZONTALADDRESSENDPOSITION ((uint32_t) 0x0051 ) +#define ILI9328_REGISTER_VERTICALADDRESSSTARTPOSITION ((uint32_t) 0x0052 ) +#define ILI9328_REGISTER_VERTICALADDRESSENDPOSITION ((uint32_t) 0x0053 ) +#define ILI9328_REGISTER_DRIVEROUTPUTCONTROL2 ((uint32_t) 0x0060 ) +#define ILI9328_REGISTER_BASEIMAGEDISPLAYCONTROL ((uint32_t) 0x0061 ) +#define ILI9328_REGISTER_VERTICALSCROLLCONTROL ((uint32_t) 0x006A ) +#define ILI9328_REGISTER_PARTIALIMAGE1DISPLAYPOSITION ((uint32_t) 0x0080 ) +#define ILI9328_REGISTER_PARTIALIMAGE1AREASTARTLINE ((uint32_t) 0x0081 ) +#define ILI9328_REGISTER_PARTIALIMAGE1AREAENDLINE ((uint32_t) 0x0082 ) +#define ILI9328_REGISTER_PARTIALIMAGE2DISPLAYPOSITION ((uint32_t) 0x0083 ) +#define ILI9328_REGISTER_PARTIALIMAGE2AREASTARTLINE ((uint32_t) 0x0084 ) +#define ILI9328_REGISTER_PARTIALIMAGE2AREAENDLINE ((uint32_t) 0x0085 ) +#define ILI9328_REGISTER_PANELINTERFACECONTROL1 ((uint32_t) 0x0090 ) +#define ILI9328_REGISTER_PANELINTERFACECONTROL2 ((uint32_t) 0x0092 ) +#define ILI9328_REGISTER_PANELINTERFACECONTROL4 ((uint32_t) 0x0095 ) +#define ILI9328_REGISTER_OTPVCMPROGRAMMINGCONTROL ((uint32_t) 0x00A1 ) +#define ILI9328_REGISTER_OTPVCMSTATUSANDENABLE ((uint32_t) 0x00A2 ) +#define ILI9328_REGISTER_OTPPROGRAMMINGIDKEY ((uint32_t) 0x00A5 ) + +#ifdef _PRVATE_D51E5TA7601_ +void ili9328cpFrame(LCD_t* LCD,void* buffer,int x,int y,int w, int h); +#endif + +#endif + + + + + diff --git a/include/GRAPHIC/CONTROLERS/genericLCD_Controler.h b/include/GRAPHIC/CONTROLERS/genericLCD_Controler.h --- a/include/GRAPHIC/CONTROLERS/genericLCD_Controler.h +++ b/include/GRAPHIC/CONTROLERS/genericLCD_Controler.h @@ -35,6 +35,22 @@ typedef struct LCD_IF_t void (*readGRAM)(void* buffer,uint32_t count); }LCD_IF_t; +/** + * @brief Lcd buffer + * + * This structure contains a W width an H height buffer poiter to be copied to the screen at X;Y position. +*/ + +typedef struct LCD_BUFFER_t +{ + void* buffer; /**< Buffer pointer write on pixels you want to print*/ + uint32_t size; /**< The size of the buffer in bytes*/ + uint16_t X; /**< The X position of the buffer*/ + uint16_t Y; /**< The Y position of the buffer*/ + uint16_t W; /**< The width of the buffer*/ + uint16_t H; /**< The height of the buffer*/ +}LCD_BUFFER_t; + typedef struct LCD_t { LCD_IF_t* interface; @@ -44,6 +60,8 @@ typedef struct LCD_t void (*paintFilRect)(struct LCD_t* LCD,uint16_t Xpos,uint16_t Ypos,uint16_t w,uint16_t h,uint32_t contColor,uint16_t contSz,uint32_t fillColor); void (*getPix)(struct LCD_t* LCD,uint16_t* buffer,uint16_t Xpos,uint16_t Ypos,uint16_t w,uint16_t h); void (*refreshenable)(struct LCD_t* LCD,int enable); + LCD_BUFFER_t* (*getBuffer)(struct LCD_t* LCD); + void (*writeBuffer)(struct LCD_t* LCD,LCD_BUFFER_t* buffer); uint16_t width; uint16_t height; }LCD_t; diff --git a/include/GRAPHIC/GUI/Widgets/widget.h b/include/GRAPHIC/GUI/Widgets/widget.h deleted file mode 100644 --- a/include/GRAPHIC/GUI/Widgets/widget.h +++ /dev/null @@ -1,42 +0,0 @@ -/*------------------------------------------------------------------------------ --- This file is a part of the libuc, microcontroler library --- Copyright (C) 2012, Alexis Jeandet --- --- 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, write to the Free Software --- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -------------------------------------------------------------------------------- --- Author : Alexis Jeandet --- Mail : alexis.jeandet@gmail.com --------------------------------------------------------------------------------*/ -#ifndef WIDGET_H -#define WIDGET_H -#include - -typedef struct widget -{ - uint16_t Width; - uint16_t Height; - uint16_t Xpos; - uint16_t Ypos; - void (*paint)(); -} widget; - - - - - - -#endif - - diff --git a/include/GRAPHIC/GUI/painter.h b/include/GRAPHIC/GUI/painter.h new file mode 100644 --- /dev/null +++ b/include/GRAPHIC/GUI/painter.h @@ -0,0 +1,48 @@ +/*------------------------------------------------------------------------------ +-- This file is a part of the libuc, microcontroler library +-- Copyright (C) 2012, Alexis Jeandet +-- +-- 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, write to the Free Software +-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +------------------------------------------------------------------------------- +-- Author : Alexis Jeandet +-- Mail : alexis.jeandet@gmail.com +-------------------------------------------------------------------------------*/ +#ifndef PAINTER_H +#define PAINTER_H +#include +#include + +typedef struct painter +{ + surface* __surface__; + void (*paint)(void* buffer,uint16_t Xpos,uint16_t Ypos,uint16_t Width,uint16_t Height); + void (*paintText)(char* buffer,uint16_t Xpos,uint16_t Ypos,sFONT *font,uint32_t color); + void (*paintFilRect)(uint16_t Xpos,uint16_t Ypos,uint16_t w,uint16_t h,uint32_t contColor,uint16_t contSz,uint32_t fillColor); + void (*paintFilCirc)(uint16_t Xpos,uint16_t Ypos,uint16_t r,uint32_t contColor,uint16_t contSz,uint32_t fillColor); + void (*paintRect)(uint16_t Xpos,uint16_t Ypos,uint16_t w,uint16_t h,uint32_t contColor,uint16_t contSz,uint32_t fillColor); + void (*paintCirc)(uint16_t Xpos,uint16_t Ypos,uint16_t r,uint32_t contColor,uint16_t contSz,uint32_t fillColor); + void (*getPix)(uint16_t* buffer,uint16_t Xpos,uint16_t Ypos,uint16_t w,uint16_t h); + void (*paintChar)(char buffer,uint16_t Xpos,uint16_t Ypos,sFONT* font,uint32_t color); + +} painter; + + + + + + +#endif + + diff --git a/include/GRAPHIC/GUI/scene.h b/include/GRAPHIC/GUI/scene.h new file mode 100644 --- /dev/null +++ b/include/GRAPHIC/GUI/scene.h @@ -0,0 +1,42 @@ +/*------------------------------------------------------------------------------ +-- This file is a part of the libuc, microcontroler library +-- Copyright (C) 2012, Alexis Jeandet +-- +-- 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, write to the Free Software +-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +------------------------------------------------------------------------------- +-- Author : Alexis Jeandet +-- Mail : alexis.jeandet@gmail.com +-------------------------------------------------------------------------------*/ +#ifndef WIDGET_H +#define WIDGET_H +#include + +typedef struct widget +{ + uint16_t Width; + uint16_t Height; + uint16_t Xpos; + uint16_t Ypos; + void (*paint)(); +} widget; + + + + + + +#endif + + diff --git a/include/GRAPHIC/GUI/surface.h b/include/GRAPHIC/GUI/surface.h new file mode 100644 --- /dev/null +++ b/include/GRAPHIC/GUI/surface.h @@ -0,0 +1,42 @@ +/*------------------------------------------------------------------------------ +-- This file is a part of the libuc, microcontroler library +-- Copyright (C) 2012, Alexis Jeandet +-- +-- 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, write to the Free Software +-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +------------------------------------------------------------------------------- +-- Author : Alexis Jeandet +-- Mail : alexis.jeandet@gmail.com +-------------------------------------------------------------------------------*/ +#ifndef SURFACE_H +#define SURFACE_H +#include + +typedef struct surface +{ + uint16_t Width; + uint16_t Height; + uint16_t Xpos; + uint16_t Ypos; + void (*paint)(); +} surface; + + + + + + +#endif + + diff --git a/include/GRAPHIC/GUI/widget.h b/include/GRAPHIC/GUI/widget.h new file mode 100644 --- /dev/null +++ b/include/GRAPHIC/GUI/widget.h @@ -0,0 +1,42 @@ +/*------------------------------------------------------------------------------ +-- This file is a part of the libuc, microcontroler library +-- Copyright (C) 2012, Alexis Jeandet +-- +-- 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, write to the Free Software +-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +------------------------------------------------------------------------------- +-- Author : Alexis Jeandet +-- Mail : alexis.jeandet@gmail.com +-------------------------------------------------------------------------------*/ +#ifndef WIDGET_H +#define WIDGET_H +#include + +typedef struct widget +{ + uint16_t Width; + uint16_t Height; + uint16_t Xpos; + uint16_t Ypos; + void (*paint)(); +} widget; + + + + + + +#endif + + diff --git a/include/GRAPHIC/PAINTING/painting.h b/include/GRAPHIC/PAINTING/painting.h new file mode 100644 --- /dev/null +++ b/include/GRAPHIC/PAINTING/painting.h @@ -0,0 +1,48 @@ +/*------------------------------------------------------------------------------ +-- This file is a part of the libuc, microcontroler library +-- Copyright (C) 2013, Alexis Jeandet +-- +-- 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, write to the Free Software +-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +------------------------------------------------------------------------------- +-- Author : Alexis Jeandet +-- Mail : alexis.jeandet@gmail.com +-------------------------------------------------------------------------------*/ +#ifndef PAINTING_H +#define PAINTING_H + +#include + +/** + * @brief ili9328init + * @param LCD + * @return + */ + +extern void paint(LCD_t* LCD,void* buffer,uint16_t Xpos,uint16_t Ypos,uint16_t Width,uint16_t Height); +extern void paintText(LCD_t* LCD,char* buffer,uint16_t Xpos,uint16_t Ypos,sFONT *font,uint32_t color); +extern void paintFilRect(LCD_t* LCD,uint16_t Xpos,uint16_t Ypos,uint16_t w,uint16_t h,uint32_t contColor,uint16_t contSz,uint32_t fillColor); +extern void paintFilCirc(LCD_t* LCD,uint16_t Xpos,uint16_t Ypos,uint16_t r,uint32_t contColor,uint16_t contSz,uint32_t fillColor); +extern void paintRect(LCD_t* LCD,uint16_t Xpos,uint16_t Ypos,uint16_t w,uint16_t h,uint32_t contColor,uint16_t contSz,uint32_t fillColor); +extern void paintCirc(LCD_t* LCD,uint16_t Xpos,uint16_t Ypos,uint16_t r,uint32_t contColor,uint16_t contSz,uint32_t fillColor); +extern void getPix(struct LCD_t* LCD,uint16_t* buffer,uint16_t Xpos,uint16_t Ypos,uint16_t w,uint16_t h); +extern void paintChar(LCD_t* LCD,char buffer,uint16_t Xpos,uint16_t Ypos,sFONT* font,uint32_t color); + + +#endif + + + + + diff --git a/mkspecs/features/boards/STM32F4Discovery_35LCD/bsp.pri b/mkspecs/features/boards/STM32F4Discovery_35LCD/bsp.pri new file mode 100644 --- /dev/null +++ b/mkspecs/features/boards/STM32F4Discovery_35LCD/bsp.pri @@ -0,0 +1,3 @@ +CPU=stm32f4xxxG +DEFINES+=BSP=\\\"STM32F4Discovery_35LCD\\\" +UCMODEL=stm32f4 diff --git a/mkspecs/features/libuc2.prf b/mkspecs/features/libuc2.prf --- a/mkspecs/features/libuc2.prf +++ b/mkspecs/features/libuc2.prf @@ -27,6 +27,7 @@ INCLUDEPATH += $$[QT_INSTALL_HEADERS] \ $$[QT_INSTALL_HEADERS]/ADC \ $$[QT_INSTALL_HEADERS]/GRAPHIC/CONTROLERS \ $$[QT_INSTALL_HEADERS]/GRAPHIC/TC_CONTROLERS \ + $$[QT_INSTALL_HEADERS]/GRAPHIC/GUI \ $$[QT_INSTALL_HEADERS]/GRAPHIC/GUI/FONTS \ $$[QT_INSTALL_HEADERS]/GRAPHIC/GUI/Widgets diff --git a/mkspecs/features/stm32f4/crt0.s b/mkspecs/features/stm32f4/crt0.s new file mode 100644 --- /dev/null +++ b/mkspecs/features/stm32f4/crt0.s @@ -0,0 +1,358 @@ +/* File: startup_ARMCM4.S + * Purpose: startup file for Cortex-M4 devices. Should use with + * GCC for ARM Embedded Processors + * Version: V2.0 + * Date: 16 August 2013 + * +/* Copyright (c) 2011 - 2013 ARM LIMITED + + All rights reserved. + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - 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. + - Neither the name of ARM 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 COPYRIGHT HOLDERS AND 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. + ---------------------------------------------------------------------------*/ + /* + 2013 Modified for libuc2 use by Alexis Jeandet. + */ + .syntax unified + .cpu cortex-m4 + .fpu fpv4-sp-d16 + + .section .stack + .align 3 +#ifdef __STACK_SIZE + .equ Stack_Size, __STACK_SIZE +#else + .equ Stack_Size, 0x2000 +#endif + .globl __StackTop + .globl __StackLimit +__StackLimit: + .space Stack_Size + .size __StackLimit, . - __StackLimit +__StackTop: + .size __StackTop, . - __StackTop + + .section .heap + .align 3 +#ifdef __HEAP_SIZE + .equ Heap_Size, __HEAP_SIZE +#else + .equ Heap_Size, 0x2000 +#endif + .globl __HeapBase + .globl __HeapLimit +__HeapBase: + .if Heap_Size + .space Heap_Size + .endif + .size __HeapBase, . - __HeapBase +__HeapLimit: + .size __HeapLimit, . - __HeapLimit + + .section .isr_vector + .align 2 + .globl __isr_vector +__isr_vector: + .long __StackTop /* Top of Stack */ + .long Reset_Handler /* Reset Handler */ + .long NMI_Handler /* NMI Handler */ + .long HardFault_Handler /* Hard Fault Handler */ + .long MemManage_Handler /* MPU Fault Handler */ + .long BusFault_Handler /* Bus Fault Handler */ + .long UsageFault_Handler /* Usage Fault Handler */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long SVC_Handler /* SVCall Handler */ + .long DebugMon_Handler /* Debug Monitor Handler */ + .long 0 /* Reserved */ + .long PendSV_Handler /* PendSV Handler */ + .long SysTick_Handler /* SysTick Handler */ + + /* External interrupts */ + .word WWDG_IRQHandler /* Window WatchDog */ + .word PVD_IRQHandler /* PVD through EXTI Line detection */ + .word TAMP_STAMP_IRQHandler /* Tamper and TimeStamps through the EXTI line */ + .word RTC_WKUP_IRQHandler /* RTC Wakeup through the EXTI line */ + .word FLASH_IRQHandler /* FLASH */ + .word RCC_IRQHandler /* RCC */ + .word EXTI0_IRQHandler /* EXTI Line0 */ + .word EXTI1_IRQHandler /* EXTI Line1 */ + .word EXTI2_IRQHandler /* EXTI Line2 */ + .word EXTI3_IRQHandler /* EXTI Line3 */ + .word EXTI4_IRQHandler /* EXTI Line4 */ + .word DMA1_Stream0_IRQHandler /* DMA1 Stream 0 */ + .word DMA1_Stream1_IRQHandler /* DMA1 Stream 1 */ + .word DMA1_Stream2_IRQHandler /* DMA1 Stream 2 */ + .word DMA1_Stream3_IRQHandler /* DMA1 Stream 3 */ + .word DMA1_Stream4_IRQHandler /* DMA1 Stream 4 */ + .word DMA1_Stream5_IRQHandler /* DMA1 Stream 5 */ + .word DMA1_Stream6_IRQHandler /* DMA1 Stream 6 */ + .word ADC_IRQHandler /* ADC1, ADC2 and ADC3s */ + .word CAN1_TX_IRQHandler /* CAN1 TX */ + .word CAN1_RX0_IRQHandler /* CAN1 RX0 */ + .word CAN1_RX1_IRQHandler /* CAN1 RX1 */ + .word CAN1_SCE_IRQHandler /* CAN1 SCE */ + .word EXTI9_5_IRQHandler /* External Line[9:5]s */ + .word TIM1_BRK_TIM9_IRQHandler /* TIM1 Break and TIM9 */ + .word TIM1_UP_TIM10_IRQHandler /* TIM1 Update and TIM10 */ + .word TIM1_TRG_COM_TIM11_IRQHandler /* TIM1 Trigger and Commutation and TIM11 */ + .word TIM1_CC_IRQHandler /* TIM1 Capture Compare */ + .word TIM2_IRQHandler /* TIM2 */ + .word TIM3_IRQHandler /* TIM3 */ + .word TIM4_IRQHandler /* TIM4 */ + .word I2C1_EV_IRQHandler /* I2C1 Event */ + .word I2C1_ER_IRQHandler /* I2C1 Error */ + .word I2C2_EV_IRQHandler /* I2C2 Event */ + .word I2C2_ER_IRQHandler /* I2C2 Error */ + .word SPI1_IRQHandler /* SPI1 */ + .word SPI2_IRQHandler /* SPI2 */ + .word USART1_IRQHandler /* USART1 */ + .word USART2_IRQHandler /* USART2 */ + .word USART3_IRQHandler /* USART3 */ + .word EXTI15_10_IRQHandler /* External Line[15:10]s */ + .word RTC_Alarm_IRQHandler /* RTC Alarm (A and B) through EXTI Line */ + .word OTG_FS_WKUP_IRQHandler /* USB OTG FS Wakeup through EXTI line */ + .word TIM8_BRK_TIM12_IRQHandler /* TIM8 Break and TIM12 */ + .word TIM8_UP_TIM13_IRQHandler /* TIM8 Update and TIM13 */ + .word TIM8_TRG_COM_TIM14_IRQHandler /* TIM8 Trigger and Commutation and TIM14 */ + .word TIM8_CC_IRQHandler /* TIM8 Capture Compare */ + .word DMA1_Stream7_IRQHandler /* DMA1 Stream7 */ + .word FSMC_IRQHandler /* FSMC */ + .word SDIO_IRQHandler /* SDIO */ + .word TIM5_IRQHandler /* TIM5 */ + .word SPI3_IRQHandler /* SPI3 */ + .word UART4_IRQHandler /* UART4 */ + .word UART5_IRQHandler /* UART5 */ + .word TIM6_DAC_IRQHandler /* TIM6 and DAC1&2 underrun errors */ + .word TIM7_IRQHandler /* TIM7 */ + .word DMA2_Stream0_IRQHandler /* DMA2 Stream 0 */ + .word DMA2_Stream1_IRQHandler /* DMA2 Stream 1 */ + .word DMA2_Stream2_IRQHandler /* DMA2 Stream 2 */ + .word DMA2_Stream3_IRQHandler /* DMA2 Stream 3 */ + .word DMA2_Stream4_IRQHandler /* DMA2 Stream 4 */ + .word ETH_IRQHandler /* Ethernet */ + .word ETH_WKUP_IRQHandler /* Ethernet Wakeup through EXTI line */ + .word CAN2_TX_IRQHandler /* CAN2 TX */ + .word CAN2_RX0_IRQHandler /* CAN2 RX0 */ + .word CAN2_RX1_IRQHandler /* CAN2 RX1 */ + .word CAN2_SCE_IRQHandler /* CAN2 SCE */ + .word OTG_FS_IRQHandler /* USB OTG FS */ + .word DMA2_Stream5_IRQHandler /* DMA2 Stream 5 */ + .word DMA2_Stream6_IRQHandler /* DMA2 Stream 6 */ + .word DMA2_Stream7_IRQHandler /* DMA2 Stream 7 */ + .word USART6_IRQHandler /* USART6 */ + .word I2C3_EV_IRQHandler /* I2C3 event */ + .word I2C3_ER_IRQHandler /* I2C3 error */ + .word OTG_HS_EP1_OUT_IRQHandler /* USB OTG HS End Point 1 Out */ + .word OTG_HS_EP1_IN_IRQHandler /* USB OTG HS End Point 1 In */ + .word OTG_HS_WKUP_IRQHandler /* USB OTG HS Wakeup through EXTI */ + .word OTG_HS_IRQHandler /* USB OTG HS */ + .word DCMI_IRQHandler /* DCMI */ + .word CRYP_IRQHandler /* CRYP crypto */ + .word HASH_RNG_IRQHandler /* Hash and Rng */ + .word FPU_IRQHandler /* FPU */ + + + .size __isr_vector, . - __isr_vector + + .text + .thumb + .thumb_func + .align 2 + .globl Reset_Handler + .type Reset_Handler, %function +Reset_Handler: +/* Firstly it copies data from read only memory to RAM. There are two schemes + * to copy. One can copy more than one sections. Another can only copy + * one section. The former scheme needs more instructions and read-only + * data to implement than the latter. + * Macro __STARTUP_COPY_MULTIPLE is used to choose between two schemes. */ + +/* Single section scheme. + * + * The ranges of copy from/to are specified by following symbols + * __etext: LMA of start of the section to copy from. Usually end of text + * __data_start__: VMA of start of the section to copy to + * __data_end__: VMA of end of the section to copy to + * + * All addresses must be aligned to 4 bytes boundary. + */ + ldr r1, =__etext + ldr r2, =__data_start__ + ldr r3, =__data_end__ + +.L_loop1: + cmp r2, r3 + ittt lt + ldrlt r0, [r1], #4 + strlt r0, [r2], #4 + blt .L_loop1 + +/* This part of work usually is done in C library startup code. Otherwise, + * define this macro to enable it in this startup. + * + * There are two schemes too. One can clear multiple BSS sections. Another + * can only clear one section. The former is more size expensive than the + * latter. + * + * Define macro __STARTUP_CLEAR_BSS_MULTIPLE to choose the former. + * Otherwise efine macro __STARTUP_CLEAR_BSS to choose the later. + */ + +/* Single BSS section scheme. + * + * The BSS section is specified by following symbols + * __bss_start__: start of the BSS section. + * __bss_end__: end of the BSS section. + * + * Both addresses must be aligned to 4 bytes boundary. + */ + ldr r1, =__bss_start__ + ldr r2, =__bss_end__ + + movs r0, 0 +.L_loop3: + cmp r1, r2 + itt lt + strlt r0, [r1], #4 + blt .L_loop3 + + bl main + + + .pool + .size Reset_Handler, . - Reset_Handler + + .align 1 + .thumb_func + .weak Default_Handler + .type Default_Handler, %function +Default_Handler: + b . + .size Default_Handler, . - Default_Handler + +/* Macro to define default handlers. Default handler + * will be weak symbol and just dead loops. They can be + * overwritten by other handlers */ + .macro def_irq_handler handler_name + .weak \handler_name + .set \handler_name, Default_Handler + .endm + + def_irq_handler NMI_Handler + def_irq_handler HardFault_Handler + def_irq_handler MemManage_Handler + def_irq_handler BusFault_Handler + def_irq_handler UsageFault_Handler + def_irq_handler SVC_Handler + def_irq_handler DebugMon_Handler + def_irq_handler PendSV_Handler + def_irq_handler SysTick_Handler + def_irq_handler DEF_IRQHandler + + def_irq_handler WWDG_IRQHandler + def_irq_handler PVD_IRQHandler + def_irq_handler TAMP_STAMP_IRQHandler + def_irq_handler RTC_WKUP_IRQHandler + def_irq_handler FLASH_IRQHandler + def_irq_handler RCC_IRQHandler + def_irq_handler EXTI0_IRQHandler + def_irq_handler EXTI1_IRQHandler + def_irq_handler EXTI2_IRQHandler + def_irq_handler EXTI3_IRQHandler + def_irq_handler EXTI4_IRQHandler + def_irq_handler DMA1_Stream0_IRQHandler + def_irq_handler DMA1_Stream1_IRQHandler + def_irq_handler DMA1_Stream2_IRQHandler + def_irq_handler DMA1_Stream3_IRQHandler + def_irq_handler DMA1_Stream4_IRQHandler + def_irq_handler DMA1_Stream5_IRQHandler + def_irq_handler DMA1_Stream6_IRQHandler + def_irq_handler ADC_IRQHandler + def_irq_handler CAN1_TX_IRQHandler + def_irq_handler CAN1_RX0_IRQHandler + def_irq_handler CAN1_RX1_IRQHandler + def_irq_handler CAN1_SCE_IRQHandler + def_irq_handler EXTI9_5_IRQHandler + def_irq_handler TIM1_BRK_TIM9_IRQHandler + def_irq_handler TIM1_UP_TIM10_IRQHandler + def_irq_handler TIM1_TRG_COM_TIM11_IRQHandler + def_irq_handler TIM1_CC_IRQHandler + def_irq_handler TIM2_IRQHandler + def_irq_handler TIM3_IRQHandler + def_irq_handler TIM4_IRQHandler + def_irq_handler I2C1_EV_IRQHandler + def_irq_handler I2C1_ER_IRQHandler + def_irq_handler I2C2_EV_IRQHandler + def_irq_handler I2C2_ER_IRQHandler + def_irq_handler SPI1_IRQHandler + def_irq_handler SPI2_IRQHandler + def_irq_handler USART1_IRQHandler + def_irq_handler USART2_IRQHandler + def_irq_handler USART3_IRQHandler + def_irq_handler EXTI15_10_IRQHandler + def_irq_handler RTC_Alarm_IRQHandler + def_irq_handler OTG_FS_WKUP_IRQHandler + def_irq_handler TIM8_BRK_TIM12_IRQHandler + def_irq_handler TIM8_UP_TIM13_IRQHandler + def_irq_handler TIM8_TRG_COM_TIM14_IRQHandler + def_irq_handler TIM8_CC_IRQHandler + def_irq_handler DMA1_Stream7_IRQHandler + def_irq_handler FSMC_IRQHandler + def_irq_handler SDIO_IRQHandler + def_irq_handler TIM5_IRQHandler + def_irq_handler SPI3_IRQHandler + def_irq_handler UART4_IRQHandler + def_irq_handler UART5_IRQHandler + def_irq_handler TIM6_DAC_IRQHandler + def_irq_handler TIM7_IRQHandler + def_irq_handler DMA2_Stream0_IRQHandler + def_irq_handler DMA2_Stream1_IRQHandler + def_irq_handler DMA2_Stream2_IRQHandler + def_irq_handler DMA2_Stream3_IRQHandler + def_irq_handler DMA2_Stream4_IRQHandler + def_irq_handler ETH_IRQHandler + def_irq_handler ETH_WKUP_IRQHandler + def_irq_handler CAN2_TX_IRQHandler + def_irq_handler CAN2_RX0_IRQHandler + def_irq_handler CAN2_RX1_IRQHandler + def_irq_handler CAN2_SCE_IRQHandler + def_irq_handler OTG_FS_IRQHandler + def_irq_handler DMA2_Stream5_IRQHandler + def_irq_handler DMA2_Stream6_IRQHandler + def_irq_handler DMA2_Stream7_IRQHandler + def_irq_handler USART6_IRQHandler + def_irq_handler I2C3_EV_IRQHandler + def_irq_handler I2C3_ER_IRQHandler + def_irq_handler OTG_HS_EP1_OUT_IRQHandler + def_irq_handler OTG_HS_EP1_IN_IRQHandler + def_irq_handler OTG_HS_WKUP_IRQHandler + def_irq_handler OTG_HS_IRQHandler + def_irq_handler DCMI_IRQHandler + def_irq_handler CRYP_IRQHandler + def_irq_handler HASH_RNG_IRQHandler + def_irq_handler FPU_IRQHandler + + .end diff --git a/mkspecs/features/stm32f4/qmake.conf b/mkspecs/features/stm32f4/qmake.conf --- a/mkspecs/features/stm32f4/qmake.conf +++ b/mkspecs/features/stm32f4/qmake.conf @@ -22,18 +22,23 @@ DEFINES += BSP="\"\\\"$$BSP"\\\"\" contains(CPU, stm32f42x){ -LDSCRIPT=stm32f42_flash.ld +LDSCRIPT=stm32f42.ld } contains(CPU, stm32f4xxxG){ -LDSCRIPT=stm32_flash.ld +LDSCRIPT=stm32f4.ld } contains( TEMPLATE, app ) { - unix:QMAKE_POST_LINK += arm-none-eabi-objcopy -O ihex "$(TARGET)" $$DESTDIR/"$(QMAKE_TARGET).hex" && arm-none-eabi-objcopy -O binary "$(TARGET)" $$DESTDIR/"$(QMAKE_TARGET).bin && python $$[QT_INSTALL_BINS]/dfu.py -b 0x08000000:"$$DESTDIR/"$(QMAKE_TARGET).bin " $$DESTDIR/"$(QMAKE_TARGET).dfu" - win32:QMAKE_POST_LINK += arm-none-eabi-objcopy -O ihex "$(DESTDIR_TARGET)" $$DESTDIR/"$(QMAKE_TARGET).hex" && arm-none-eabi-objcopy -O binary "$(DESTDIR_TARGET)" $$DESTDIR/"$(QMAKE_TARGET).bin" - + unix:QMAKE_POST_LINK += arm-none-eabi-objcopy -O ihex "$(TARGET)" $$DESTDIR/"$(QMAKE_TARGET).hex" $$escape_expand(\\n\\t) + unix:QMAKE_POST_LINK += arm-none-eabi-objcopy -O binary "$(TARGET)" $$DESTDIR/"$(QMAKE_TARGET).bin" $$escape_expand(\\n\\t) + win32:QMAKE_POST_LINK += arm-none-eabi-objcopy -O ihex "$(DESTDIR_TARGET)" $$DESTDIR/"$(QMAKE_TARGET).hex" $$escape_expand(\\n\\t) + win32:QMAKE_POST_LINK += arm-none-eabi-objcopy -O binary "$(DESTDIR_TARGET)" $$DESTDIR/"$(QMAKE_TARGET).bin" $$escape_expand(\\n\\t) + + contains( CONFIG, dfu ){ + unix:QMAKE_POST_LINK += python $$[QT_INSTALL_BINS]/dfu.py -b 0x08000000:$$DESTDIR/"$(QMAKE_TARGET).bin" $$DESTDIR/"$(QMAKE_TARGET).dfu" $$escape_expand(\\n\\t) + } LIBS += -L$$[QT_INSTALL_PREFIX]/bsp/lib/$$BSP -lbsp LIBS += -L$$[QT_INSTALL_LIBS]/$$UCMODEL @@ -46,7 +51,7 @@ contains( TEMPLATE, app ) { SOURCES +=$$[QT_INSTALL_PREFIX]/mkspecs/features/stm32f4/syscalls.c SOURCES +=$$[QT_INSTALL_PREFIX]/mkspecs/features/stm32f4/fs.c - SOURCES +=$$[QT_INSTALL_PREFIX]/mkspecs/features/stm32f4/startup.s + SOURCES +=$$[QT_INSTALL_PREFIX]/mkspecs/features/stm32f4/crt0.s SOURCES +=$$[QT_INSTALL_PREFIX]/mkspecs/features/stm32f4/cpuinit.c diff --git a/mkspecs/features/stm32f4/startup.s b/mkspecs/features/stm32f4/startup.s deleted file mode 100644 --- a/mkspecs/features/stm32f4/startup.s +++ /dev/null @@ -1,454 +0,0 @@ - - .syntax unified - .cpu cortex-m4 - /*.fpu softvfp*/ - .fpu fpv4-sp-d16 - .thumb - -.global g_pfnVectors -.global Default_Handler - -/* start address for the initialization values of the .data section. -defined in linker script */ -.word _sidata -/* start address for the .data section. defined in linker script */ -.word _sdata -/* end address for the .data section. defined in linker script */ -.word _edata -/* start address for the .bss section. defined in linker script */ -.word _sbss -/* end address for the .bss section. defined in linker script */ -.word _ebss -/* stack used for SystemInit_ExtMemCtl; always internal RAM used */ - - - .section .text.Reset_Handler - .weak Reset_Handler - .type Reset_Handler, %function -Reset_Handler: - -/* Copy the data segment initializers from flash to SRAM */ - movs r1, #0 - b LoopCopyDataInit - -CopyDataInit: - ldr r3, =_sidata - ldr r3, [r3, r1] - str r3, [r0, r1] - adds r1, r1, #4 - -LoopCopyDataInit: - ldr r0, =_sdata - ldr r3, =_edata - adds r2, r0, r1 - cmp r2, r3 - bcc CopyDataInit - ldr r2, =_sbss - b LoopFillZerobss -/* Zero fill the bss segment. */ -FillZerobss: - movs r3, #0 - str r3, [r2], #4 - -LoopFillZerobss: - ldr r3, = _ebss - cmp r2, r3 - bcc FillZerobss - - bl main - bx lr -.size Reset_Handler, .-Reset_Handler - - .section .text.Default_Handler,"ax",%progbits -Default_Handler: -Infinite_Loop: - b Infinite_Loop - .size Default_Handler, .-Default_Handler - - - .section .isr_vector,"a",%progbits - .type g_pfnVectors, %object - .size g_pfnVectors, .-g_pfnVectors - - -g_pfnVectors: - .word _estack - .word Reset_Handler - .word NMI_Handler - .word HardFault_Handler - .word MemManage_Handler - .word BusFault_Handler - .word UsageFault_Handler - .word 0 - .word 0 - .word 0 - .word 0 - .word SVC_Handler - .word DebugMon_Handler - .word 0 - .word PendSV_Handler - .word SysTick_Handler - - /* External Interrupts */ - .word WWDG_IRQHandler /* Window WatchDog */ - .word PVD_IRQHandler /* PVD through EXTI Line detection */ - .word TAMP_STAMP_IRQHandler /* Tamper and TimeStamps through the EXTI line */ - .word RTC_WKUP_IRQHandler /* RTC Wakeup through the EXTI line */ - .word FLASH_IRQHandler /* FLASH */ - .word RCC_IRQHandler /* RCC */ - .word EXTI0_IRQHandler /* EXTI Line0 */ - .word EXTI1_IRQHandler /* EXTI Line1 */ - .word EXTI2_IRQHandler /* EXTI Line2 */ - .word EXTI3_IRQHandler /* EXTI Line3 */ - .word EXTI4_IRQHandler /* EXTI Line4 */ - .word DMA1_Stream0_IRQHandler /* DMA1 Stream 0 */ - .word DMA1_Stream1_IRQHandler /* DMA1 Stream 1 */ - .word DMA1_Stream2_IRQHandler /* DMA1 Stream 2 */ - .word DMA1_Stream3_IRQHandler /* DMA1 Stream 3 */ - .word DMA1_Stream4_IRQHandler /* DMA1 Stream 4 */ - .word DMA1_Stream5_IRQHandler /* DMA1 Stream 5 */ - .word DMA1_Stream6_IRQHandler /* DMA1 Stream 6 */ - .word ADC_IRQHandler /* ADC1, ADC2 and ADC3s */ - .word CAN1_TX_IRQHandler /* CAN1 TX */ - .word CAN1_RX0_IRQHandler /* CAN1 RX0 */ - .word CAN1_RX1_IRQHandler /* CAN1 RX1 */ - .word CAN1_SCE_IRQHandler /* CAN1 SCE */ - .word EXTI9_5_IRQHandler /* External Line[9:5]s */ - .word TIM1_BRK_TIM9_IRQHandler /* TIM1 Break and TIM9 */ - .word TIM1_UP_TIM10_IRQHandler /* TIM1 Update and TIM10 */ - .word TIM1_TRG_COM_TIM11_IRQHandler /* TIM1 Trigger and Commutation and TIM11 */ - .word TIM1_CC_IRQHandler /* TIM1 Capture Compare */ - .word TIM2_IRQHandler /* TIM2 */ - .word TIM3_IRQHandler /* TIM3 */ - .word TIM4_IRQHandler /* TIM4 */ - .word I2C1_EV_IRQHandler /* I2C1 Event */ - .word I2C1_ER_IRQHandler /* I2C1 Error */ - .word I2C2_EV_IRQHandler /* I2C2 Event */ - .word I2C2_ER_IRQHandler /* I2C2 Error */ - .word SPI1_IRQHandler /* SPI1 */ - .word SPI2_IRQHandler /* SPI2 */ - .word USART1_IRQHandler /* USART1 */ - .word USART2_IRQHandler /* USART2 */ - .word USART3_IRQHandler /* USART3 */ - .word EXTI15_10_IRQHandler /* External Line[15:10]s */ - .word RTC_Alarm_IRQHandler /* RTC Alarm (A and B) through EXTI Line */ - .word OTG_FS_WKUP_IRQHandler /* USB OTG FS Wakeup through EXTI line */ - .word TIM8_BRK_TIM12_IRQHandler /* TIM8 Break and TIM12 */ - .word TIM8_UP_TIM13_IRQHandler /* TIM8 Update and TIM13 */ - .word TIM8_TRG_COM_TIM14_IRQHandler /* TIM8 Trigger and Commutation and TIM14 */ - .word TIM8_CC_IRQHandler /* TIM8 Capture Compare */ - .word DMA1_Stream7_IRQHandler /* DMA1 Stream7 */ - .word FSMC_IRQHandler /* FSMC */ - .word SDIO_IRQHandler /* SDIO */ - .word TIM5_IRQHandler /* TIM5 */ - .word SPI3_IRQHandler /* SPI3 */ - .word UART4_IRQHandler /* UART4 */ - .word UART5_IRQHandler /* UART5 */ - .word TIM6_DAC_IRQHandler /* TIM6 and DAC1&2 underrun errors */ - .word TIM7_IRQHandler /* TIM7 */ - .word DMA2_Stream0_IRQHandler /* DMA2 Stream 0 */ - .word DMA2_Stream1_IRQHandler /* DMA2 Stream 1 */ - .word DMA2_Stream2_IRQHandler /* DMA2 Stream 2 */ - .word DMA2_Stream3_IRQHandler /* DMA2 Stream 3 */ - .word DMA2_Stream4_IRQHandler /* DMA2 Stream 4 */ - .word ETH_IRQHandler /* Ethernet */ - .word ETH_WKUP_IRQHandler /* Ethernet Wakeup through EXTI line */ - .word CAN2_TX_IRQHandler /* CAN2 TX */ - .word CAN2_RX0_IRQHandler /* CAN2 RX0 */ - .word CAN2_RX1_IRQHandler /* CAN2 RX1 */ - .word CAN2_SCE_IRQHandler /* CAN2 SCE */ - .word OTG_FS_IRQHandler /* USB OTG FS */ - .word DMA2_Stream5_IRQHandler /* DMA2 Stream 5 */ - .word DMA2_Stream6_IRQHandler /* DMA2 Stream 6 */ - .word DMA2_Stream7_IRQHandler /* DMA2 Stream 7 */ - .word USART6_IRQHandler /* USART6 */ - .word I2C3_EV_IRQHandler /* I2C3 event */ - .word I2C3_ER_IRQHandler /* I2C3 error */ - .word OTG_HS_EP1_OUT_IRQHandler /* USB OTG HS End Point 1 Out */ - .word OTG_HS_EP1_IN_IRQHandler /* USB OTG HS End Point 1 In */ - .word OTG_HS_WKUP_IRQHandler /* USB OTG HS Wakeup through EXTI */ - .word OTG_HS_IRQHandler /* USB OTG HS */ - .word DCMI_IRQHandler /* DCMI */ - .word CRYP_IRQHandler /* CRYP crypto */ - .word HASH_RNG_IRQHandler /* Hash and Rng */ - .word FPU_IRQHandler /* FPU */ - -/******************************************************************************* -* -* Provide weak aliases for each Exception handler to the Default_Handler. -* As they are weak aliases, any function with the same name will override -* this definition. -* -*******************************************************************************/ - .weak NMI_Handler - .thumb_set NMI_Handler,Default_Handler - - .weak HardFault_Handler - .thumb_set HardFault_Handler,Default_Handler - - .weak MemManage_Handler - .thumb_set MemManage_Handler,Default_Handler - - .weak BusFault_Handler - .thumb_set BusFault_Handler,Default_Handler - - .weak UsageFault_Handler - .thumb_set UsageFault_Handler,Default_Handler - - .weak SVC_Handler - .thumb_set SVC_Handler,Default_Handler - - .weak DebugMon_Handler - .thumb_set DebugMon_Handler,Default_Handler - - .weak PendSV_Handler - .thumb_set PendSV_Handler,Default_Handler - - .weak SysTick_Handler - .thumb_set SysTick_Handler,Default_Handler - - .weak WWDG_IRQHandler - .thumb_set WWDG_IRQHandler,Default_Handler - - .weak PVD_IRQHandler - .thumb_set PVD_IRQHandler,Default_Handler - - .weak TAMP_STAMP_IRQHandler - .thumb_set TAMP_STAMP_IRQHandler,Default_Handler - - .weak RTC_WKUP_IRQHandler - .thumb_set RTC_WKUP_IRQHandler,Default_Handler - - .weak FLASH_IRQHandler - .thumb_set FLASH_IRQHandler,Default_Handler - - .weak RCC_IRQHandler - .thumb_set RCC_IRQHandler,Default_Handler - - .weak EXTI0_IRQHandler - .thumb_set EXTI0_IRQHandler,Default_Handler - - .weak EXTI1_IRQHandler - .thumb_set EXTI1_IRQHandler,Default_Handler - - .weak EXTI2_IRQHandler - .thumb_set EXTI2_IRQHandler,Default_Handler - - .weak EXTI3_IRQHandler - .thumb_set EXTI3_IRQHandler,Default_Handler - - .weak EXTI4_IRQHandler - .thumb_set EXTI4_IRQHandler,Default_Handler - - .weak DMA1_Stream0_IRQHandler - .thumb_set DMA1_Stream0_IRQHandler,Default_Handler - - .weak DMA1_Stream1_IRQHandler - .thumb_set DMA1_Stream1_IRQHandler,Default_Handler - - .weak DMA1_Stream2_IRQHandler - .thumb_set DMA1_Stream2_IRQHandler,Default_Handler - - .weak DMA1_Stream3_IRQHandler - .thumb_set DMA1_Stream3_IRQHandler,Default_Handler - - .weak DMA1_Stream4_IRQHandler - .thumb_set DMA1_Stream4_IRQHandler,Default_Handler - - .weak DMA1_Stream5_IRQHandler - .thumb_set DMA1_Stream5_IRQHandler,Default_Handler - - .weak DMA1_Stream6_IRQHandler - .thumb_set DMA1_Stream6_IRQHandler,Default_Handler - - .weak ADC_IRQHandler - .thumb_set ADC_IRQHandler,Default_Handler - - .weak CAN1_TX_IRQHandler - .thumb_set CAN1_TX_IRQHandler,Default_Handler - - .weak CAN1_RX0_IRQHandler - .thumb_set CAN1_RX0_IRQHandler,Default_Handler - - .weak CAN1_RX1_IRQHandler - .thumb_set CAN1_RX1_IRQHandler,Default_Handler - - .weak CAN1_SCE_IRQHandler - .thumb_set CAN1_SCE_IRQHandler,Default_Handler - - .weak EXTI9_5_IRQHandler - .thumb_set EXTI9_5_IRQHandler,Default_Handler - - .weak TIM1_BRK_TIM9_IRQHandler - .thumb_set TIM1_BRK_TIM9_IRQHandler,Default_Handler - - .weak TIM1_UP_TIM10_IRQHandler - .thumb_set TIM1_UP_TIM10_IRQHandler,Default_Handler - - .weak TIM1_TRG_COM_TIM11_IRQHandler - .thumb_set TIM1_TRG_COM_TIM11_IRQHandler,Default_Handler - - .weak TIM1_CC_IRQHandler - .thumb_set TIM1_CC_IRQHandler,Default_Handler - - .weak TIM2_IRQHandler - .thumb_set TIM2_IRQHandler,Default_Handler - - .weak TIM3_IRQHandler - .thumb_set TIM3_IRQHandler,Default_Handler - - .weak TIM4_IRQHandler - .thumb_set TIM4_IRQHandler,Default_Handler - - .weak I2C1_EV_IRQHandler - .thumb_set I2C1_EV_IRQHandler,Default_Handler - - .weak I2C1_ER_IRQHandler - .thumb_set I2C1_ER_IRQHandler,Default_Handler - - .weak I2C2_EV_IRQHandler - .thumb_set I2C2_EV_IRQHandler,Default_Handler - - .weak I2C2_ER_IRQHandler - .thumb_set I2C2_ER_IRQHandler,Default_Handler - - .weak SPI1_IRQHandler - .thumb_set SPI1_IRQHandler,Default_Handler - - .weak SPI2_IRQHandler - .thumb_set SPI2_IRQHandler,Default_Handler - - .weak USART1_IRQHandler - .thumb_set USART1_IRQHandler,Default_Handler - - .weak USART2_IRQHandler - .thumb_set USART2_IRQHandler,Default_Handler - - .weak USART3_IRQHandler - .thumb_set USART3_IRQHandler,Default_Handler - - .weak EXTI15_10_IRQHandler - .thumb_set EXTI15_10_IRQHandler,Default_Handler - - .weak RTC_Alarm_IRQHandler - .thumb_set RTC_Alarm_IRQHandler,Default_Handler - - .weak OTG_FS_WKUP_IRQHandler - .thumb_set OTG_FS_WKUP_IRQHandler,Default_Handler - - .weak TIM8_BRK_TIM12_IRQHandler - .thumb_set TIM8_BRK_TIM12_IRQHandler,Default_Handler - - .weak TIM8_UP_TIM13_IRQHandler - .thumb_set TIM8_UP_TIM13_IRQHandler,Default_Handler - - .weak TIM8_TRG_COM_TIM14_IRQHandler - .thumb_set TIM8_TRG_COM_TIM14_IRQHandler,Default_Handler - - .weak TIM8_CC_IRQHandler - .thumb_set TIM8_CC_IRQHandler,Default_Handler - - .weak DMA1_Stream7_IRQHandler - .thumb_set DMA1_Stream7_IRQHandler,Default_Handler - - .weak FSMC_IRQHandler - .thumb_set FSMC_IRQHandler,Default_Handler - - .weak SDIO_IRQHandler - .thumb_set SDIO_IRQHandler,Default_Handler - - .weak TIM5_IRQHandler - .thumb_set TIM5_IRQHandler,Default_Handler - - .weak SPI3_IRQHandler - .thumb_set SPI3_IRQHandler,Default_Handler - - .weak UART4_IRQHandler - .thumb_set UART4_IRQHandler,Default_Handler - - .weak UART5_IRQHandler - .thumb_set UART5_IRQHandler,Default_Handler - - .weak TIM6_DAC_IRQHandler - .thumb_set TIM6_DAC_IRQHandler,Default_Handler - - .weak TIM7_IRQHandler - .thumb_set TIM7_IRQHandler,Default_Handler - - .weak DMA2_Stream0_IRQHandler - .thumb_set DMA2_Stream0_IRQHandler,Default_Handler - - .weak DMA2_Stream1_IRQHandler - .thumb_set DMA2_Stream1_IRQHandler,Default_Handler - - .weak DMA2_Stream2_IRQHandler - .thumb_set DMA2_Stream2_IRQHandler,Default_Handler - - .weak DMA2_Stream3_IRQHandler - .thumb_set DMA2_Stream3_IRQHandler,Default_Handler - - .weak DMA2_Stream4_IRQHandler - .thumb_set DMA2_Stream4_IRQHandler,Default_Handler - - .weak ETH_IRQHandler - .thumb_set ETH_IRQHandler,Default_Handler - - .weak ETH_WKUP_IRQHandler - .thumb_set ETH_WKUP_IRQHandler,Default_Handler - - .weak CAN2_TX_IRQHandler - .thumb_set CAN2_TX_IRQHandler,Default_Handler - - .weak CAN2_RX0_IRQHandler - .thumb_set CAN2_RX0_IRQHandler,Default_Handler - - .weak CAN2_RX1_IRQHandler - .thumb_set CAN2_RX1_IRQHandler,Default_Handler - - .weak CAN2_SCE_IRQHandler - .thumb_set CAN2_SCE_IRQHandler,Default_Handler - - .weak OTG_FS_IRQHandler - .thumb_set OTG_FS_IRQHandler,Default_Handler - - .weak DMA2_Stream5_IRQHandler - .thumb_set DMA2_Stream5_IRQHandler,Default_Handler - - .weak DMA2_Stream6_IRQHandler - .thumb_set DMA2_Stream6_IRQHandler,Default_Handler - - .weak DMA2_Stream7_IRQHandler - .thumb_set DMA2_Stream7_IRQHandler,Default_Handler - - .weak USART6_IRQHandler - .thumb_set USART6_IRQHandler,Default_Handler - - .weak I2C3_EV_IRQHandler - .thumb_set I2C3_EV_IRQHandler,Default_Handler - - .weak I2C3_ER_IRQHandler - .thumb_set I2C3_ER_IRQHandler,Default_Handler - - .weak OTG_HS_EP1_OUT_IRQHandler - .thumb_set OTG_HS_EP1_OUT_IRQHandler,Default_Handler - - .weak OTG_HS_EP1_IN_IRQHandler - .thumb_set OTG_HS_EP1_IN_IRQHandler,Default_Handler - - .weak OTG_HS_WKUP_IRQHandler - .thumb_set OTG_HS_WKUP_IRQHandler,Default_Handler - - .weak OTG_HS_IRQHandler - .thumb_set OTG_HS_IRQHandler,Default_Handler - - .weak DCMI_IRQHandler - .thumb_set DCMI_IRQHandler,Default_Handler - - .weak CRYP_IRQHandler - .thumb_set CRYP_IRQHandler,Default_Handler - - .weak HASH_RNG_IRQHandler - .thumb_set HASH_RNG_IRQHandler,Default_Handler - - .weak FPU_IRQHandler - .thumb_set FPU_IRQHandler,Default_Handler diff --git a/mkspecs/features/stm32f4/stm32_flash.ld b/mkspecs/features/stm32f4/stm32_flash.ld deleted file mode 100644 --- a/mkspecs/features/stm32f4/stm32_flash.ld +++ /dev/null @@ -1,174 +0,0 @@ -/* -***************************************************************************** -** -** File : stm32_flash.ld -** -** Abstract : Linker script for STM32F407VG Device with -** 1024KByte FLASH, 192KByte 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 -** -** Environment : Atollic TrueSTUDIO(R) -** -** Distribution: The file is distributed �as is,� without any warranty -** of any kind. -** -** (c)Copyright Atollic AB. -** You may use this file as-is or modify it according to the needs of your -** project. Distribution of this file (unmodified or modified) is not -** permitted. Atollic AB permit registered Atollic TrueSTUDIO(R) users the -** rights to distribute the assembled, compiled & linked contents of this -** file as part of an application binary file, provided that it is built -** using the Atollic TrueSTUDIO(R) toolchain. -** -***************************************************************************** -*/ - -/* Entry Point */ -ENTRY(Reset_Handler) - -/* Highest address of the user mode stack */ -_estack = 0x20020000; /* end of 128K RAM on AHB bus*/ -_eMainStack = 0x1002000; /* end of 64K CCMRAM on AHB bus*/ - -/* Generate a link error if heap and stack don't fit into RAM */ -_Min_Heap_Size = 0x2000; /* required amount of heap */ -_Min_Stack_Size = 0x2000; /* required amount of stack */ -_Min_MainStack_Size = 0x2000; /* required amount of stack 0x2000=8kB*/ - -/* Specify the memory areas */ -MEMORY -{ - FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 1024k - RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 112k - CCMRAM (xrw) : ORIGIN = 0x10000000, LENGTH = 64k - MEMORY_B1 (rx) : ORIGIN = 0x60000000, LENGTH = 0K -} - -/* Define output sections */ -SECTIONS -{ - /* The startup code goes first into FLASH */ - .isr_vector : - { - . = ALIGN(4); - KEEP(*(.isr_vector)) /* Startup code */ - . = ALIGN(4); - } >FLASH - - /* The program code and other data goes into FLASH */ - .text : - { - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - *(.glue_7) /* glue arm to thumb code */ - *(.glue_7t) /* glue thumb to arm code */ - *(.eh_frame) - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - _etext = .; /* define a global symbols at end of code */ - } >FLASH - - - .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH - .ARM : { - __exidx_start = .; - *(.ARM.exidx*) - __exidx_end = .; - } >FLASH - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >FLASH - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - } >FLASH - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(.fini_array*)) - KEEP (*(SORT(.fini_array.*))) - PROVIDE_HIDDEN (__fini_array_end = .); - } >FLASH - - /* used by the startup to initialize data */ - _sidata = .; - - /* Initialized data sections goes into RAM, load LMA copy after code */ - .data : AT ( _sidata ) - { - . = ALIGN(4); - _sdata = .; /* create a global symbol at data start */ - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - - . = ALIGN(4); - _edata = .; /* define a global symbol at data end */ - } >RAM - - /* 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(4); - PROVIDE ( end = . ); - PROVIDE ( _end = . ); - . = . + _Min_Heap_Size; - . = . + _Min_Stack_Size; - . = ALIGN(4); - } >RAM - - - /* MEMORY_bank1 section, code must be located here explicitly */ - /* Example: extern int foo(void) __attribute__ ((section (".mb1text"))); */ - .memory_b1_text : - { - *(.mb1text) /* .mb1text sections (code) */ - *(.mb1text*) /* .mb1text* sections (code) */ - *(.mb1rodata) /* read-only data (constants) */ - *(.mb1rodata*) - } >MEMORY_B1 - - /* Remove information from the standard libraries */ - /DISCARD/ : - { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } - - .ARM.attributes 0 : { *(.ARM.attributes) } -} diff --git a/mkspecs/features/stm32f4/stm32f4.ld b/mkspecs/features/stm32f4/stm32f4.ld new file mode 100644 --- /dev/null +++ b/mkspecs/features/stm32f4/stm32f4.ld @@ -0,0 +1,216 @@ +/*------------------------------------------------------------------------------ +-- This file is a part of the libuc, microcontroler library +-- Copyright (C) 2013, Alexis Jeandet +-- +-- 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, write to the Free Software +-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +------------------------------------------------------------------------------- +-- Author : Alexis Jeandet +-- Mail : alexis.jeandet@member.fsf.org +-------------------------------------------------------------------------------*/ + +/* Linker script to configure memory regions. + * Need modifying for a specific board. + * FLASH.ORIGIN: starting address of flash + * FLASH.LENGTH: length of flash + * RAM.ORIGIN: starting address of RAM bank 0 + * RAM.LENGTH: length of RAM bank 0 + */ +MEMORY +{ + FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 1024k + RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 112k + CCMRAM (xrw) : ORIGIN = 0x10000000, LENGTH = 64k + MEMORY_B1 (rx) : ORIGIN = 0x60000000, LENGTH = 0 + BANK1_SRAM2 (!ixrw): ORIGIN = 0x64000000, LENGTH = 64M +} + +/* Linker script to place sections and symbol values. Should be used together + * with other linker script that defines memory regions FLASH and RAM. + * It references following symbols, which must be defined in code: + * Reset_Handler : Entry of reset handler + * + * It defines following symbols, which code can use without definition: + * __exidx_start + * __exidx_end + * __copy_table_start__ + * __copy_table_end__ + * __zero_table_start__ + * __zero_table_end__ + * __etext + * __data_start__ + * __preinit_array_start + * __preinit_array_end + * __init_array_start + * __init_array_end + * __fini_array_start + * __fini_array_end + * __data_end__ + * __bss_start__ + * __bss_end__ + * __end__ + * end + * __HeapLimit + * __StackLimit + * __StackTop + * __stack + */ +ENTRY(Reset_Handler) + +SECTIONS +{ + .text : + { + KEEP(*(.isr_vector)) + *(.text*) + + *(.init) + *(.fini) + + /* .ctors */ + *crtbegin.o(.ctors) + *crtbegin?.o(.ctors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) + *(SORT(.ctors.*)) + *(.ctors) + + /* .dtors */ + *crtbegin.o(.dtors) + *crtbegin?.o(.dtors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) + *(SORT(.dtors.*)) + *(.dtors) + + *(.rodata*) + + *(.eh_frame*) + } > FLASH + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > FLASH + + __exidx_start = .; + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } > FLASH + __exidx_end = .; + + /* To copy multiple ROM to RAM sections, + * uncomment .copy.table section and, + * define __STARTUP_COPY_MULTIPLE in startup_ARMCMx.S */ + /* + .copy.table : + { + . = ALIGN(4); + __copy_table_start__ = .; + LONG (__etext) + LONG (__data_start__) + LONG (__data_end__ - __data_start__) + LONG (__etext2) + LONG (__data2_start__) + LONG (__data2_end__ - __data2_start__) + __copy_table_end__ = .; + } > FLASH + */ + + /* To clear multiple BSS sections, + * uncomment .zero.table section and, + * define __STARTUP_CLEAR_BSS_MULTIPLE in startup_ARMCMx.S */ + /* + .zero.table : + { + . = ALIGN(4); + __zero_table_start__ = .; + LONG (__bss_start__) + LONG (__bss_end__ - __bss_start__) + LONG (__bss2_start__) + LONG (__bss2_end__ - __bss2_start__) + __zero_table_end__ = .; + } > FLASH + */ + + __etext = .; + + .data : AT (__etext) + { + __data_start__ = .; + *(vtable) + *(.data*) + + . = ALIGN(4); + /* preinit data */ + PROVIDE_HIDDEN (__preinit_array_start = .); + *(.preinit_array) + PROVIDE_HIDDEN (__preinit_array_end = .); + + . = ALIGN(4); + /* init data */ + PROVIDE_HIDDEN (__init_array_start = .); + *(SORT(.init_array.*)) + *(.init_array) + PROVIDE_HIDDEN (__init_array_end = .); + + + . = ALIGN(4); + /* finit data */ + PROVIDE_HIDDEN (__fini_array_start = .); + *(SORT(.fini_array.*)) + *(.fini_array) + PROVIDE_HIDDEN (__fini_array_end = .); + + *(.jcr) + . = ALIGN(4); + /* All data end */ + __data_end__ = .; + + } > RAM + + .bss : + { + . = ALIGN(4); + __bss_start__ = .; + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + } > RAM + + .heap (COPY): + { + __end__ = .; + PROVIDE(end = .); + *(.heap*) + __HeapLimit = .; + } > RAM + + /* .stack_dummy section doesn't contains any symbols. It is only + * used for linker to calculate size of stack sections, and assign + * values to stack symbols later */ + .stack_dummy (COPY): + { + *(.stack*) + } > RAM + + /* Set stack top to end of RAM, and stack limit move down by + * size of stack_dummy section */ + __StackTop = ORIGIN(RAM) + LENGTH(RAM); + __StackLimit = __StackTop - SIZEOF(.stack_dummy); + PROVIDE(__stack = __StackTop); + + /* Check if data + heap + stack exceeds RAM limit */ + ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack") +} diff --git a/mkspecs/features/stm32f4/stm32f42.ld b/mkspecs/features/stm32f4/stm32f42.ld new file mode 100644 --- /dev/null +++ b/mkspecs/features/stm32f4/stm32f42.ld @@ -0,0 +1,217 @@ +/*------------------------------------------------------------------------------ +-- This file is a part of the libuc, microcontroler library +-- Copyright (C) 2013, Alexis Jeandet +-- +-- 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, write to the Free Software +-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +------------------------------------------------------------------------------- +-- Author : Alexis Jeandet +-- Mail : alexis.jeandet@member.fsf.org +-------------------------------------------------------------------------------*/ + +/* Linker script to configure memory regions. + * Need modifying for a specific board. + * FLASH.ORIGIN: starting address of flash + * FLASH.LENGTH: length of flash + * RAM.ORIGIN: starting address of RAM bank 0 + * RAM.LENGTH: length of RAM bank 0 + */ +MEMORY +{ + FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 2048k + RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 112k + ETHRAM (xrw) : ORIGIN = 0x2001C000, LENGTH = 16k + AUXRAM (xrw) : ORIGIN = 0x20020000, LENGTH = 64k + CCMRAM (xrw) : ORIGIN = 0x10000000, LENGTH = 64k + MEMORY_B1 (rx) : ORIGIN = 0x60000000, LENGTH = 0K +} + +/* Linker script to place sections and symbol values. Should be used together + * with other linker script that defines memory regions FLASH and RAM. + * It references following symbols, which must be defined in code: + * Reset_Handler : Entry of reset handler + * + * It defines following symbols, which code can use without definition: + * __exidx_start + * __exidx_end + * __copy_table_start__ + * __copy_table_end__ + * __zero_table_start__ + * __zero_table_end__ + * __etext + * __data_start__ + * __preinit_array_start + * __preinit_array_end + * __init_array_start + * __init_array_end + * __fini_array_start + * __fini_array_end + * __data_end__ + * __bss_start__ + * __bss_end__ + * __end__ + * end + * __HeapLimit + * __StackLimit + * __StackTop + * __stack + */ +ENTRY(Reset_Handler) + +SECTIONS +{ + .text : + { + KEEP(*(.isr_vector)) + *(.text*) + + *(.init) + *(.fini) + + /* .ctors */ + *crtbegin.o(.ctors) + *crtbegin?.o(.ctors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) + *(SORT(.ctors.*)) + *(.ctors) + + /* .dtors */ + *crtbegin.o(.dtors) + *crtbegin?.o(.dtors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) + *(SORT(.dtors.*)) + *(.dtors) + + *(.rodata*) + + *(.eh_frame*) + } > FLASH + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > FLASH + + __exidx_start = .; + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } > FLASH + __exidx_end = .; + + /* To copy multiple ROM to RAM sections, + * uncomment .copy.table section and, + * define __STARTUP_COPY_MULTIPLE in startup_ARMCMx.S */ + /* + .copy.table : + { + . = ALIGN(4); + __copy_table_start__ = .; + LONG (__etext) + LONG (__data_start__) + LONG (__data_end__ - __data_start__) + LONG (__etext2) + LONG (__data2_start__) + LONG (__data2_end__ - __data2_start__) + __copy_table_end__ = .; + } > FLASH + */ + + /* To clear multiple BSS sections, + * uncomment .zero.table section and, + * define __STARTUP_CLEAR_BSS_MULTIPLE in startup_ARMCMx.S */ + /* + .zero.table : + { + . = ALIGN(4); + __zero_table_start__ = .; + LONG (__bss_start__) + LONG (__bss_end__ - __bss_start__) + LONG (__bss2_start__) + LONG (__bss2_end__ - __bss2_start__) + __zero_table_end__ = .; + } > FLASH + */ + + __etext = .; + + .data : AT (__etext) + { + __data_start__ = .; + *(vtable) + *(.data*) + + . = ALIGN(4); + /* preinit data */ + PROVIDE_HIDDEN (__preinit_array_start = .); + *(.preinit_array) + PROVIDE_HIDDEN (__preinit_array_end = .); + + . = ALIGN(4); + /* init data */ + PROVIDE_HIDDEN (__init_array_start = .); + *(SORT(.init_array.*)) + *(.init_array) + PROVIDE_HIDDEN (__init_array_end = .); + + + . = ALIGN(4); + /* finit data */ + PROVIDE_HIDDEN (__fini_array_start = .); + *(SORT(.fini_array.*)) + *(.fini_array) + PROVIDE_HIDDEN (__fini_array_end = .); + + *(.jcr) + . = ALIGN(4); + /* All data end */ + __data_end__ = .; + + } > RAM + + .bss : + { + . = ALIGN(4); + __bss_start__ = .; + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + } > RAM + + .heap (COPY): + { + __end__ = .; + PROVIDE(end = .); + *(.heap*) + __HeapLimit = .; + } > RAM + + /* .stack_dummy section doesn't contains any symbols. It is only + * used for linker to calculate size of stack sections, and assign + * values to stack symbols later */ + .stack_dummy (COPY): + { + *(.stack*) + } > RAM + + /* Set stack top to end of RAM, and stack limit move down by + * size of stack_dummy section */ + __StackTop = ORIGIN(RAM) + LENGTH(RAM); + __StackLimit = __StackTop - SIZEOF(.stack_dummy); + PROVIDE(__stack = __StackTop); + + /* Check if data + heap + stack exceeds RAM limit */ + ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack") +} diff --git a/mkspecs/features/stm32f4/stm32f42_flash.ld b/mkspecs/features/stm32f4/stm32f42_flash.ld deleted file mode 100644 --- a/mkspecs/features/stm32f4/stm32f42_flash.ld +++ /dev/null @@ -1,142 +0,0 @@ -/* Entry Point */ -ENTRY(Reset_Handler) - -/* Highest address of the user mode stack */ -_estack = 0x20020000; /* end of 128K RAM on AHB bus*/ - -/* Generate a link error if heap and stack don't fit into RAM */ -_Min_Heap_Size = 0x2000; /* required amount of heap */ -_Min_Stack_Size = 0x2000; /* required amount of stack */ - -/* Specify the memory areas */ -MEMORY -{ - FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 2048k - RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 112k - ETHRAM (xrw) : ORIGIN = 0x2001C000, LENGTH = 16k - AUXRAM (xrw) : ORIGIN = 0x20020000, LENGTH = 64k - CCMRAM (xrw) : ORIGIN = 0x10000000, LENGTH = 64k - MEMORY_B1 (rx) : ORIGIN = 0x60000000, LENGTH = 0K -} - -/* Define output sections */ -SECTIONS -{ - /* The startup code goes first into FLASH */ - .isr_vector : - { - . = ALIGN(4); - KEEP(*(.isr_vector)) /* Startup code */ - . = ALIGN(4); - } >FLASH - - /* The program code and other data goes into FLASH */ - .text : - { - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - *(.glue_7) /* glue arm to thumb code */ - *(.glue_7t) /* glue thumb to arm code */ - *(.eh_frame) - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - _etext = .; /* define a global symbols at end of code */ - } >FLASH - - - .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH - .ARM : { - __exidx_start = .; - *(.ARM.exidx*) - __exidx_end = .; - } >FLASH - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >FLASH - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - } >FLASH - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(.fini_array*)) - KEEP (*(SORT(.fini_array.*))) - PROVIDE_HIDDEN (__fini_array_end = .); - } >FLASH - - /* used by the startup to initialize data */ - _sidata = .; - - /* Initialized data sections goes into RAM, load LMA copy after code */ - .data : AT ( _sidata ) - { - . = ALIGN(4); - _sdata = .; /* create a global symbol at data start */ - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - - . = ALIGN(4); - _edata = .; /* define a global symbol at data end */ - } >RAM - - /* 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(4); - PROVIDE ( end = . ); - PROVIDE ( _end = . ); - . = . + _Min_Heap_Size; - . = . + _Min_Stack_Size; - . = ALIGN(4); - } >RAM - - /* MEMORY_bank1 section, code must be located here explicitly */ - /* Example: extern int foo(void) __attribute__ ((section (".mb1text"))); */ - .memory_b1_text : - { - *(.mb1text) /* .mb1text sections (code) */ - *(.mb1text*) /* .mb1text* sections (code) */ - *(.mb1rodata) /* read-only data (constants) */ - *(.mb1rodata*) - } >MEMORY_B1 - - /* Remove information from the standard libraries */ - /DISCARD/ : - { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } - - .ARM.attributes 0 : { *(.ARM.attributes) } -} diff --git a/mkspecs/features/stm32f4/syscalls.c b/mkspecs/features/stm32f4/syscalls.c --- a/mkspecs/features/stm32f4/syscalls.c +++ b/mkspecs/features/stm32f4/syscalls.c @@ -137,11 +137,11 @@ int _read(int file, char *ptr, int len) caddr_t _sbrk(int incr) { register char * stack_ptr __asm__ ("sp"); - extern char _end; /* Defined by the linker */ + extern char end; /* Defined by the linker */ static char *heap_end; char *prev_heap_end; if (heap_end == 0) { - heap_end = &_end; + heap_end = &end; } prev_heap_end = heap_end; if (heap_end + incr > stack_ptr) { @@ -225,11 +225,11 @@ int _close_r (struct _reent *r, int file caddr_t _sbrk_r (struct _reent *r, int incr) { register char * stack_ptr __asm__ ("sp"); - extern char _end; /* Defined by the linker */ + extern char end; /* Defined by the linker */ static char *heap_end; char *prev_heap_end; if (heap_end == 0) { - heap_end = &_end; + heap_end = &end; } prev_heap_end = heap_end; if (heap_end + incr > stack_ptr) { diff --git a/src/common/GRAPHIC/CONTROLERS/CONTROLERS.pro b/src/common/GRAPHIC/CONTROLERS/CONTROLERS.pro --- a/src/common/GRAPHIC/CONTROLERS/CONTROLERS.pro +++ b/src/common/GRAPHIC/CONTROLERS/CONTROLERS.pro @@ -1,6 +1,7 @@ TEMPLATE = subdirs SUBDIRS += ILI9328 \ - SSD2119 + SSD2119 \ + D51E5TA7601 diff --git a/src/common/GRAPHIC/CONTROLERS/D51E5TA7601/D51E5TA7601.c b/src/common/GRAPHIC/CONTROLERS/D51E5TA7601/D51E5TA7601.c new file mode 100644 --- /dev/null +++ b/src/common/GRAPHIC/CONTROLERS/D51E5TA7601/D51E5TA7601.c @@ -0,0 +1,44 @@ +/*------------------------------------------------------------------------------ +-- This file is a part of the libuc, microcontroler library +-- Copyright (C) 2012, Alexis Jeandet +-- +-- 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, write to the Free Software +-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +------------------------------------------------------------------------------- +-- Author : Alexis Jeandet +-- Mail : alexis.jeandet@member.fsf.org +-------------------------------------------------------------------------------*/ +#define _PRVATE_D51E5TA7601_ +#include +#include +#include +#include +#include +#include + +#ifdef __OPTIMIZED_MATH +#include +#endif + + + + + + + + + + + + diff --git a/src/common/GRAPHIC/CONTROLERS/D51E5TA7601/D51E5TA7601.pro b/src/common/GRAPHIC/CONTROLERS/D51E5TA7601/D51E5TA7601.pro new file mode 100644 --- /dev/null +++ b/src/common/GRAPHIC/CONTROLERS/D51E5TA7601/D51E5TA7601.pro @@ -0,0 +1,9 @@ +TEMPLATE = lib +CONFIG += libuc2lib +TARGET = D51E5TA7601 + +SOURCES += \ + D51E5TA7601.c + + + diff --git a/src/common/GRAPHIC/GRAPHIC.pro b/src/common/GRAPHIC/GRAPHIC.pro --- a/src/common/GRAPHIC/GRAPHIC.pro +++ b/src/common/GRAPHIC/GRAPHIC.pro @@ -1,5 +1,6 @@ TEMPLATE = subdirs SUBDIRS += CONTROLERS \ + PAINTING \ TC_CONTROLERS \ GUI diff --git a/src/common/GRAPHIC/PAINTING/PAINTING.pro b/src/common/GRAPHIC/PAINTING/PAINTING.pro new file mode 100644 --- /dev/null +++ b/src/common/GRAPHIC/PAINTING/PAINTING.pro @@ -0,0 +1,12 @@ +TEMPLATE = lib +CONFIG += libuc2lib +TARGET = painting + +SOURCES += \ + painting.c + +HEADERS += \ + ../../../../include/GRAPHIC/PAINTING/painting.h + + + diff --git a/src/common/GRAPHIC/PAINTING/painting.c b/src/common/GRAPHIC/PAINTING/painting.c new file mode 100644 --- /dev/null +++ b/src/common/GRAPHIC/PAINTING/painting.c @@ -0,0 +1,87 @@ +/*------------------------------------------------------------------------------ +-- This file is a part of the libuc, microcontroler library +-- Copyright (C) 2013, Alexis Jeandet +-- +-- 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, write to the Free Software +-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +------------------------------------------------------------------------------- +-- Author : Alexis Jeandet +-- Mail : alexis.jeandet@member.fsf.org +-------------------------------------------------------------------------------*/ +#include +#include +#include +#include +#include +#include + +#ifdef __OPTIMIZED_MATH +#include +#endif + + + + +void paint(LCD_t* LCD,void* buffer,uint16_t Xpos,uint16_t Ypos,uint16_t Width,uint16_t Height) +{ + +} + +void paintText(LCD_t* LCD,char* buffer,uint16_t Xpos,uint16_t Ypos,sFONT *font,uint32_t color) +{ + +} + +void paintFilRect(LCD_t* LCD,uint16_t Xpos,uint16_t Ypos,uint16_t w,uint16_t h,uint32_t contColor,uint16_t contSz,uint32_t fillColor) +{ + +} + +void paintFilCirc(LCD_t* LCD,uint16_t Xpos,uint16_t Ypos,uint16_t r,uint32_t contColor,uint16_t contSz,uint32_t fillColor) +{ + +} + +void paintRect(LCD_t* LCD,uint16_t Xpos,uint16_t Ypos,uint16_t w,uint16_t h,uint32_t contColor,uint16_t contSz,uint32_t fillColor) +{ + +} + +void paintCirc(LCD_t* LCD,uint16_t Xpos,uint16_t Ypos,uint16_t r,uint32_t contColor,uint16_t contSz,uint32_t fillColor) +{ + +} + +void getPix(struct LCD_t* LCD,uint16_t* buffer,uint16_t Xpos,uint16_t Ypos,uint16_t w,uint16_t h) +{ + +} + +void paintChar(LCD_t* LCD,char buffer,uint16_t Xpos,uint16_t Ypos,sFONT* font,uint32_t color) +{ + +} + + + + + + + + + + + + + diff --git a/src/stm32f4/CORE/core.c b/src/stm32f4/CORE/core.c --- a/src/stm32f4/CORE/core.c +++ b/src/stm32f4/CORE/core.c @@ -26,9 +26,11 @@ #include #include + extern uint32_t OSC0; extern uint32_t INTOSC; extern uint32_t RTCOSC; +extern gpio_t TickLed; volatile uint32_t tickCounter=0; @@ -37,7 +39,7 @@ void SysTick_Handler(void) { tickCounter+=1; if((tickCounter&0xFFF)==0x800) - gpiosetval(PC15,!gpiogetval(PC15)); + gpiosetval(TickLed,!gpiogetval(TickLed)); } void delay_us(uint32_t value) diff --git a/src/stm32f4/CPU/cpu.pro b/src/stm32f4/CPU/cpu.pro --- a/src/stm32f4/CPU/cpu.pro +++ b/src/stm32f4/CPU/cpu.pro @@ -7,7 +7,7 @@ include(STM32F4xx_StdPeriph_Driver/STM32 UCMODEL=stm32f4 -FILESTOCOPY.files = cpu.pri stm32_flash.ld stm32f42_flash.ld startup.s cpuinit.c fs.c syscalls.c +FILESTOCOPY.files = cpu.pri stm32f4.ld stm32f42.ld crt0.s cpuinit.c fs.c syscalls.c FILESTOCOPY.path = $$[QT_INSTALL_PREFIX]/mkspecs/features/$$UCMODEL @@ -16,7 +16,14 @@ INCLUDEPATH += \ CMSIS/Include SOURCES += cpu.c -OTHER_FILES += cpu.pri stm32_flash.ld stm32f42_flash.ld startup.s cpuinit.c fs.c syscalls.c + +OTHER_FILES += cpu.pri \ + stm32f4.ld \ + stm32f42.ld \ + crt0.s \ + cpuinit.c \ + fs.c \ + syscalls.c diff --git a/src/stm32f4/CPU/crt0.s b/src/stm32f4/CPU/crt0.s new file mode 100644 --- /dev/null +++ b/src/stm32f4/CPU/crt0.s @@ -0,0 +1,358 @@ +/* File: startup_ARMCM4.S + * Purpose: startup file for Cortex-M4 devices. Should use with + * GCC for ARM Embedded Processors + * Version: V2.0 + * Date: 16 August 2013 + * +/* Copyright (c) 2011 - 2013 ARM LIMITED + + All rights reserved. + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - 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. + - Neither the name of ARM 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 COPYRIGHT HOLDERS AND 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. + ---------------------------------------------------------------------------*/ + /* + 2013 Modified for libuc2 use by Alexis Jeandet. + */ + .syntax unified + .cpu cortex-m4 + .fpu fpv4-sp-d16 + + .section .stack + .align 3 +#ifdef __STACK_SIZE + .equ Stack_Size, __STACK_SIZE +#else + .equ Stack_Size, 0x2000 +#endif + .globl __StackTop + .globl __StackLimit +__StackLimit: + .space Stack_Size + .size __StackLimit, . - __StackLimit +__StackTop: + .size __StackTop, . - __StackTop + + .section .heap + .align 3 +#ifdef __HEAP_SIZE + .equ Heap_Size, __HEAP_SIZE +#else + .equ Heap_Size, 0x2000 +#endif + .globl __HeapBase + .globl __HeapLimit +__HeapBase: + .if Heap_Size + .space Heap_Size + .endif + .size __HeapBase, . - __HeapBase +__HeapLimit: + .size __HeapLimit, . - __HeapLimit + + .section .isr_vector + .align 2 + .globl __isr_vector +__isr_vector: + .long __StackTop /* Top of Stack */ + .long Reset_Handler /* Reset Handler */ + .long NMI_Handler /* NMI Handler */ + .long HardFault_Handler /* Hard Fault Handler */ + .long MemManage_Handler /* MPU Fault Handler */ + .long BusFault_Handler /* Bus Fault Handler */ + .long UsageFault_Handler /* Usage Fault Handler */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long SVC_Handler /* SVCall Handler */ + .long DebugMon_Handler /* Debug Monitor Handler */ + .long 0 /* Reserved */ + .long PendSV_Handler /* PendSV Handler */ + .long SysTick_Handler /* SysTick Handler */ + + /* External interrupts */ + .word WWDG_IRQHandler /* Window WatchDog */ + .word PVD_IRQHandler /* PVD through EXTI Line detection */ + .word TAMP_STAMP_IRQHandler /* Tamper and TimeStamps through the EXTI line */ + .word RTC_WKUP_IRQHandler /* RTC Wakeup through the EXTI line */ + .word FLASH_IRQHandler /* FLASH */ + .word RCC_IRQHandler /* RCC */ + .word EXTI0_IRQHandler /* EXTI Line0 */ + .word EXTI1_IRQHandler /* EXTI Line1 */ + .word EXTI2_IRQHandler /* EXTI Line2 */ + .word EXTI3_IRQHandler /* EXTI Line3 */ + .word EXTI4_IRQHandler /* EXTI Line4 */ + .word DMA1_Stream0_IRQHandler /* DMA1 Stream 0 */ + .word DMA1_Stream1_IRQHandler /* DMA1 Stream 1 */ + .word DMA1_Stream2_IRQHandler /* DMA1 Stream 2 */ + .word DMA1_Stream3_IRQHandler /* DMA1 Stream 3 */ + .word DMA1_Stream4_IRQHandler /* DMA1 Stream 4 */ + .word DMA1_Stream5_IRQHandler /* DMA1 Stream 5 */ + .word DMA1_Stream6_IRQHandler /* DMA1 Stream 6 */ + .word ADC_IRQHandler /* ADC1, ADC2 and ADC3s */ + .word CAN1_TX_IRQHandler /* CAN1 TX */ + .word CAN1_RX0_IRQHandler /* CAN1 RX0 */ + .word CAN1_RX1_IRQHandler /* CAN1 RX1 */ + .word CAN1_SCE_IRQHandler /* CAN1 SCE */ + .word EXTI9_5_IRQHandler /* External Line[9:5]s */ + .word TIM1_BRK_TIM9_IRQHandler /* TIM1 Break and TIM9 */ + .word TIM1_UP_TIM10_IRQHandler /* TIM1 Update and TIM10 */ + .word TIM1_TRG_COM_TIM11_IRQHandler /* TIM1 Trigger and Commutation and TIM11 */ + .word TIM1_CC_IRQHandler /* TIM1 Capture Compare */ + .word TIM2_IRQHandler /* TIM2 */ + .word TIM3_IRQHandler /* TIM3 */ + .word TIM4_IRQHandler /* TIM4 */ + .word I2C1_EV_IRQHandler /* I2C1 Event */ + .word I2C1_ER_IRQHandler /* I2C1 Error */ + .word I2C2_EV_IRQHandler /* I2C2 Event */ + .word I2C2_ER_IRQHandler /* I2C2 Error */ + .word SPI1_IRQHandler /* SPI1 */ + .word SPI2_IRQHandler /* SPI2 */ + .word USART1_IRQHandler /* USART1 */ + .word USART2_IRQHandler /* USART2 */ + .word USART3_IRQHandler /* USART3 */ + .word EXTI15_10_IRQHandler /* External Line[15:10]s */ + .word RTC_Alarm_IRQHandler /* RTC Alarm (A and B) through EXTI Line */ + .word OTG_FS_WKUP_IRQHandler /* USB OTG FS Wakeup through EXTI line */ + .word TIM8_BRK_TIM12_IRQHandler /* TIM8 Break and TIM12 */ + .word TIM8_UP_TIM13_IRQHandler /* TIM8 Update and TIM13 */ + .word TIM8_TRG_COM_TIM14_IRQHandler /* TIM8 Trigger and Commutation and TIM14 */ + .word TIM8_CC_IRQHandler /* TIM8 Capture Compare */ + .word DMA1_Stream7_IRQHandler /* DMA1 Stream7 */ + .word FSMC_IRQHandler /* FSMC */ + .word SDIO_IRQHandler /* SDIO */ + .word TIM5_IRQHandler /* TIM5 */ + .word SPI3_IRQHandler /* SPI3 */ + .word UART4_IRQHandler /* UART4 */ + .word UART5_IRQHandler /* UART5 */ + .word TIM6_DAC_IRQHandler /* TIM6 and DAC1&2 underrun errors */ + .word TIM7_IRQHandler /* TIM7 */ + .word DMA2_Stream0_IRQHandler /* DMA2 Stream 0 */ + .word DMA2_Stream1_IRQHandler /* DMA2 Stream 1 */ + .word DMA2_Stream2_IRQHandler /* DMA2 Stream 2 */ + .word DMA2_Stream3_IRQHandler /* DMA2 Stream 3 */ + .word DMA2_Stream4_IRQHandler /* DMA2 Stream 4 */ + .word ETH_IRQHandler /* Ethernet */ + .word ETH_WKUP_IRQHandler /* Ethernet Wakeup through EXTI line */ + .word CAN2_TX_IRQHandler /* CAN2 TX */ + .word CAN2_RX0_IRQHandler /* CAN2 RX0 */ + .word CAN2_RX1_IRQHandler /* CAN2 RX1 */ + .word CAN2_SCE_IRQHandler /* CAN2 SCE */ + .word OTG_FS_IRQHandler /* USB OTG FS */ + .word DMA2_Stream5_IRQHandler /* DMA2 Stream 5 */ + .word DMA2_Stream6_IRQHandler /* DMA2 Stream 6 */ + .word DMA2_Stream7_IRQHandler /* DMA2 Stream 7 */ + .word USART6_IRQHandler /* USART6 */ + .word I2C3_EV_IRQHandler /* I2C3 event */ + .word I2C3_ER_IRQHandler /* I2C3 error */ + .word OTG_HS_EP1_OUT_IRQHandler /* USB OTG HS End Point 1 Out */ + .word OTG_HS_EP1_IN_IRQHandler /* USB OTG HS End Point 1 In */ + .word OTG_HS_WKUP_IRQHandler /* USB OTG HS Wakeup through EXTI */ + .word OTG_HS_IRQHandler /* USB OTG HS */ + .word DCMI_IRQHandler /* DCMI */ + .word CRYP_IRQHandler /* CRYP crypto */ + .word HASH_RNG_IRQHandler /* Hash and Rng */ + .word FPU_IRQHandler /* FPU */ + + + .size __isr_vector, . - __isr_vector + + .text + .thumb + .thumb_func + .align 2 + .globl Reset_Handler + .type Reset_Handler, %function +Reset_Handler: +/* Firstly it copies data from read only memory to RAM. There are two schemes + * to copy. One can copy more than one sections. Another can only copy + * one section. The former scheme needs more instructions and read-only + * data to implement than the latter. + * Macro __STARTUP_COPY_MULTIPLE is used to choose between two schemes. */ + +/* Single section scheme. + * + * The ranges of copy from/to are specified by following symbols + * __etext: LMA of start of the section to copy from. Usually end of text + * __data_start__: VMA of start of the section to copy to + * __data_end__: VMA of end of the section to copy to + * + * All addresses must be aligned to 4 bytes boundary. + */ + ldr r1, =__etext + ldr r2, =__data_start__ + ldr r3, =__data_end__ + +.L_loop1: + cmp r2, r3 + ittt lt + ldrlt r0, [r1], #4 + strlt r0, [r2], #4 + blt .L_loop1 + +/* This part of work usually is done in C library startup code. Otherwise, + * define this macro to enable it in this startup. + * + * There are two schemes too. One can clear multiple BSS sections. Another + * can only clear one section. The former is more size expensive than the + * latter. + * + * Define macro __STARTUP_CLEAR_BSS_MULTIPLE to choose the former. + * Otherwise efine macro __STARTUP_CLEAR_BSS to choose the later. + */ + +/* Single BSS section scheme. + * + * The BSS section is specified by following symbols + * __bss_start__: start of the BSS section. + * __bss_end__: end of the BSS section. + * + * Both addresses must be aligned to 4 bytes boundary. + */ + ldr r1, =__bss_start__ + ldr r2, =__bss_end__ + + movs r0, 0 +.L_loop3: + cmp r1, r2 + itt lt + strlt r0, [r1], #4 + blt .L_loop3 + + bl main + + + .pool + .size Reset_Handler, . - Reset_Handler + + .align 1 + .thumb_func + .weak Default_Handler + .type Default_Handler, %function +Default_Handler: + b . + .size Default_Handler, . - Default_Handler + +/* Macro to define default handlers. Default handler + * will be weak symbol and just dead loops. They can be + * overwritten by other handlers */ + .macro def_irq_handler handler_name + .weak \handler_name + .set \handler_name, Default_Handler + .endm + + def_irq_handler NMI_Handler + def_irq_handler HardFault_Handler + def_irq_handler MemManage_Handler + def_irq_handler BusFault_Handler + def_irq_handler UsageFault_Handler + def_irq_handler SVC_Handler + def_irq_handler DebugMon_Handler + def_irq_handler PendSV_Handler + def_irq_handler SysTick_Handler + def_irq_handler DEF_IRQHandler + + def_irq_handler WWDG_IRQHandler + def_irq_handler PVD_IRQHandler + def_irq_handler TAMP_STAMP_IRQHandler + def_irq_handler RTC_WKUP_IRQHandler + def_irq_handler FLASH_IRQHandler + def_irq_handler RCC_IRQHandler + def_irq_handler EXTI0_IRQHandler + def_irq_handler EXTI1_IRQHandler + def_irq_handler EXTI2_IRQHandler + def_irq_handler EXTI3_IRQHandler + def_irq_handler EXTI4_IRQHandler + def_irq_handler DMA1_Stream0_IRQHandler + def_irq_handler DMA1_Stream1_IRQHandler + def_irq_handler DMA1_Stream2_IRQHandler + def_irq_handler DMA1_Stream3_IRQHandler + def_irq_handler DMA1_Stream4_IRQHandler + def_irq_handler DMA1_Stream5_IRQHandler + def_irq_handler DMA1_Stream6_IRQHandler + def_irq_handler ADC_IRQHandler + def_irq_handler CAN1_TX_IRQHandler + def_irq_handler CAN1_RX0_IRQHandler + def_irq_handler CAN1_RX1_IRQHandler + def_irq_handler CAN1_SCE_IRQHandler + def_irq_handler EXTI9_5_IRQHandler + def_irq_handler TIM1_BRK_TIM9_IRQHandler + def_irq_handler TIM1_UP_TIM10_IRQHandler + def_irq_handler TIM1_TRG_COM_TIM11_IRQHandler + def_irq_handler TIM1_CC_IRQHandler + def_irq_handler TIM2_IRQHandler + def_irq_handler TIM3_IRQHandler + def_irq_handler TIM4_IRQHandler + def_irq_handler I2C1_EV_IRQHandler + def_irq_handler I2C1_ER_IRQHandler + def_irq_handler I2C2_EV_IRQHandler + def_irq_handler I2C2_ER_IRQHandler + def_irq_handler SPI1_IRQHandler + def_irq_handler SPI2_IRQHandler + def_irq_handler USART1_IRQHandler + def_irq_handler USART2_IRQHandler + def_irq_handler USART3_IRQHandler + def_irq_handler EXTI15_10_IRQHandler + def_irq_handler RTC_Alarm_IRQHandler + def_irq_handler OTG_FS_WKUP_IRQHandler + def_irq_handler TIM8_BRK_TIM12_IRQHandler + def_irq_handler TIM8_UP_TIM13_IRQHandler + def_irq_handler TIM8_TRG_COM_TIM14_IRQHandler + def_irq_handler TIM8_CC_IRQHandler + def_irq_handler DMA1_Stream7_IRQHandler + def_irq_handler FSMC_IRQHandler + def_irq_handler SDIO_IRQHandler + def_irq_handler TIM5_IRQHandler + def_irq_handler SPI3_IRQHandler + def_irq_handler UART4_IRQHandler + def_irq_handler UART5_IRQHandler + def_irq_handler TIM6_DAC_IRQHandler + def_irq_handler TIM7_IRQHandler + def_irq_handler DMA2_Stream0_IRQHandler + def_irq_handler DMA2_Stream1_IRQHandler + def_irq_handler DMA2_Stream2_IRQHandler + def_irq_handler DMA2_Stream3_IRQHandler + def_irq_handler DMA2_Stream4_IRQHandler + def_irq_handler ETH_IRQHandler + def_irq_handler ETH_WKUP_IRQHandler + def_irq_handler CAN2_TX_IRQHandler + def_irq_handler CAN2_RX0_IRQHandler + def_irq_handler CAN2_RX1_IRQHandler + def_irq_handler CAN2_SCE_IRQHandler + def_irq_handler OTG_FS_IRQHandler + def_irq_handler DMA2_Stream5_IRQHandler + def_irq_handler DMA2_Stream6_IRQHandler + def_irq_handler DMA2_Stream7_IRQHandler + def_irq_handler USART6_IRQHandler + def_irq_handler I2C3_EV_IRQHandler + def_irq_handler I2C3_ER_IRQHandler + def_irq_handler OTG_HS_EP1_OUT_IRQHandler + def_irq_handler OTG_HS_EP1_IN_IRQHandler + def_irq_handler OTG_HS_WKUP_IRQHandler + def_irq_handler OTG_HS_IRQHandler + def_irq_handler DCMI_IRQHandler + def_irq_handler CRYP_IRQHandler + def_irq_handler HASH_RNG_IRQHandler + def_irq_handler FPU_IRQHandler + + .end diff --git a/src/stm32f4/CPU/startup.s b/src/stm32f4/CPU/startup.s deleted file mode 100644 --- a/src/stm32f4/CPU/startup.s +++ /dev/null @@ -1,454 +0,0 @@ - - .syntax unified - .cpu cortex-m4 - /*.fpu softvfp*/ - .fpu fpv4-sp-d16 - .thumb - -.global g_pfnVectors -.global Default_Handler - -/* start address for the initialization values of the .data section. -defined in linker script */ -.word _sidata -/* start address for the .data section. defined in linker script */ -.word _sdata -/* end address for the .data section. defined in linker script */ -.word _edata -/* start address for the .bss section. defined in linker script */ -.word _sbss -/* end address for the .bss section. defined in linker script */ -.word _ebss -/* stack used for SystemInit_ExtMemCtl; always internal RAM used */ - - - .section .text.Reset_Handler - .weak Reset_Handler - .type Reset_Handler, %function -Reset_Handler: - -/* Copy the data segment initializers from flash to SRAM */ - movs r1, #0 - b LoopCopyDataInit - -CopyDataInit: - ldr r3, =_sidata - ldr r3, [r3, r1] - str r3, [r0, r1] - adds r1, r1, #4 - -LoopCopyDataInit: - ldr r0, =_sdata - ldr r3, =_edata - adds r2, r0, r1 - cmp r2, r3 - bcc CopyDataInit - ldr r2, =_sbss - b LoopFillZerobss -/* Zero fill the bss segment. */ -FillZerobss: - movs r3, #0 - str r3, [r2], #4 - -LoopFillZerobss: - ldr r3, = _ebss - cmp r2, r3 - bcc FillZerobss - - bl main - bx lr -.size Reset_Handler, .-Reset_Handler - - .section .text.Default_Handler,"ax",%progbits -Default_Handler: -Infinite_Loop: - b Infinite_Loop - .size Default_Handler, .-Default_Handler - - - .section .isr_vector,"a",%progbits - .type g_pfnVectors, %object - .size g_pfnVectors, .-g_pfnVectors - - -g_pfnVectors: - .word _estack - .word Reset_Handler - .word NMI_Handler - .word HardFault_Handler - .word MemManage_Handler - .word BusFault_Handler - .word UsageFault_Handler - .word 0 - .word 0 - .word 0 - .word 0 - .word SVC_Handler - .word DebugMon_Handler - .word 0 - .word PendSV_Handler - .word SysTick_Handler - - /* External Interrupts */ - .word WWDG_IRQHandler /* Window WatchDog */ - .word PVD_IRQHandler /* PVD through EXTI Line detection */ - .word TAMP_STAMP_IRQHandler /* Tamper and TimeStamps through the EXTI line */ - .word RTC_WKUP_IRQHandler /* RTC Wakeup through the EXTI line */ - .word FLASH_IRQHandler /* FLASH */ - .word RCC_IRQHandler /* RCC */ - .word EXTI0_IRQHandler /* EXTI Line0 */ - .word EXTI1_IRQHandler /* EXTI Line1 */ - .word EXTI2_IRQHandler /* EXTI Line2 */ - .word EXTI3_IRQHandler /* EXTI Line3 */ - .word EXTI4_IRQHandler /* EXTI Line4 */ - .word DMA1_Stream0_IRQHandler /* DMA1 Stream 0 */ - .word DMA1_Stream1_IRQHandler /* DMA1 Stream 1 */ - .word DMA1_Stream2_IRQHandler /* DMA1 Stream 2 */ - .word DMA1_Stream3_IRQHandler /* DMA1 Stream 3 */ - .word DMA1_Stream4_IRQHandler /* DMA1 Stream 4 */ - .word DMA1_Stream5_IRQHandler /* DMA1 Stream 5 */ - .word DMA1_Stream6_IRQHandler /* DMA1 Stream 6 */ - .word ADC_IRQHandler /* ADC1, ADC2 and ADC3s */ - .word CAN1_TX_IRQHandler /* CAN1 TX */ - .word CAN1_RX0_IRQHandler /* CAN1 RX0 */ - .word CAN1_RX1_IRQHandler /* CAN1 RX1 */ - .word CAN1_SCE_IRQHandler /* CAN1 SCE */ - .word EXTI9_5_IRQHandler /* External Line[9:5]s */ - .word TIM1_BRK_TIM9_IRQHandler /* TIM1 Break and TIM9 */ - .word TIM1_UP_TIM10_IRQHandler /* TIM1 Update and TIM10 */ - .word TIM1_TRG_COM_TIM11_IRQHandler /* TIM1 Trigger and Commutation and TIM11 */ - .word TIM1_CC_IRQHandler /* TIM1 Capture Compare */ - .word TIM2_IRQHandler /* TIM2 */ - .word TIM3_IRQHandler /* TIM3 */ - .word TIM4_IRQHandler /* TIM4 */ - .word I2C1_EV_IRQHandler /* I2C1 Event */ - .word I2C1_ER_IRQHandler /* I2C1 Error */ - .word I2C2_EV_IRQHandler /* I2C2 Event */ - .word I2C2_ER_IRQHandler /* I2C2 Error */ - .word SPI1_IRQHandler /* SPI1 */ - .word SPI2_IRQHandler /* SPI2 */ - .word USART1_IRQHandler /* USART1 */ - .word USART2_IRQHandler /* USART2 */ - .word USART3_IRQHandler /* USART3 */ - .word EXTI15_10_IRQHandler /* External Line[15:10]s */ - .word RTC_Alarm_IRQHandler /* RTC Alarm (A and B) through EXTI Line */ - .word OTG_FS_WKUP_IRQHandler /* USB OTG FS Wakeup through EXTI line */ - .word TIM8_BRK_TIM12_IRQHandler /* TIM8 Break and TIM12 */ - .word TIM8_UP_TIM13_IRQHandler /* TIM8 Update and TIM13 */ - .word TIM8_TRG_COM_TIM14_IRQHandler /* TIM8 Trigger and Commutation and TIM14 */ - .word TIM8_CC_IRQHandler /* TIM8 Capture Compare */ - .word DMA1_Stream7_IRQHandler /* DMA1 Stream7 */ - .word FSMC_IRQHandler /* FSMC */ - .word SDIO_IRQHandler /* SDIO */ - .word TIM5_IRQHandler /* TIM5 */ - .word SPI3_IRQHandler /* SPI3 */ - .word UART4_IRQHandler /* UART4 */ - .word UART5_IRQHandler /* UART5 */ - .word TIM6_DAC_IRQHandler /* TIM6 and DAC1&2 underrun errors */ - .word TIM7_IRQHandler /* TIM7 */ - .word DMA2_Stream0_IRQHandler /* DMA2 Stream 0 */ - .word DMA2_Stream1_IRQHandler /* DMA2 Stream 1 */ - .word DMA2_Stream2_IRQHandler /* DMA2 Stream 2 */ - .word DMA2_Stream3_IRQHandler /* DMA2 Stream 3 */ - .word DMA2_Stream4_IRQHandler /* DMA2 Stream 4 */ - .word ETH_IRQHandler /* Ethernet */ - .word ETH_WKUP_IRQHandler /* Ethernet Wakeup through EXTI line */ - .word CAN2_TX_IRQHandler /* CAN2 TX */ - .word CAN2_RX0_IRQHandler /* CAN2 RX0 */ - .word CAN2_RX1_IRQHandler /* CAN2 RX1 */ - .word CAN2_SCE_IRQHandler /* CAN2 SCE */ - .word OTG_FS_IRQHandler /* USB OTG FS */ - .word DMA2_Stream5_IRQHandler /* DMA2 Stream 5 */ - .word DMA2_Stream6_IRQHandler /* DMA2 Stream 6 */ - .word DMA2_Stream7_IRQHandler /* DMA2 Stream 7 */ - .word USART6_IRQHandler /* USART6 */ - .word I2C3_EV_IRQHandler /* I2C3 event */ - .word I2C3_ER_IRQHandler /* I2C3 error */ - .word OTG_HS_EP1_OUT_IRQHandler /* USB OTG HS End Point 1 Out */ - .word OTG_HS_EP1_IN_IRQHandler /* USB OTG HS End Point 1 In */ - .word OTG_HS_WKUP_IRQHandler /* USB OTG HS Wakeup through EXTI */ - .word OTG_HS_IRQHandler /* USB OTG HS */ - .word DCMI_IRQHandler /* DCMI */ - .word CRYP_IRQHandler /* CRYP crypto */ - .word HASH_RNG_IRQHandler /* Hash and Rng */ - .word FPU_IRQHandler /* FPU */ - -/******************************************************************************* -* -* Provide weak aliases for each Exception handler to the Default_Handler. -* As they are weak aliases, any function with the same name will override -* this definition. -* -*******************************************************************************/ - .weak NMI_Handler - .thumb_set NMI_Handler,Default_Handler - - .weak HardFault_Handler - .thumb_set HardFault_Handler,Default_Handler - - .weak MemManage_Handler - .thumb_set MemManage_Handler,Default_Handler - - .weak BusFault_Handler - .thumb_set BusFault_Handler,Default_Handler - - .weak UsageFault_Handler - .thumb_set UsageFault_Handler,Default_Handler - - .weak SVC_Handler - .thumb_set SVC_Handler,Default_Handler - - .weak DebugMon_Handler - .thumb_set DebugMon_Handler,Default_Handler - - .weak PendSV_Handler - .thumb_set PendSV_Handler,Default_Handler - - .weak SysTick_Handler - .thumb_set SysTick_Handler,Default_Handler - - .weak WWDG_IRQHandler - .thumb_set WWDG_IRQHandler,Default_Handler - - .weak PVD_IRQHandler - .thumb_set PVD_IRQHandler,Default_Handler - - .weak TAMP_STAMP_IRQHandler - .thumb_set TAMP_STAMP_IRQHandler,Default_Handler - - .weak RTC_WKUP_IRQHandler - .thumb_set RTC_WKUP_IRQHandler,Default_Handler - - .weak FLASH_IRQHandler - .thumb_set FLASH_IRQHandler,Default_Handler - - .weak RCC_IRQHandler - .thumb_set RCC_IRQHandler,Default_Handler - - .weak EXTI0_IRQHandler - .thumb_set EXTI0_IRQHandler,Default_Handler - - .weak EXTI1_IRQHandler - .thumb_set EXTI1_IRQHandler,Default_Handler - - .weak EXTI2_IRQHandler - .thumb_set EXTI2_IRQHandler,Default_Handler - - .weak EXTI3_IRQHandler - .thumb_set EXTI3_IRQHandler,Default_Handler - - .weak EXTI4_IRQHandler - .thumb_set EXTI4_IRQHandler,Default_Handler - - .weak DMA1_Stream0_IRQHandler - .thumb_set DMA1_Stream0_IRQHandler,Default_Handler - - .weak DMA1_Stream1_IRQHandler - .thumb_set DMA1_Stream1_IRQHandler,Default_Handler - - .weak DMA1_Stream2_IRQHandler - .thumb_set DMA1_Stream2_IRQHandler,Default_Handler - - .weak DMA1_Stream3_IRQHandler - .thumb_set DMA1_Stream3_IRQHandler,Default_Handler - - .weak DMA1_Stream4_IRQHandler - .thumb_set DMA1_Stream4_IRQHandler,Default_Handler - - .weak DMA1_Stream5_IRQHandler - .thumb_set DMA1_Stream5_IRQHandler,Default_Handler - - .weak DMA1_Stream6_IRQHandler - .thumb_set DMA1_Stream6_IRQHandler,Default_Handler - - .weak ADC_IRQHandler - .thumb_set ADC_IRQHandler,Default_Handler - - .weak CAN1_TX_IRQHandler - .thumb_set CAN1_TX_IRQHandler,Default_Handler - - .weak CAN1_RX0_IRQHandler - .thumb_set CAN1_RX0_IRQHandler,Default_Handler - - .weak CAN1_RX1_IRQHandler - .thumb_set CAN1_RX1_IRQHandler,Default_Handler - - .weak CAN1_SCE_IRQHandler - .thumb_set CAN1_SCE_IRQHandler,Default_Handler - - .weak EXTI9_5_IRQHandler - .thumb_set EXTI9_5_IRQHandler,Default_Handler - - .weak TIM1_BRK_TIM9_IRQHandler - .thumb_set TIM1_BRK_TIM9_IRQHandler,Default_Handler - - .weak TIM1_UP_TIM10_IRQHandler - .thumb_set TIM1_UP_TIM10_IRQHandler,Default_Handler - - .weak TIM1_TRG_COM_TIM11_IRQHandler - .thumb_set TIM1_TRG_COM_TIM11_IRQHandler,Default_Handler - - .weak TIM1_CC_IRQHandler - .thumb_set TIM1_CC_IRQHandler,Default_Handler - - .weak TIM2_IRQHandler - .thumb_set TIM2_IRQHandler,Default_Handler - - .weak TIM3_IRQHandler - .thumb_set TIM3_IRQHandler,Default_Handler - - .weak TIM4_IRQHandler - .thumb_set TIM4_IRQHandler,Default_Handler - - .weak I2C1_EV_IRQHandler - .thumb_set I2C1_EV_IRQHandler,Default_Handler - - .weak I2C1_ER_IRQHandler - .thumb_set I2C1_ER_IRQHandler,Default_Handler - - .weak I2C2_EV_IRQHandler - .thumb_set I2C2_EV_IRQHandler,Default_Handler - - .weak I2C2_ER_IRQHandler - .thumb_set I2C2_ER_IRQHandler,Default_Handler - - .weak SPI1_IRQHandler - .thumb_set SPI1_IRQHandler,Default_Handler - - .weak SPI2_IRQHandler - .thumb_set SPI2_IRQHandler,Default_Handler - - .weak USART1_IRQHandler - .thumb_set USART1_IRQHandler,Default_Handler - - .weak USART2_IRQHandler - .thumb_set USART2_IRQHandler,Default_Handler - - .weak USART3_IRQHandler - .thumb_set USART3_IRQHandler,Default_Handler - - .weak EXTI15_10_IRQHandler - .thumb_set EXTI15_10_IRQHandler,Default_Handler - - .weak RTC_Alarm_IRQHandler - .thumb_set RTC_Alarm_IRQHandler,Default_Handler - - .weak OTG_FS_WKUP_IRQHandler - .thumb_set OTG_FS_WKUP_IRQHandler,Default_Handler - - .weak TIM8_BRK_TIM12_IRQHandler - .thumb_set TIM8_BRK_TIM12_IRQHandler,Default_Handler - - .weak TIM8_UP_TIM13_IRQHandler - .thumb_set TIM8_UP_TIM13_IRQHandler,Default_Handler - - .weak TIM8_TRG_COM_TIM14_IRQHandler - .thumb_set TIM8_TRG_COM_TIM14_IRQHandler,Default_Handler - - .weak TIM8_CC_IRQHandler - .thumb_set TIM8_CC_IRQHandler,Default_Handler - - .weak DMA1_Stream7_IRQHandler - .thumb_set DMA1_Stream7_IRQHandler,Default_Handler - - .weak FSMC_IRQHandler - .thumb_set FSMC_IRQHandler,Default_Handler - - .weak SDIO_IRQHandler - .thumb_set SDIO_IRQHandler,Default_Handler - - .weak TIM5_IRQHandler - .thumb_set TIM5_IRQHandler,Default_Handler - - .weak SPI3_IRQHandler - .thumb_set SPI3_IRQHandler,Default_Handler - - .weak UART4_IRQHandler - .thumb_set UART4_IRQHandler,Default_Handler - - .weak UART5_IRQHandler - .thumb_set UART5_IRQHandler,Default_Handler - - .weak TIM6_DAC_IRQHandler - .thumb_set TIM6_DAC_IRQHandler,Default_Handler - - .weak TIM7_IRQHandler - .thumb_set TIM7_IRQHandler,Default_Handler - - .weak DMA2_Stream0_IRQHandler - .thumb_set DMA2_Stream0_IRQHandler,Default_Handler - - .weak DMA2_Stream1_IRQHandler - .thumb_set DMA2_Stream1_IRQHandler,Default_Handler - - .weak DMA2_Stream2_IRQHandler - .thumb_set DMA2_Stream2_IRQHandler,Default_Handler - - .weak DMA2_Stream3_IRQHandler - .thumb_set DMA2_Stream3_IRQHandler,Default_Handler - - .weak DMA2_Stream4_IRQHandler - .thumb_set DMA2_Stream4_IRQHandler,Default_Handler - - .weak ETH_IRQHandler - .thumb_set ETH_IRQHandler,Default_Handler - - .weak ETH_WKUP_IRQHandler - .thumb_set ETH_WKUP_IRQHandler,Default_Handler - - .weak CAN2_TX_IRQHandler - .thumb_set CAN2_TX_IRQHandler,Default_Handler - - .weak CAN2_RX0_IRQHandler - .thumb_set CAN2_RX0_IRQHandler,Default_Handler - - .weak CAN2_RX1_IRQHandler - .thumb_set CAN2_RX1_IRQHandler,Default_Handler - - .weak CAN2_SCE_IRQHandler - .thumb_set CAN2_SCE_IRQHandler,Default_Handler - - .weak OTG_FS_IRQHandler - .thumb_set OTG_FS_IRQHandler,Default_Handler - - .weak DMA2_Stream5_IRQHandler - .thumb_set DMA2_Stream5_IRQHandler,Default_Handler - - .weak DMA2_Stream6_IRQHandler - .thumb_set DMA2_Stream6_IRQHandler,Default_Handler - - .weak DMA2_Stream7_IRQHandler - .thumb_set DMA2_Stream7_IRQHandler,Default_Handler - - .weak USART6_IRQHandler - .thumb_set USART6_IRQHandler,Default_Handler - - .weak I2C3_EV_IRQHandler - .thumb_set I2C3_EV_IRQHandler,Default_Handler - - .weak I2C3_ER_IRQHandler - .thumb_set I2C3_ER_IRQHandler,Default_Handler - - .weak OTG_HS_EP1_OUT_IRQHandler - .thumb_set OTG_HS_EP1_OUT_IRQHandler,Default_Handler - - .weak OTG_HS_EP1_IN_IRQHandler - .thumb_set OTG_HS_EP1_IN_IRQHandler,Default_Handler - - .weak OTG_HS_WKUP_IRQHandler - .thumb_set OTG_HS_WKUP_IRQHandler,Default_Handler - - .weak OTG_HS_IRQHandler - .thumb_set OTG_HS_IRQHandler,Default_Handler - - .weak DCMI_IRQHandler - .thumb_set DCMI_IRQHandler,Default_Handler - - .weak CRYP_IRQHandler - .thumb_set CRYP_IRQHandler,Default_Handler - - .weak HASH_RNG_IRQHandler - .thumb_set HASH_RNG_IRQHandler,Default_Handler - - .weak FPU_IRQHandler - .thumb_set FPU_IRQHandler,Default_Handler diff --git a/src/stm32f4/CPU/stm32_flash.ld b/src/stm32f4/CPU/stm32_flash.ld deleted file mode 100644 --- a/src/stm32f4/CPU/stm32_flash.ld +++ /dev/null @@ -1,174 +0,0 @@ -/* -***************************************************************************** -** -** File : stm32_flash.ld -** -** Abstract : Linker script for STM32F407VG Device with -** 1024KByte FLASH, 192KByte 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 -** -** Environment : Atollic TrueSTUDIO(R) -** -** Distribution: The file is distributed �as is,� without any warranty -** of any kind. -** -** (c)Copyright Atollic AB. -** You may use this file as-is or modify it according to the needs of your -** project. Distribution of this file (unmodified or modified) is not -** permitted. Atollic AB permit registered Atollic TrueSTUDIO(R) users the -** rights to distribute the assembled, compiled & linked contents of this -** file as part of an application binary file, provided that it is built -** using the Atollic TrueSTUDIO(R) toolchain. -** -***************************************************************************** -*/ - -/* Entry Point */ -ENTRY(Reset_Handler) - -/* Highest address of the user mode stack */ -_estack = 0x20020000; /* end of 128K RAM on AHB bus*/ -_eMainStack = 0x1002000; /* end of 64K CCMRAM on AHB bus*/ - -/* Generate a link error if heap and stack don't fit into RAM */ -_Min_Heap_Size = 0x2000; /* required amount of heap */ -_Min_Stack_Size = 0x2000; /* required amount of stack */ -_Min_MainStack_Size = 0x2000; /* required amount of stack 0x2000=8kB*/ - -/* Specify the memory areas */ -MEMORY -{ - FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 1024k - RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 112k - CCMRAM (xrw) : ORIGIN = 0x10000000, LENGTH = 64k - MEMORY_B1 (rx) : ORIGIN = 0x60000000, LENGTH = 0K -} - -/* Define output sections */ -SECTIONS -{ - /* The startup code goes first into FLASH */ - .isr_vector : - { - . = ALIGN(4); - KEEP(*(.isr_vector)) /* Startup code */ - . = ALIGN(4); - } >FLASH - - /* The program code and other data goes into FLASH */ - .text : - { - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - *(.glue_7) /* glue arm to thumb code */ - *(.glue_7t) /* glue thumb to arm code */ - *(.eh_frame) - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - _etext = .; /* define a global symbols at end of code */ - } >FLASH - - - .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH - .ARM : { - __exidx_start = .; - *(.ARM.exidx*) - __exidx_end = .; - } >FLASH - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >FLASH - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - } >FLASH - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(.fini_array*)) - KEEP (*(SORT(.fini_array.*))) - PROVIDE_HIDDEN (__fini_array_end = .); - } >FLASH - - /* used by the startup to initialize data */ - _sidata = .; - - /* Initialized data sections goes into RAM, load LMA copy after code */ - .data : AT ( _sidata ) - { - . = ALIGN(4); - _sdata = .; /* create a global symbol at data start */ - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - - . = ALIGN(4); - _edata = .; /* define a global symbol at data end */ - } >RAM - - /* 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(4); - PROVIDE ( end = . ); - PROVIDE ( _end = . ); - . = . + _Min_Heap_Size; - . = . + _Min_Stack_Size; - . = ALIGN(4); - } >RAM - - - /* MEMORY_bank1 section, code must be located here explicitly */ - /* Example: extern int foo(void) __attribute__ ((section (".mb1text"))); */ - .memory_b1_text : - { - *(.mb1text) /* .mb1text sections (code) */ - *(.mb1text*) /* .mb1text* sections (code) */ - *(.mb1rodata) /* read-only data (constants) */ - *(.mb1rodata*) - } >MEMORY_B1 - - /* Remove information from the standard libraries */ - /DISCARD/ : - { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } - - .ARM.attributes 0 : { *(.ARM.attributes) } -} diff --git a/src/stm32f4/CPU/stm32f4.ld b/src/stm32f4/CPU/stm32f4.ld new file mode 100644 --- /dev/null +++ b/src/stm32f4/CPU/stm32f4.ld @@ -0,0 +1,216 @@ +/*------------------------------------------------------------------------------ +-- This file is a part of the libuc, microcontroler library +-- Copyright (C) 2013, Alexis Jeandet +-- +-- 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, write to the Free Software +-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +------------------------------------------------------------------------------- +-- Author : Alexis Jeandet +-- Mail : alexis.jeandet@member.fsf.org +-------------------------------------------------------------------------------*/ + +/* Linker script to configure memory regions. + * Need modifying for a specific board. + * FLASH.ORIGIN: starting address of flash + * FLASH.LENGTH: length of flash + * RAM.ORIGIN: starting address of RAM bank 0 + * RAM.LENGTH: length of RAM bank 0 + */ +MEMORY +{ + FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 1024k + RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 112k + CCMRAM (xrw) : ORIGIN = 0x10000000, LENGTH = 64k + MEMORY_B1 (rx) : ORIGIN = 0x60000000, LENGTH = 0 + BANK1_SRAM2 (!ixrw): ORIGIN = 0x64000000, LENGTH = 64M +} + +/* Linker script to place sections and symbol values. Should be used together + * with other linker script that defines memory regions FLASH and RAM. + * It references following symbols, which must be defined in code: + * Reset_Handler : Entry of reset handler + * + * It defines following symbols, which code can use without definition: + * __exidx_start + * __exidx_end + * __copy_table_start__ + * __copy_table_end__ + * __zero_table_start__ + * __zero_table_end__ + * __etext + * __data_start__ + * __preinit_array_start + * __preinit_array_end + * __init_array_start + * __init_array_end + * __fini_array_start + * __fini_array_end + * __data_end__ + * __bss_start__ + * __bss_end__ + * __end__ + * end + * __HeapLimit + * __StackLimit + * __StackTop + * __stack + */ +ENTRY(Reset_Handler) + +SECTIONS +{ + .text : + { + KEEP(*(.isr_vector)) + *(.text*) + + *(.init) + *(.fini) + + /* .ctors */ + *crtbegin.o(.ctors) + *crtbegin?.o(.ctors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) + *(SORT(.ctors.*)) + *(.ctors) + + /* .dtors */ + *crtbegin.o(.dtors) + *crtbegin?.o(.dtors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) + *(SORT(.dtors.*)) + *(.dtors) + + *(.rodata*) + + *(.eh_frame*) + } > FLASH + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > FLASH + + __exidx_start = .; + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } > FLASH + __exidx_end = .; + + /* To copy multiple ROM to RAM sections, + * uncomment .copy.table section and, + * define __STARTUP_COPY_MULTIPLE in startup_ARMCMx.S */ + /* + .copy.table : + { + . = ALIGN(4); + __copy_table_start__ = .; + LONG (__etext) + LONG (__data_start__) + LONG (__data_end__ - __data_start__) + LONG (__etext2) + LONG (__data2_start__) + LONG (__data2_end__ - __data2_start__) + __copy_table_end__ = .; + } > FLASH + */ + + /* To clear multiple BSS sections, + * uncomment .zero.table section and, + * define __STARTUP_CLEAR_BSS_MULTIPLE in startup_ARMCMx.S */ + /* + .zero.table : + { + . = ALIGN(4); + __zero_table_start__ = .; + LONG (__bss_start__) + LONG (__bss_end__ - __bss_start__) + LONG (__bss2_start__) + LONG (__bss2_end__ - __bss2_start__) + __zero_table_end__ = .; + } > FLASH + */ + + __etext = .; + + .data : AT (__etext) + { + __data_start__ = .; + *(vtable) + *(.data*) + + . = ALIGN(4); + /* preinit data */ + PROVIDE_HIDDEN (__preinit_array_start = .); + *(.preinit_array) + PROVIDE_HIDDEN (__preinit_array_end = .); + + . = ALIGN(4); + /* init data */ + PROVIDE_HIDDEN (__init_array_start = .); + *(SORT(.init_array.*)) + *(.init_array) + PROVIDE_HIDDEN (__init_array_end = .); + + + . = ALIGN(4); + /* finit data */ + PROVIDE_HIDDEN (__fini_array_start = .); + *(SORT(.fini_array.*)) + *(.fini_array) + PROVIDE_HIDDEN (__fini_array_end = .); + + *(.jcr) + . = ALIGN(4); + /* All data end */ + __data_end__ = .; + + } > RAM + + .bss : + { + . = ALIGN(4); + __bss_start__ = .; + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + } > RAM + + .heap (COPY): + { + __end__ = .; + PROVIDE(end = .); + *(.heap*) + __HeapLimit = .; + } > RAM + + /* .stack_dummy section doesn't contains any symbols. It is only + * used for linker to calculate size of stack sections, and assign + * values to stack symbols later */ + .stack_dummy (COPY): + { + *(.stack*) + } > RAM + + /* Set stack top to end of RAM, and stack limit move down by + * size of stack_dummy section */ + __StackTop = ORIGIN(RAM) + LENGTH(RAM); + __StackLimit = __StackTop - SIZEOF(.stack_dummy); + PROVIDE(__stack = __StackTop); + + /* Check if data + heap + stack exceeds RAM limit */ + ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack") +} diff --git a/src/stm32f4/CPU/stm32f42.ld b/src/stm32f4/CPU/stm32f42.ld new file mode 100644 --- /dev/null +++ b/src/stm32f4/CPU/stm32f42.ld @@ -0,0 +1,217 @@ +/*------------------------------------------------------------------------------ +-- This file is a part of the libuc, microcontroler library +-- Copyright (C) 2013, Alexis Jeandet +-- +-- 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, write to the Free Software +-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +------------------------------------------------------------------------------- +-- Author : Alexis Jeandet +-- Mail : alexis.jeandet@member.fsf.org +-------------------------------------------------------------------------------*/ + +/* Linker script to configure memory regions. + * Need modifying for a specific board. + * FLASH.ORIGIN: starting address of flash + * FLASH.LENGTH: length of flash + * RAM.ORIGIN: starting address of RAM bank 0 + * RAM.LENGTH: length of RAM bank 0 + */ +MEMORY +{ + FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 2048k + RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 112k + ETHRAM (xrw) : ORIGIN = 0x2001C000, LENGTH = 16k + AUXRAM (xrw) : ORIGIN = 0x20020000, LENGTH = 64k + CCMRAM (xrw) : ORIGIN = 0x10000000, LENGTH = 64k + MEMORY_B1 (rx) : ORIGIN = 0x60000000, LENGTH = 0K +} + +/* Linker script to place sections and symbol values. Should be used together + * with other linker script that defines memory regions FLASH and RAM. + * It references following symbols, which must be defined in code: + * Reset_Handler : Entry of reset handler + * + * It defines following symbols, which code can use without definition: + * __exidx_start + * __exidx_end + * __copy_table_start__ + * __copy_table_end__ + * __zero_table_start__ + * __zero_table_end__ + * __etext + * __data_start__ + * __preinit_array_start + * __preinit_array_end + * __init_array_start + * __init_array_end + * __fini_array_start + * __fini_array_end + * __data_end__ + * __bss_start__ + * __bss_end__ + * __end__ + * end + * __HeapLimit + * __StackLimit + * __StackTop + * __stack + */ +ENTRY(Reset_Handler) + +SECTIONS +{ + .text : + { + KEEP(*(.isr_vector)) + *(.text*) + + *(.init) + *(.fini) + + /* .ctors */ + *crtbegin.o(.ctors) + *crtbegin?.o(.ctors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) + *(SORT(.ctors.*)) + *(.ctors) + + /* .dtors */ + *crtbegin.o(.dtors) + *crtbegin?.o(.dtors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) + *(SORT(.dtors.*)) + *(.dtors) + + *(.rodata*) + + *(.eh_frame*) + } > FLASH + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > FLASH + + __exidx_start = .; + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } > FLASH + __exidx_end = .; + + /* To copy multiple ROM to RAM sections, + * uncomment .copy.table section and, + * define __STARTUP_COPY_MULTIPLE in startup_ARMCMx.S */ + /* + .copy.table : + { + . = ALIGN(4); + __copy_table_start__ = .; + LONG (__etext) + LONG (__data_start__) + LONG (__data_end__ - __data_start__) + LONG (__etext2) + LONG (__data2_start__) + LONG (__data2_end__ - __data2_start__) + __copy_table_end__ = .; + } > FLASH + */ + + /* To clear multiple BSS sections, + * uncomment .zero.table section and, + * define __STARTUP_CLEAR_BSS_MULTIPLE in startup_ARMCMx.S */ + /* + .zero.table : + { + . = ALIGN(4); + __zero_table_start__ = .; + LONG (__bss_start__) + LONG (__bss_end__ - __bss_start__) + LONG (__bss2_start__) + LONG (__bss2_end__ - __bss2_start__) + __zero_table_end__ = .; + } > FLASH + */ + + __etext = .; + + .data : AT (__etext) + { + __data_start__ = .; + *(vtable) + *(.data*) + + . = ALIGN(4); + /* preinit data */ + PROVIDE_HIDDEN (__preinit_array_start = .); + *(.preinit_array) + PROVIDE_HIDDEN (__preinit_array_end = .); + + . = ALIGN(4); + /* init data */ + PROVIDE_HIDDEN (__init_array_start = .); + *(SORT(.init_array.*)) + *(.init_array) + PROVIDE_HIDDEN (__init_array_end = .); + + + . = ALIGN(4); + /* finit data */ + PROVIDE_HIDDEN (__fini_array_start = .); + *(SORT(.fini_array.*)) + *(.fini_array) + PROVIDE_HIDDEN (__fini_array_end = .); + + *(.jcr) + . = ALIGN(4); + /* All data end */ + __data_end__ = .; + + } > RAM + + .bss : + { + . = ALIGN(4); + __bss_start__ = .; + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + } > RAM + + .heap (COPY): + { + __end__ = .; + PROVIDE(end = .); + *(.heap*) + __HeapLimit = .; + } > RAM + + /* .stack_dummy section doesn't contains any symbols. It is only + * used for linker to calculate size of stack sections, and assign + * values to stack symbols later */ + .stack_dummy (COPY): + { + *(.stack*) + } > RAM + + /* Set stack top to end of RAM, and stack limit move down by + * size of stack_dummy section */ + __StackTop = ORIGIN(RAM) + LENGTH(RAM); + __StackLimit = __StackTop - SIZEOF(.stack_dummy); + PROVIDE(__stack = __StackTop); + + /* Check if data + heap + stack exceeds RAM limit */ + ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack") +} diff --git a/src/stm32f4/CPU/stm32f42_flash.ld b/src/stm32f4/CPU/stm32f42_flash.ld deleted file mode 100644 --- a/src/stm32f4/CPU/stm32f42_flash.ld +++ /dev/null @@ -1,142 +0,0 @@ -/* Entry Point */ -ENTRY(Reset_Handler) - -/* Highest address of the user mode stack */ -_estack = 0x20020000; /* end of 128K RAM on AHB bus*/ - -/* Generate a link error if heap and stack don't fit into RAM */ -_Min_Heap_Size = 0x2000; /* required amount of heap */ -_Min_Stack_Size = 0x2000; /* required amount of stack */ - -/* Specify the memory areas */ -MEMORY -{ - FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 2048k - RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 112k - ETHRAM (xrw) : ORIGIN = 0x2001C000, LENGTH = 16k - AUXRAM (xrw) : ORIGIN = 0x20020000, LENGTH = 64k - CCMRAM (xrw) : ORIGIN = 0x10000000, LENGTH = 64k - MEMORY_B1 (rx) : ORIGIN = 0x60000000, LENGTH = 0K -} - -/* Define output sections */ -SECTIONS -{ - /* The startup code goes first into FLASH */ - .isr_vector : - { - . = ALIGN(4); - KEEP(*(.isr_vector)) /* Startup code */ - . = ALIGN(4); - } >FLASH - - /* The program code and other data goes into FLASH */ - .text : - { - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - *(.glue_7) /* glue arm to thumb code */ - *(.glue_7t) /* glue thumb to arm code */ - *(.eh_frame) - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - _etext = .; /* define a global symbols at end of code */ - } >FLASH - - - .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH - .ARM : { - __exidx_start = .; - *(.ARM.exidx*) - __exidx_end = .; - } >FLASH - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >FLASH - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - } >FLASH - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(.fini_array*)) - KEEP (*(SORT(.fini_array.*))) - PROVIDE_HIDDEN (__fini_array_end = .); - } >FLASH - - /* used by the startup to initialize data */ - _sidata = .; - - /* Initialized data sections goes into RAM, load LMA copy after code */ - .data : AT ( _sidata ) - { - . = ALIGN(4); - _sdata = .; /* create a global symbol at data start */ - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - - . = ALIGN(4); - _edata = .; /* define a global symbol at data end */ - } >RAM - - /* 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(4); - PROVIDE ( end = . ); - PROVIDE ( _end = . ); - . = . + _Min_Heap_Size; - . = . + _Min_Stack_Size; - . = ALIGN(4); - } >RAM - - /* MEMORY_bank1 section, code must be located here explicitly */ - /* Example: extern int foo(void) __attribute__ ((section (".mb1text"))); */ - .memory_b1_text : - { - *(.mb1text) /* .mb1text sections (code) */ - *(.mb1text*) /* .mb1text* sections (code) */ - *(.mb1rodata) /* read-only data (constants) */ - *(.mb1rodata*) - } >MEMORY_B1 - - /* Remove information from the standard libraries */ - /DISCARD/ : - { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } - - .ARM.attributes 0 : { *(.ARM.attributes) } -} diff --git a/src/stm32f4/CPU/syscalls.c b/src/stm32f4/CPU/syscalls.c --- a/src/stm32f4/CPU/syscalls.c +++ b/src/stm32f4/CPU/syscalls.c @@ -137,11 +137,11 @@ int _read(int file, char *ptr, int len) caddr_t _sbrk(int incr) { register char * stack_ptr __asm__ ("sp"); - extern char _end; /* Defined by the linker */ + extern char end; /* Defined by the linker */ static char *heap_end; char *prev_heap_end; if (heap_end == 0) { - heap_end = &_end; + heap_end = &end; } prev_heap_end = heap_end; if (heap_end + incr > stack_ptr) { @@ -225,11 +225,11 @@ int _close_r (struct _reent *r, int file caddr_t _sbrk_r (struct _reent *r, int incr) { register char * stack_ptr __asm__ ("sp"); - extern char _end; /* Defined by the linker */ + extern char end; /* Defined by the linker */ static char *heap_end; char *prev_heap_end; if (heap_end == 0) { - heap_end = &_end; + heap_end = &end; } prev_heap_end = heap_end; if (heap_end + incr > stack_ptr) { diff --git a/src/stm32f4/I2C/i2c.c b/src/stm32f4/I2C/i2c.c --- a/src/stm32f4/I2C/i2c.c +++ b/src/stm32f4/I2C/i2c.c @@ -26,6 +26,7 @@ #include #include #include +#include #define GPIOGETPORT(gpio) ((GPIO_TypeDef*)(((((uint32_t)gpio) & (uint32_t)0x0000FF00)*(uint32_t)4) + (uint32_t)GPIOA)) #define GPIOPORTNUM(gpio) (((uint32_t)(gpio) & (uint32_t)0x0000FF00)>>(uint32_t)8)