]> wirehaze git hosting - stm32f411ceu6.git/blobdiff - kernel.c

wirehaze git hosting

faultmask, kentry ()
[stm32f411ceu6.git] / kernel.c
index dc4c1349e9e7105e1d363e493ecf4507f5a5144d..1545c6e857f48b2c0bd12d70eca5919c200a490c 100644 (file)
--- a/kernel.c
+++ b/kernel.c
@@ -1,37 +1,42 @@
 #include "link.h"
 #include "stm32f411.h"
 
 #include "link.h"
 #include "stm32f411.h"
 
-static const char *text[] = {
-  "hello, friend.\r\n",
-  "hello, friend?\r\n",
-  "that's lame.\r\n",
-  "maybe i should give you a name.\r\n",
-  "but that's a slippery slope.\r\n",
-  "you're only in my head.\r\n",
-  "we have to remember that.\r\n",
-  "shit.\r\n",
-  "it's actually happening, i'm talking to an imaginary person.\r\n\n"
-};
+__attribute__ ((noreturn)) extern void kentry (void);
 
 static void
 reset_handler (void)
 {
   unsigned int *src, *dst;
 
 static void
 reset_handler (void)
 {
   unsigned int *src, *dst;
-  unsigned int line, off;
 
 
-  /* Relocate .data section to SRAM  */
+  /* Set FAULTMASK  */
+  asm ("cpsid f");
+
+  /*  Initialize .data and .bss in SRAM  ------------------------------------  */
+
+  /* Relocate .data section  */
   src = &_data_lma_start;
   dst = &_data_vma_start;
 
   while (dst < &_data_vma_end)
     *(dst++) = *(src++);
 
   src = &_data_lma_start;
   dst = &_data_vma_start;
 
   while (dst < &_data_vma_end)
     *(dst++) = *(src++);
 
-  /* Initialize .bss section  */
+  /* Initialize .bss  */
   dst = &_bss_vma_start;
 
   while (dst < &_bss_vma_end)
     *(dst++) = 0;
 
   dst = &_bss_vma_start;
 
   while (dst < &_bss_vma_end)
     *(dst++) = 0;
 
+  /*  LED setup  ------------------------------------------------------------  */
+
+  /* GPIOCEN: IO port C clock enable  */
+  *RCC_AHB1ENR |= (1u << 2); /* 1: IO port C clock enabled  */
+  /* MODERy[1:0]: Port x configuration bits (y = 0..15)  */
+  *GPIOC_MODER &= ~(0b11u << 26); /* Clear PC13 bits  */
+  *GPIOC_MODER |= (1u << 26); /* 01: General purpose output mode  */
+
+  /* PC13: 0 = LED on
+   *       1 = LED off  */
+
   /*  SYSCLK setup  ---------------------------------------------------------  */
 
   /* HSEBYP: HSE clock bypass  */
   /*  SYSCLK setup  ---------------------------------------------------------  */
 
   /* HSEBYP: HSE clock bypass  */
@@ -80,43 +85,12 @@ reset_handler (void)
   /* TE: Transmitter enable  */
   *USART1_CR1 |= (1u << 3); /* 1: Transmitter is enabled  */
 
   /* TE: Transmitter enable  */
   *USART1_CR1 |= (1u << 3); /* 1: Transmitter is enabled  */
 
-  /*  LED setup  ------------------------------------------------------------  */
+  /*  Jump to kernel entry code  --------------------------------------------  */
 
 
-  /* GPIOCEN: IO port C clock enable  */
-  *RCC_AHB1ENR |= (1u << 2); /* 1: IO port C clock enabled  */
-  /* MODERy[1:0]: Port x configuration bits (y = 0..15)  */
-  *GPIOC_MODER &= ~(0b11u << 26); /* Clear PC13 bits  */
-  *GPIOC_MODER |= (1u << 26); /* 01: General purpose output mode  */
-
-  /* PC13: 0 = LED on
-   *       1 = LED off  */
+  /* Clear FAULTMASK  */
+  asm ("cpsie f");
 
 
-  /*  Test UART and LED  ----------------------------------------------------  */
-
-  while (1)
-    {
-      for (line = 0; line < sizeof text / sizeof *text; ++line)
-        {
-          /* Print current line  */
-          off = 0;
-          while (text[line][off])
-            {
-              /* TXE: Transmit data register empty  */
-              while (!(*USART1_SR & (1u << 7))); /* 0: Data is not transferred
-                                                    to the shift register  */
-
-              /* DR[8:0]: Data value  */
-              *USART1_DR = text[line][off++];
-            }
-
-          /* TC: Transmission complete  */
-          while (!(*USART1_SR & (1u << 6))); /* 0: Transmission is not
-                                                complete  */
-
-          /* Blink LED  */
-          *GPIOC_ODR ^= (1u << 13);
-        }
-    }
+  kentry ();
 }
 
 __attribute__ ((section (".vector_table"), used))
 }
 
 __attribute__ ((section (".vector_table"), used))