遵循我们上次的步骤,
1.将c/src/lib/libbsp/arm/csb337复制为 c/src/lib/libbsp/arm/at9260;
2.将c/src/lib/libcpu/arm/at91rm9200复制为c/src/lib/libcpu/arm/at91sam9260;
打开 c/src/libbsp/arm/at9260/start/start.S,修改如下:
/* * AT9260 Start * Bacon Xu */ /* Some standard definitions...*/ .equ PSR_MODE_USR, 0x10 .equ PSR_MODE_FIQ, 0x11 .equ PSR_MODE_IRQ, 0x12 .equ PSR_MODE_SVC, 0x13 .equ PSR_MODE_ABT, 0x17 .equ PSR_MODE_UNDEF, 0x1B .equ PSR_MODE_SYS, 0x1F .equ PSR_I, 0x80 .equ PSR_F, 0x40 .equ PSR_T, 0x20 .equ MMU_C1_M, 0x0001 .equ MMU_C1_I, 0x1000 .text .globl _start _start: /* * Since I don't plan to return to the bootloader, * I don't have to save the registers. * * I'll just set the CPSR for SVC mode, interrupts * off, and ARM instructions. */ mov r0, #(PSR_MODE_SVC | PSR_I | PSR_F) msr cpsr, r0 /* zero the bss */ ldr r1, =_bss_end_ ldr r0, =_bss_start_ _bss_init: mov r2, #0 cmp r0, r1 strlot r2, [r0], #4 blo _bss_init /* loop while r0 < r1 */ /* --- Initialize stack pointer registers */ /* Enter IRQ mode and set up the IRQ stack pointer */ mov r0, #(PSR_MODE_IRQ | PSR_I | PSR_F) /* No interrupts */ msr cpsr, r0 ldr r1, =_irq_stack_size ldr sp, =_irq_stack add sp, sp, r1 /* Enter FIQ mode and set up the FIQ stack pointer */ mov r0, #(PSR_MODE_FIQ | PSR_I | PSR_F) /* No interrupts */ msr cpsr, r0 ldr r1, =_fiq_stack_size ldr sp, =_fiq_stack add sp, sp, r1 /* Enter ABT mode and set up the ABT stack pointer */ mov r0, #(PSR_MODE_ABT | PSR_I | PSR_F) /* No interrupts */ msr cpsr, r0 ldr r1, =_abt_stack_size ldr sp, =_abt_stack add sp, sp, r1 /* Set up the SVC stack pointer last and stay in SVC mode */ mov r0, #(PSR_MODE_SVC | PSR_I | PSR_F) /* No interrupts */ msr cpsr, r0 ldr r1, =_svc_stack_size ldr sp, =_svc_stack add sp, sp, r1 sub sp, sp, #0x64 bl BOARD_RemapRam /*shut down mmu*/ MRC P15, 0, R0, C1, C0, 0 BIC R0, R0, #MMU_C1_M ORR R0, R0, #MMU_C1_I MCR P15, 0, R0, C1, C0, 0 /* * Initialize the exception vectors. This includes the * exceptions vectors (0x00000000-0x0000001c), and the * pointers to the exception handlers (0x00000020-0x0000003c). */ mov r0, #0 adr r1, vector_block ldmia r1!, {r2-r9} stmia r0!, {r2-r9} ldmia r1!, {r2-r9} stmia r0!, {r2-r9} /* Now we are prepared to start the BSP's C code */ bl boot_card /* * Theoretically, we could return to what started us up, * but we'd have to have saved the registers and stacks. * Instead, we'll just reset. */ bl bsp_reset /* We shouldn't get here. If we do, hang */ _hang: b _hang /* * This is the exception vector table and the pointers to * the functions that handle the exceptions. It's a total * of 16 words (64 bytes) */ vector_block: ldr pc, Reset_Handler ldr pc, Undefined_Handler ldr pc, SWI_Handler ldr pc, Prefetch_Handler ldr pc, Abort_Handler nop ldr pc, IRQ_Handler ldr pc, FIQ_Handler Reset_Handler: b bsp_reset Undefined_Handler: b Undefined_Handler SWI_Handler: b SWI_Handler Prefetch_Handler: b Prefetch_Handler Abort_Handler: b Abort_Handler nop IRQ_Handler: b IRQ_Handler FIQ_Handler: b FIQ_Handler .globl Reset_Handler .globl Undefined_Handler .globl SWI_Handler .globl Prefetch_Handler .globl Abort_Handler .globl IRQ_Handler .globl FIQ_Handler
这段代码删除了原来的:
ldr r0, =mem_map bl mmu_init
并替换为:
bl BOARD_RemapRam /*shut down mmu*/ MRC P15, 0, R0, C1, C0, 0 BIC R0, R0, #MMU_C1_M ORR R0, R0, #MMU_C1_I MCR P15, 0, R0, C1, C0, 0
由于RTEMS不使用MMU,通常的做法把虚拟地址和实际地址做成一样的,但是CPU还是要对地址做映射。为了增加速度,干脆把MMU关闭掉,也不需要初始化了。
至于对 BOARD_RemapRam 函数的调用,是将AT91SAM9260的内部RAM映射成从0x0的地址开始,为安装异常向量做准备。
void BOARD_RemapRam(void) { AT91C_BASE_MATRIX->MATRIX_MRCR = AT91C_MATRIX_RCA926I | AT91C_MATRIX_RCA926D; }
其他的代码与CSB337无任何差异。