OK6410A 开发板 (三) 17 u-boot-2021.01 boot 解析 U-boot 镜像运行部分 串口

u-boot 阶段
	lowlevel_init 调用了以下函数 实现了 putc ,但不支持 printf
		spl_config_uart_baudrate
		uart_asm_init
		asm_putc
		
	board_init_f  调用了以下函数,完成后,支持printf
		initf_dm 
		init_baud_rate // 查找 环境变量 baudrate
			gd->baudrate = env_get_ulong("baudrate", 10, 115200);
		serial_init // 重新设置了一下波特率
			serial_find_console_or_panic
			gd->flags |= GD_FLG_SERIAL_READY;
			serial_setbrg
		console_init_f // 该函数执行完后printf 可用了
			gd->have_console = 1;
			console_update_silent
			print_pre_console_buffer
	board_init_r 调用了以下函数,增加了什么支持?
		initr_dm
		stdio_init_tables
			INIT_LIST_HEAD(&devs.list);
		serial_initialize
			serial_init
				serial_find_console_or_panic
				gd->flags |= GD_FLG_SERIAL_READY;
				serial_setbrg
		stdio_add_devices
			drv_system_init
				struct stdio_dev dev;

				memset (&dev, 0, sizeof (dev));

				strcpy (dev.name, "serial");
				dev.flags = 0x00000002 | 0x00000001;
				dev.putc = stdio_serial_putc;
				dev.puts = stdio_serial_puts;
				dev.getc = stdio_serial_getc;
				dev.tstc = stdio_serial_tstc;
				stdio_register (&dev);
			serial_stdio_init
				// null
		console_init_r
			struct stdio_dev *inputdev = 0;
			struct stdio_dev *outputdev = 0;
			struct list_head *list = stdio_get_list();
			struct list_head *pos;
			struct stdio_dev *dev;
			int flushpoint;
			if (console_update_silent())
				flushpoint = 0;
			else
				flushpoint = 1;
			
			for (pos = (list)->next; prefetch(pos->next), pos != (list); pos = pos->next) {
    
    
				dev = ({
    
     const typeof( ((struct stdio_dev *)0)->list ) *__mptr = (pos); (struct stdio_dev *)( (char *)__mptr -        __builtin_offsetof (struct stdio_dev, list) );});

				if ((dev->flags & 0x00000001) && (inputdev == 0)
					inputdev = dev;
				if ((dev->flags & 0x00000002) && (outputdev ==0)
					outputdev = dev;
			}
			console_setfile(1, outputdev);
			console_setfile(2, outputdev);
			console_setfile(0, inputdev);
			stdio_print_current_devices

			for (i = 0; i < 3; i++) {
    
    
				env_set(stdio_names[i], stdio_devices[i]->name);
			}

			gd->flags |= GD_FLG_DEVINIT;
			print_pre_console_buffer(flushpoint);

猜你喜欢

转载自blog.csdn.net/u011011827/article/details/115265124