fix for mbed lib issue 3 (i2c problem) see also https://mbed.org/users/mbed_official/code/mbed/issues/3 affected implementations: LPC812, LPC11U24, LPC1768, LPC2368, LPC4088

Fork of mbed-src by mbed official

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers startup_LPC11xx.cpp Source File

startup_LPC11xx.cpp

00001 extern "C" {
00002 
00003 #include "LPC11Uxx.h"
00004 
00005 #define WEAK          __attribute__ ((weak))
00006 #define ALIAS(f)      __attribute__ ((weak, alias (#f)))
00007 #define AFTER_VECTORS __attribute__ ((section(".after_vectors")))
00008 
00009      void ResetISR            (void);
00010 WEAK void NMI_Handler         (void);
00011 WEAK void HardFault_Handler   (void);
00012 WEAK void SVCall_Handler      (void);
00013 WEAK void PendSV_Handler      (void);
00014 WEAK void SysTick_Handler     (void);
00015 WEAK void IntDefaultHandler   (void);
00016      void FLEX_INT0_IRQHandler(void) ALIAS(IntDefaultHandler);
00017      void FLEX_INT1_IRQHandler(void) ALIAS(IntDefaultHandler);
00018      void FLEX_INT2_IRQHandler(void) ALIAS(IntDefaultHandler);
00019      void FLEX_INT3_IRQHandler(void) ALIAS(IntDefaultHandler);
00020      void FLEX_INT4_IRQHandler(void) ALIAS(IntDefaultHandler);
00021      void FLEX_INT5_IRQHandler(void) ALIAS(IntDefaultHandler);
00022      void FLEX_INT6_IRQHandler(void) ALIAS(IntDefaultHandler);
00023      void FLEX_INT7_IRQHandler(void) ALIAS(IntDefaultHandler);
00024      void GINT0_IRQHandler    (void) ALIAS(IntDefaultHandler);
00025      void GINT1_IRQHandler    (void) ALIAS(IntDefaultHandler);
00026      void SSP1_IRQHandler     (void) ALIAS(IntDefaultHandler);
00027      void I2C_IRQHandler      (void) ALIAS(IntDefaultHandler);
00028      void TIMER16_0_IRQHandler(void) ALIAS(IntDefaultHandler);
00029      void TIMER16_1_IRQHandler(void) ALIAS(IntDefaultHandler);
00030      void TIMER32_0_IRQHandler(void) ALIAS(IntDefaultHandler);
00031      void TIMER32_1_IRQHandler(void) ALIAS(IntDefaultHandler);
00032      void SSP0_IRQHandler     (void) ALIAS(IntDefaultHandler);
00033      void UART_IRQHandler     (void) ALIAS(IntDefaultHandler);
00034      void USB_IRQHandler      (void) ALIAS(IntDefaultHandler);
00035      void USB_FIQHandler      (void) ALIAS(IntDefaultHandler);
00036      void ADC_IRQHandler      (void) ALIAS(IntDefaultHandler);
00037      void WDT_IRQHandler      (void) ALIAS(IntDefaultHandler);
00038      void BOD_IRQHandler      (void) ALIAS(IntDefaultHandler);
00039      void FMC_IRQHandler      (void) ALIAS(IntDefaultHandler);
00040      void USBWakeup_IRQHandler(void) ALIAS(IntDefaultHandler);
00041 
00042 extern void __libc_init_array(void);
00043 extern int main(void);
00044 extern void _vStackTop(void);
00045 
00046 extern void (* const g_pfnVectors[])(void);
00047 __attribute__ ((section(".isr_vector")))
00048 void (* const g_pfnVectors[])(void) = {
00049     &_vStackTop,
00050     ResetISR,
00051     NMI_Handler,
00052     HardFault_Handler,
00053     0,
00054     0,
00055     0,
00056     0,
00057     0,
00058     0,
00059     0,
00060     SVCall_Handler,
00061     0,
00062     0,
00063     PendSV_Handler,
00064     SysTick_Handler,
00065     FLEX_INT0_IRQHandler,
00066     FLEX_INT1_IRQHandler,
00067     FLEX_INT2_IRQHandler,
00068     FLEX_INT3_IRQHandler,
00069     FLEX_INT4_IRQHandler,
00070     FLEX_INT5_IRQHandler,
00071     FLEX_INT6_IRQHandler,
00072     FLEX_INT7_IRQHandler,
00073     GINT0_IRQHandler,
00074     GINT1_IRQHandler,
00075     0,
00076     0,
00077     0,
00078     0,
00079     SSP1_IRQHandler,
00080     I2C_IRQHandler,
00081     TIMER16_0_IRQHandler,
00082     TIMER16_1_IRQHandler,
00083     TIMER32_0_IRQHandler,
00084     TIMER32_1_IRQHandler,
00085     SSP0_IRQHandler,
00086     UART_IRQHandler,
00087     USB_IRQHandler,
00088     USB_FIQHandler,
00089     ADC_IRQHandler,
00090     WDT_IRQHandler,
00091     BOD_IRQHandler,
00092     FMC_IRQHandler,
00093     0,
00094     0,
00095     USBWakeup_IRQHandler,
00096     0,
00097 };
00098 
00099 AFTER_VECTORS void data_init(unsigned int romstart, unsigned int start, unsigned int len) {
00100     unsigned int *pulDest = (unsigned int*) start;
00101     unsigned int *pulSrc = (unsigned int*) romstart;
00102     unsigned int loop;
00103     for (loop = 0; loop < len; loop = loop + 4) *pulDest++ = *pulSrc++;
00104 }
00105 
00106 AFTER_VECTORS void bss_init(unsigned int start, unsigned int len) {
00107     unsigned int *pulDest = (unsigned int*) start;
00108     unsigned int loop;
00109     for (loop = 0; loop < len; loop = loop + 4) *pulDest++ = 0;
00110 }
00111 
00112 extern unsigned int __data_section_table;
00113 extern unsigned int __data_section_table_end;
00114 extern unsigned int __bss_section_table_end;
00115 
00116 AFTER_VECTORS void ResetISR(void) {
00117     unsigned int LoadAddr, ExeAddr, SectionLen;
00118     unsigned int *SectionTableAddr;
00119     
00120     // Data Init
00121     SectionTableAddr = &__data_section_table;
00122     while (SectionTableAddr < &__data_section_table_end) {
00123         LoadAddr = *SectionTableAddr++;
00124         ExeAddr = *SectionTableAddr++;
00125         SectionLen = *SectionTableAddr++;
00126         data_init(LoadAddr, ExeAddr, SectionLen);
00127     }
00128     
00129     // BSS Init
00130     while (SectionTableAddr < &__bss_section_table_end) {
00131         ExeAddr = *SectionTableAddr++;
00132         SectionLen = *SectionTableAddr++;
00133         bss_init(ExeAddr, SectionLen);
00134     }
00135     
00136     SystemInit();
00137     __libc_init_array();
00138     main();
00139     while (1) {;}
00140 }
00141 
00142 AFTER_VECTORS void NMI_Handler      (void) {while(1){}}
00143 AFTER_VECTORS void HardFault_Handler(void) {while(1){}}
00144 AFTER_VECTORS void SVCall_Handler   (void) {while(1){}}
00145 AFTER_VECTORS void PendSV_Handler   (void) {while(1){}}
00146 AFTER_VECTORS void SysTick_Handler  (void) {while(1){}}
00147 AFTER_VECTORS void IntDefaultHandler(void) {while(1){}}
00148 
00149 #include <stdlib.h>
00150 
00151 void *operator new  (size_t size) {return malloc(size);}
00152 void *operator new[](size_t size) {return malloc(size);}
00153 
00154 void operator delete  (void *p) {free(p);}
00155 void operator delete[](void *p) {free(p);}
00156 
00157 int __aeabi_atexit(void *object, void (*destructor)(void *), void *dso_handle) {
00158     return 0;
00159 }
00160 
00161 }