1616#include "drv_timer.h"
1717
1818#include "cp15.h"
19+ #include "mmu.h"
1920
2021#ifdef RT_USING_SMP
2122extern void rt_hw_ipi_handler_install (int ipi_vector , rt_isr_handler_t ipi_isr_handler );
@@ -57,156 +58,17 @@ void idle_wfi(void)
5758 asm volatile ("wfi" );
5859}
5960
60- #define MMU_LEVEL_MASK 0x1ffUL
61- #define MMU_MAP_ERROR_VANOTALIGN -1
62- #define MMU_MAP_ERROR_PANOTALIGN -2
63- #define MMU_MAP_ERROR_NOPAGE -3
64- #define MMU_MAP_ERROR_CONFLICT -4
65-
66- unsigned char main_tbl [4096 ] __attribute__((aligned (4096 )));
67- unsigned char __page_start [4096 * 100 ] __attribute__((aligned (4096 )));
68- unsigned long __page_off = 0 ;
69- unsigned long get_free_page (void ) {
70- __page_off += 4096 ;
71- return (unsigned long )(__page_start + __page_off - 4096 );
72- }
73-
74- #define MEM_ATTR_MEM ((0x1UL << 10) | (0x2UL << 8) | (0x0UL << 6) | (0x1UL << 2))
75- #define MEM_ATTR_IO ((0x1UL << 10) | (0x2UL << 8) | (0x0UL << 6) | (0x2UL << 2))
76-
77- static int map_single_page_2M (unsigned long * lv0_tbl , unsigned long va , unsigned long pa , unsigned long attr ) {
78- int level ;
79- unsigned long * cur_lv_tbl = lv0_tbl ;
80- unsigned long page ;
81- unsigned long off ;
82- int level_shift = 39 ;
83-
84- if (va & (0x200000UL - 1 )) {
85- return MMU_MAP_ERROR_VANOTALIGN ;
86- }
87- if (pa & (0x200000UL - 1 )) {
88- return MMU_MAP_ERROR_PANOTALIGN ;
89- }
90- for (level = 0 ; level < 2 ; level ++ ) {
91- off = (va >> level_shift );
92- off &= MMU_LEVEL_MASK ;
93- if ((cur_lv_tbl [off ] & 1 ) == 0 ) {
94- page = get_free_page ();
95- if (!page ) {
96- return MMU_MAP_ERROR_NOPAGE ;
97- }
98- rt_memset ((void * )page , 0 , 4096 );
99- cur_lv_tbl [off ] = page | 0x3UL ;
100- }
101- page = cur_lv_tbl [off ];
102- if (!(page & 0x2 )) {
103- //is block! error!
104- return MMU_MAP_ERROR_CONFLICT ;
105- }
106- cur_lv_tbl = (unsigned long * )(page & 0x0000fffffffff000UL );
107- level_shift -= 9 ;
108- }
109- attr &= 0xfff0000000000ffcUL ;
110- pa |= (attr | 0x1UL ); //block
111- off = (va >> 21 );
112- off &= MMU_LEVEL_MASK ;
113- cur_lv_tbl [off ] = pa ;
114- return 0 ;
115- }
116-
117- int armv8_map_2M (unsigned long * lv0_tbl , unsigned long va , unsigned long pa , int count , unsigned long attr )
118- {
119- int i ;
120- int ret ;
121-
122- if (va & (0x200000 - 1 ))
123- {
124- return -1 ;
125- }
126- if (pa & (0x200000 - 1 ))
127- {
128- return -1 ;
129- }
130- for (i = 0 ; i < count ; i ++ )
131- {
132- ret = map_single_page_2M (lv0_tbl , va , pa , attr );
133- va += 0x200000 ;
134- pa += 0x200000 ;
135- if (ret != 0 )
136- {
137- return ret ;
138- }
139- }
140- return 0 ;
141- }
142-
14361/**
14462 * Initialize the Hardware related stuffs. Called from rtthread_startup()
14563 * after interrupt disabled.
14664 */
14765void rt_hw_board_init (void )
14866{
149- /* mmu set */
150- unsigned long val64 ;
151- unsigned long val32 ; //val32不是uint32_t,val32只是表示相关的那个寄存器是32位的
152- int ret ;
153-
154- val64 = 0x007f6eUL ;
155- asm volatile ("msr MAIR_EL1, %0\n dsb sy\n" ::"r" (val64 ));
156- asm volatile ("mrs %0, MAIR_EL1\n dsb sy\n" :"=r" (val64 ));
157-
158- //TCR_EL1
159- val32 = (16UL << 0 )
160- | (0x0UL << 6 )
161- | (0x0UL << 7 )
162- | (0x3UL << 8 )
163- | (0x3UL << 10 )
164- | (0x2UL << 12 )
165- | (0x0UL << 14 )
166- | (0x0UL << 16 )
167- | (0x0UL << 22 )
168- | (0x1UL << 23 )
169- | (0x2UL << 30 )
170- | (0x1UL << 32 )
171- | (0x0UL << 35 )
172- | (0x0UL << 36 )
173- | (0x0UL << 37 )
174- | (0x0UL << 38 );
175- asm volatile ("msr TCR_EL1, %0\n" ::"r" (val32 ));
176- asm volatile ("mrs %0, TCR_EL1\n" :"=r" (val32 ));
177-
178- asm volatile ("msr TTBR0_EL1, %0\n dsb sy\n" ::"r" (main_tbl ));
179- asm volatile ("mrs %0, TTBR0_EL1\n dsb sy\n" :"=r" (val64 ));
180-
181- rt_memset (main_tbl , 0 , 4096 );
182-
183- ret = armv8_map_2M ((unsigned long * )main_tbl , 0x0 , 0x0 , 32 , MEM_ATTR_MEM ); //32*2M = 64M
184- if (ret )
185- {
186- goto skip_mmu ;
187- }
188- ret = armv8_map_2M ((unsigned long * )main_tbl , 0x3f000000 , 0x3f000000 , 8 , MEM_ATTR_IO ); //8*2M = 16M
189- if (ret )
190- {
191- goto skip_mmu ;
192- }
193-
194- //关闭指令cache
195- __asm__ volatile ("mrs %0, SCTLR_EL1\n" :"=r" (val64 ));
196- val64 &= ~0x1000 ; //disable I
197- __asm__ volatile ("dmb sy\n msr SCTLR_EL1, %0\n isb sy\n" ::"r" (val64 ));
198-
199- //清除指令cache
200- __asm__ volatile ("IC IALLUIS\n dsb sy\n isb sy\n" );
201- //清除tlb
202- __asm__ volatile ("tlbi vmalle1\n dsb sy\n isb sy\n" );
203-
204- //SCTLR_EL1, turn on mmu
205- asm volatile ("mrs %0, SCTLR_EL1\n" :"=r" (val32 ));
206- val32 |= 0x1005 ; //enable mmu, I C M
207- asm volatile ("dmb sy\n msr SCTLR_EL1, %0\nisb sy\n" ::"r" (val32 ));
208-
209- skip_mmu :
67+ mmu_init ();
68+ armv8_map (0 , 0 , 0x800000 , MEM_ATTR_MEMORY );
69+ armv8_map (0x3f00B000 , 0x3f00B000 , 0x1000 , MEM_ATTR_IO );//timer
70+ armv8_map (0x3f200000 , 0x3f200000 , 0x16000 , MEM_ATTR_IO );//uart
71+ mmu_enable ();
21072
21173 /* initialize hardware interrupt */
21274 rt_hw_interrupt_init (); // in libcpu/interrupt.c. Set some data structures, no operation on device
@@ -232,7 +94,7 @@ void rt_hw_board_init(void)
23294#ifdef RT_USING_COMPONENTS_INIT
23395 rt_components_board_init ();
23496#endif
235- rt_kprintf ( "__page_off = %x\n" , __page_off );
97+
23698}
23799
238100#ifdef RT_USING_SMP
0 commit comments