Earlyprintk
earlyprintk是Linux内核调试函数,可用于跟踪在初始化常规控制台之前发生的内核问题。
Linux内核配置
为了启用Earlyprintk功能,Linux内核配置必须使用Linux内核Menuconfig工具(Menuconfig或如何配置内核)选中 CONFIG_DEBUG_LL,CONFIG_STM32MP1_DEBUG_UART和CONFIG_EARLY_PRINTK 这三个选项:
Symbol: DEBUG_LL
Location:
Kernel hacking --->
[*] Kernel low-level debugging functions
Symbol: STM32MP1_DEBUG_UART
Location:
Kernel hacking --->
[*] Kernel low-level debugging functions
(*) Use STM32MP1 UART for low-level debug
Symbol: EARLY_PRINTK
Location:
Kernel hacking --->
[*] Early printk
串口配置
启用Linux内核配置CONFIG_STM32MP1_DEBUG_UART时,它将配置要使用的UART寄存器的地址。
默认情况下,在STM32MP1板上,UART4用于Linux内核的控制台,并且在所有引导阶段都用于扩展。
如果新板上的UART端口不同,则必须应用以下更改:
更新CONFIG_DEBUG_UART_PHYS的值,以选择调试控制台的UART端口
Symbol: DEBUG_UART_PHYS [=0x40010000]
Location:
Kernel hacking --->
[*] Kernel low-level debugging port (Use STM32MP1 UART4 for low-level debug)
(0x40010000) Physical base address of debug UART
更新CONFIG_DEBUG_UART_VIRT的值,定义要使用的虚拟地址。
Symbol: DEBUG_UART_VIRT [=0xFE010000]
Location:
Kernel hacking --->
[*] Kernel low-level debugging port (Use STM32MP1 UART4 for low-level debug)
(0xFE010000) Virtual base address of debug UART
定义虚拟地址时应遵循以下规则:
-必须保留20个低权重位(在启用LPAE的情况下为21),以对齐1MB的区域大小(在LPAE中启用2MB)。
-必须将其映射到vmalloc区域的高位地址,以免被从低位地址开始声明的内核覆盖:即,这里我们选择0x FE0 xxxxx
CONFIG_DEBUG_UART_PHYS: 0x40010000 /* UART4 */
CONFIG_DEBUG_UART_VIRT: 0xFE010000
请在下表中找到STMP32MP1的USART/UART:
请注意,用于控制台的UART端口必须与引导链的所有组件对齐:FSBL(TF-A),SSBL-U-Boot)和Linux内核
尤其是因为Linux内核没有为UART端口配置所有设置寄存器,因为这是由SSBL完成的(U- Boot- 如何调试),
另请参见TF-A-如何为FSBL更改进行调试)
追踪
Earlyprintk跟踪会自动推送到前面定义的串行控制台,并且还会添加到内核环形日志缓冲区。