fe544ee84a2073b63370b95693165df7c5a263e9
[cortex-from-scratch] / sysinfo.c
1 #include <stdbool.h>
2 #include <stddef.h>
3 #include <stdint.h>
4 #include <stm32.h>
5 #include <mmap.h>
6
7 #define MEM_SIZE        0x00010000 
8 #define MEM_OFFSET      0x20000000
9
10 uint32_t get_msp(void);
11
12 void sysinfo() {
13
14         uint32_t tmp = *MCU_ID;
15         cputs("# ROBSYS 0.1 LOADING...\n");
16         cputs("# DEVICE ID: ");
17
18         if (tmp & 0x414) 
19                 cputs("HIGH DENSITY\n");
20         else {
21                 cputs("UNKNOWN\n");
22         }
23
24         tmp = (tmp >> 16);
25         uart_puts("# REVISION: ");
26         switch  (tmp) {
27                 case 0x1000:
28                       cputs("REVISION A\n");
29                       break;
30                 case 0x1001:
31                       cputs("REVISION Z\n");
32                       break;
33                 case 0x1003:
34                       cputs("REVISION 1/2/3/X/Y\n");
35                       break;
36                 default:
37                       cputs("UNKNOWN\n");
38         }
39
40         extern char _endofbss;
41         
42         uint32_t current_stack = get_msp();
43         uint32_t stack_usage = (MEM_OFFSET + MEM_SIZE) - current_stack;
44         uint32_t data_bss = &_endofbss - MEM_OFFSET;
45         uint32_t mem_free = MEM_SIZE - stack_usage - data_bss;
46
47         cputs("# TOTAL MEMORY: ");
48         addrtohex(MEM_SIZE);
49         cputchar('\n');
50         cputs("# FREE MEMORY: ");
51         addrtohex(mem_free);
52         cputchar('\n');
53         cputs("# STACK USAGE: ");
54         addrtohex(stack_usage);
55         cputchar('\n');
56
57 }
58
59 /* Get the master stack pointer's position
60  * Here we use a so-called naked function, 
61  * that doesn't automatically push and pop  */
62
63 uint32_t get_msp(void) __attribute__( ( naked ) );
64 uint32_t get_msp(void)
65 {
66   uint32_t msp = 0;
67   __asm__ volatile ("mrs %0, msp\n\t" 
68                   "mov r0, %0 \n\t"
69                   "bx lr     \n\t"  : "=r" (msp) );
70   return(msp);
71 }