U-Boot串口初始化详解


目录

零、概述
一、init_baudrate
二、serial_init
三、console_init_f
四、devices_init
五、console_init_r
六、打印信息
七、为什么要使用devlist,std_device[]?

零、概述


上面这张图是U-Boot中串口设备驱动的流程,从寄存器级别的设置到最后终端信息的输出。下面我们详细讲解每一个步骤。

一、init_baudrate

该函数设置了gd->bd->bi_baudrate。

  1. static int init_baudrate (void)  
  2. {  
  3.     char tmp[64];   /* long enough for environment variables */  
  4.     int i = getenv_r ("baudrate", tmp, sizeof (tmp));  
  5.     gd->bd->bi_baudrate = gd->baudrate = (i > 0)  
  6.             ? (int) simple_strtoul (tmp, NULL, 10)  
  7.             : CONFIG_BAUDRATE;  
  8. //#define CONFIG_BAUDRATE   115200  定义在/include/configs/smdk2410.c中  
  9. //如果环境中没有保存,则使用宏定义的参数  
  10.     return (0);  
  11. }  

二、serial_init

UART控制器的初始化。

  1. void serial_setbrg (void)  
  2. {  
  3.     S3C24X0_UART * const uart = S3C24X0_GetBase_UART(UART_NR);  
  4.     int i;  
  5.     unsigned int reg = 0;  
  6.   
  7.     /* value is calculated so : (int)(PCLK/16./baudrate) -1 */  
  8.     reg = get_PCLK() / (16 * gd->baudrate) - 1;  
  9.   
  10.     /* FIFO enable, Tx/Rx FIFO clear */  
  11.     uart->UFCON = 0x07;  
  12.     uart->UMCON = 0x0;  
  13.     /* Normal,No parity,1 stop,8 bit */  
  14.     uart->ULCON = 0x3;  
  15.     /*  
  16.      * tx=level,rx=edge,disable timeout int.,enable rx error int.,  
  17.      * normal,interrupt or polling  
  18.      */  
  19.     uart->UCON = 0x245;  
  20.     uart->UBRDIV = reg;  
  21.   
  22. #ifdef CONFIG_HWFLOW  
  23.     uart->UMCON = 0x1; /* RTS up */  
  24. #endif  
  25.     for (i = 0; i < 100; i++);  
  26. }  
  27.   
  28. /*  
  29.  * Initialise the serial port with the given baudrate. The settings  
  30.  * are always 8 data bits, no parity, 1 stop bit, no start bits.  
  31.  *  
  32.  */  
  33. int serial_init (void)  
  34. {  
  35.     serial_setbrg ();//UART寄存器设置  
  36.   
  37.     return (0);  
  38. }  
  • 1
  • 2
  • 3
  • 下一页

相关内容