新闻中心

EEPW首页>嵌入式系统>设计应用> GNU ARM汇编--(十五)linux下的printascii

GNU ARM汇编--(十五)linux下的printascii

作者: 时间:2016-11-26 来源:网络 收藏
在前面对很多s3c2440的功能模块进行学习后,已经具备了将这些模块综合起来的条件,基于此,将前面的代码综合成一个简单的bootloader.自己写的bootloader在引导kernel的时候,串口输出只有Uncompressing Linux...和done, booting the kernel。串口有这个输出,说明kernel被正确引导了,但是串口有问题。

这篇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.");

[html]view plaincopy
  1. staticvoidputstr(constchar*ptr)
  2. {
  3. charc;
  4. while((c=*ptr++)!=){
  5. if(c==)
  6. putc();
  7. putc(c);
  8. }
  9. flush();
  10. }

在includeasm-armplat-s3uncompress.h中,有putc函数的定义:

[html]view plaincopy
  1. staticvoidputc(intch)
  2. {
  3. if(uart_rd(S3C2410_UFCON)&S3C2410_UFCON_FIFOMODE){
  4. intlevel;
  5. while(1){
  6. level=uart_rd(S3C2410_UFSTAT);
  7. level&=fifo_mask;
  8. if(level
  9. break;
  10. }
  11. }else{
  12. /*notusingfifos*/
  13. while((uart_rd(S3C2410_UTRSTAT)&S3C2410_UTRSTAT_TXE)!=S3C2410_UTRSTAT_TXE)
  14. barrier();
  15. }
  16. /*writebytetotransmissionregister*/
  17. uart_wr(S3C2410_UTXH,ch);
  18. }
从这里可以看到,这里的输出的确是利用了bootloader中对串口的初始化,但是这部分代码还是通用的:不管在bootloader中将串口初始化为用fifo还是非fifo的,这一小块代码都是可以正常串口输出的。

既然明白了这两句打印为什么可以输出后,就要排查后续没有打印的原因了,这里我们就利用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函数修改如下:


上一页 1 2 下一页

评论


技术专区

关闭