歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

詳解U-Boot中printf函數的實現

一、printf函數調用關系

U-Boot源代碼下載地址 http://www.linuxidc.com/Linux/2011-07/38897.htm


1.1fputc和srial_putc的關系

  1. /*  
  2.  * Output a single byte to the serial port.  
  3.  */  
  4. void serial_putc (const char c)//發送數據  
  5. {  
  6.     S3C24X0_UART * const uart = S3C24X0_GetBase_UART(UART_NR);  
  7. #ifdef CONFIG_MODEM_SUPPORT  
  8.     if (be_quiet)  
  9.         return;  
  10. #endif  
  11.   
  12.     /* wait for room in the tx FIFO */  
  13.     while (!(uart->UTRSTAT & 0x2));  
  14.   
  15. #ifdef CONFIG_HWFLOW  
  16.     /* Wait for CTS up */  
  17.     while(hwflow && !(uart->UMSTAT & 0x1))  
  18.         ;  
  19. #endif  
  20.   
  21.     uart->UTXH = c;  
  22.   
  23.     /* If \n, also do \r */  
  24.     if (c == '\n')  
  25.         serial_putc ('\r');  
  26. }  
serial_putc函數是直接和控制相關的,通過UTXH寄存器發送數據。
  1. void fputc (int file, const char c)  
  2. {  
  3.     if (file < MAX_FILES)  
  4.         stdio_devices[file]->putc (c);  
  5. }  

這是在console_init_r中設置stdio_devices[]後才有的,其他的是類似的。

1.2putc和fputc的關系

  1. void putc (const char c)  
  2. {  
  3. #ifdef CONFIG_SILENT_CONSOLE  
  4.     if (gd->flags & GD_FLG_SILENT)  
  5.         return;  
  6. #endif  
  7.   
  8.     if (gd->flags & GD_FLG_DEVINIT) {  
  9.         /* Send to the standard output */  
  10.         fputc (stdout, c);  
  11.     } else {  
  12.         /* Send directly to the handler */  
  13.         serial_putc (c);  
  14.     }  
  15. }  

這是console_init_r中設置gd->flags & GD_FLG_DEVINIT,也就是串口設備完全初始化之後才有這種關系,其他的函數是類似的。

Copyright © Linux教程網 All Rights Reserved