项目最新更新,可以查看码仓 https://gitee.com/liangzili/harmony-raspberry
1、切换启动模式
树莓派默认启动在HYP模式,我们需要在内核启动前改为SVC模式
kernel\liteos_a\arch\arm\arm\src\startup\reset_vector_up.S 在115行左右,reset_vector:下面添加
mrs r0,cpsr //读取CPU模式寄存器
bic r0,r0,#0x1F //清除CPU模式位(如果处于催眠模式,它将是1A)保留所有其他
orr r0,r0,#0x13 //设置CPU_MODE为SVC_MODE (0x13),而ORR仍然保留所有其他位
msr spsr_cxsf,r0 //将其写入spsr_cxsf寄存器,以便在调用交换机时加载该寄存器。
addr0,pc,#4 //从pc计算要进入SVC_MODE的地址(后面的两个操作码很长)
msr ELR_hyp,r0 //将地址值写入ELR_hyp寄存器
eret //执行了回车指令
2、修改串口驱动
2.1、为了方便调试,先设置一个字符打印函数
kernel\liteos_a\platform\uart\amba_pl011\amba_pl011.c在46行左右处添加下面的代码,uart_putc_phy使用物理地址打印字符,uart_putc_virt使用虚拟地址打印。当内核代码启动MMU之后,需用使用uart_putc_virt来打印字符。
/*---------自定义函数----------*/
#define RPI_BASE_UART_REGISTER (0x3f201000) //HI3516:0x120A0000 rpi2:0x3F201000
#define AMBA_UART_DR (*(volatile unsigned char*)(RPI_BASE_UART_REGISTER + 0x00))
#define AMBA_UART_FR (*(volatile unsigned char*)(RPI_BASE_UART_REGISTER + 0x18))
#define RPI_BASE_UART_REGISTER1 IO_DEVICE_ADDR(0x3F201000) //HI3516:0x120A0000 rpi2:0x3F201000
#define AMBA_UART_DR1 (*(volatile unsigned char*)(RPI_BASE_UART_REGISTER1 + 0x00))
#define AMBA_UART_FR1 (*(volatile unsigned char*)(RPI_BASE_UART_REGISTER1 + 0x18))
/*---------------------------*/
void uart_putc_phy(unsigned charc)
{
//UART_Type *uartRegs = (UART_Type *)UART4_REG_PBASE;
//while ((uartRegs->USART_ISR & (1<<5)) == 0);
//uartRegs->USART_TDR = c;
while (AMBA_UART_FR & (1 <
AMBA_UART_DR = c;
}
void uart_putc_virt(unsigned charc)
{
//UART_Type *uartRegs = (UART_Type *)UART_REG_BASE;
//while ((uartRegs->USART_ISR & (1<<5)) == 0);
//uartRegs->USART_TDR = c;
while (AMBA_UART_FR1 & (1 <
AMBA_UART_DR1 = c;
}
例如:kernel\liteos_a\arch\arm\arm\src\startup\reset_vector_up.S
ldr sp, =0x0