OK6410A 开发板 (五) 1 OK6410A u-boot-2021.01 LCD RGB接口

u-boot 中的lcd驱动是 在 u-boot lcd驱动框架下的 lcd驱动,包括
	lcd 框架
	lcd 驱动
代码在
	https://github.com/lisider/u-boot/tree/ok6410a
	提交id: 54c4f9e1ec8017d51234e5909ca39662a257632d
  • 总体概览
初始化的时候 drv_lcd_init 
    1. 调用 s3cfb 提供的接口函数 做 硬件初始化
    2. 将 panel_info 的信息放到 cons 全局变量中
使用的时候 printf
    1. 调用 cons 的 函数 处理 cons 的 成员变量 将 字符打印到屏幕上 // 本质上是写内存地址

lcd 框架

  • 什么时候开始着手初始化lcd
init_sequence_f
    reserve_video
        /* reserve memory for LCD display (always full pages) */                         
        gd->relocaddr = lcd_setmem(gd->relocaddr);                                       
        gd->fb_base = gd->relocaddr;
        
static init_fnc_t init_sequence_r[] = {
    
                 // common/board_r.c
    stdio_init_tables,  745                            // common/stdio.c
    stdio_add_devices,  822                            // common/stdio.c
    console_init_r,   827                              // common/console.c
    initr_net,        871                              // common/board_r.c
}

    static struct console_t cons;                   // common/lcd_console.c

    stdio_add_devices                               // common/stdio.c
        drv_lcd_init                                // common/lcd.c
            lcd_init                                // common/lcd.c
                lcd_ctrl_init // s3c_fb_init        // arch/arm/mach-s3c64xx/include/mach/lcd.h // drivers/video/s3c_fb.c
                lcd_get_size                        // common/lcd.c
                    panel_info.vl_col               // drivers/video/s3c_fb.c
                lcd_clear                           // common/lcd.c
                    lcd_setcolreg                   // drivers/video/s3c_fb.c
                    lcd_init_console                // common/lcd_console.c
                        cons.fbbase = address;      // addr 来自于 panel_info(drivers/video/s3c_fb.c)
                lcd_enable                          // drivers/video/s3c_fb.c
                lcd_set_col(填充cons)               // common/lcd_console.c
                lcd_set_row(填充cons)               // common/lcd_console.c
                
            lcddev.puts  = lcd_stub_puts;           // common/lcd.c
            stdio_register(&lcddev);                // common/stdio.c
    console_init_r                                  // common/console.c
        gd->flags |= GD_FLG_DEVINIT;                // 该句之后就代表 初始化完成,下一句就可以使用printf 打印到屏上
        
    
实际上ok6410a uboot-2021.01 在屏上打印的第一句 是 Net: Net  Initialization  Skipped 
	
  • lcd console 打印流程
printf                                              // lib/vsprintf.c
    puts                                            // common/console.c
        fputs                                       // common/console.c
            static void console_puts                // common/console.c
                dev = console_devices[file][i];     // common/console.c
                dev->puts(dev, s); // lcd_stub_puts // common/lcd.c

lcd_stub_puts                                       // common/lcd.c
    lcd_puts                                        // common/lcd_console.c
        lcd_putc                                    // common/lcd_console.c
            cons.fp_putc_xy // lcd_putc_xy0         // common/lcd_console.c         // cons.fp_putc_xy(&cons, cons.curr_col * VIDEO_FONT_WIDTH, cons.curr_row * VIDEO_FONT_HEIGHT, c);
            console_newline                         // common/lcd_console.c


lcd_putc_xy0                                        // common/lcd_console.c
    fbptr_t *dst = (fbptr_t *)pcons->fbbase + y * pcons->lcdsizex + x; // pcons 就是 static struct console_t cons;
    *dst++ = (bits & 0x80) ? fg_color : bg_color;
    

驱动

  • 框架给驱动准备的接口(驱动的出口函数和出口变量)
驱动给框架提供的接口
A 函数
lcd_enable
lcd_ctrl_init // s3c_fb_init
lcd_setcolreg
B 变量
vidinfo_t panel_info

  • 出口函数被调用流程
    stdio_add_devices                               // common/stdio.c
        drv_lcd_init                                // common/lcd.c
            lcd_init                                // common/lcd.c
                lcd_ctrl_init // s3c_fb_init        // arch/arm/mach-s3c64xx/include/mach/lcd.h // drivers/video/s3c_fb.c ------------
                lcd_get_size                        // common/lcd.c
                    panel_info.vl_col               // drivers/video/s3c_fb.c                                       ------
                lcd_clear                           // common/lcd.c
                    lcd_setcolreg                   // drivers/video/s3c_fb.c                                   ----------------
                    lcd_init_console                // common/lcd_console.c
                        cons.fbbase = address;      // addr 来自于 panel_info(drivers/video/s3c_fb.c)                      ----
                lcd_enable                          // drivers/video/s3c_fb.c                               ------------
                lcd_set_col(填充cons)               // common/lcd_console.c
                lcd_set_row(填充cons)               // common/lcd_console.c
                
            lcddev.puts  = lcd_stub_puts;           // common/lcd.c
            stdio_register(&lcddev);                // common/stdio.c
  • 驱动中对寄存器的赋值
寄存器写入的值主要在这个文件中
arch/arm/mach-s3c64xx/include/mach/lcd.h
LCD CONFIG START
GPECON
0x0
GPEDAT
0x3
GPFCON
0x20000000
GPFDAT
0x4000
GPICON
0xaaaaaaaa
GPJCON
0xaaaaaa
MIFPCON
0x0
SPCON
0xbfcd1501
VIDCON0
0x617
VIDCON1
0x9bc060
VIDTCON0
0x10109
VIDTCON1
0x10128
VIDTCON2
0x879df
WINCON0
0x2d
VIDOSD0A
0x0
VIDOSD0B
0xef90f
VIDOSD0C
0x1fe00
VIDW00ADD0B0
0x5ff70000
VIDW00ADD1B0
0xfef800
VIDW00ADD2
0x780
LCD CONFIG END

猜你喜欢

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