GNU ARM汇编--(十五)linux下的printascii
这篇blog只是分析解决这个问题的第一步:
本文引用地址://m.amcfsurvey.com/article/201611/321716.htm既然"Uncompressing Linux..."这句打印是kernel代码中的,那kernel的其他打印怎么没有?
在archarmootcompressed目录下的misc.c中,上面的打印是在decompress_kernel函数中,而该函数是在kernel的初始汇编中调用的,也就是说这个时候kernel的串口驱动肯定是没有工作的,那这里的串口输出只能是用bootloader初始化好的串口,
putstr("Uncompressing Linux...");
putstr(" done, booting the kernel.");
-
staticvoidputstr(constchar*ptr) - {
- charc;
- while((c=*ptr++)!= ){
- if(c==)
- putc();
- putc(c);
- }
- flush();
- }
在includeasm-armplat-s3uncompress.h中,有putc函数的定义:
-
staticvoidputc(intch) - {
- if(uart_rd(S3C2410_UFCON)&S3C2410_UFCON_FIFOMODE){
- intlevel;
- while(1){
- level=uart_rd(S3C2410_UFSTAT);
- level&=fifo_mask;
- if(level
- break;
- }
- }else{
- /*notusingfifos*/
- while((uart_rd(S3C2410_UTRSTAT)&S3C2410_UTRSTAT_TXE)!=S3C2410_UTRSTAT_TXE)
- barrier();
- }
- /*writebytetotransmissionregister*/
- uart_wr(S3C2410_UTXH,ch);
- }
既然明白了这两句打印为什么可以输出后,就要排查后续没有打印的原因了,这里我们就利用printascii函数来debug,我们知道kernel的printf函数是printk,在printk函数内部添加printascii函数,make menuconfig中选中:
Kernel hacking下的[*] Kernel low-level debugging functions下的[*] Kernel low-level debugging messages via S3C UART,并选择(0) S3C UART to use for low-level debug
Device Drivers -->Character devices-->Serial drivers--><*> Samsung S3C2410/S3C2440/S3C2442/S3C2412 Serial port support和[*] Support for console on S3C2410 serial port
printk函数修改如下:
评论