7862之uboot-lcd的流程及移植

在开机的时候首先进行板级的初始化(U-boot/arch/arm/lib/board.c),现在flash中跑board_init_f(),划分一部分Mermory用来跑U-BOOT,划定范围之外的Mermory在U-boot的时候是不能被操作的。同时预留给malloc() arena、U-Boot code, data & bss、VFD display、LCDdisplay、TLB table、PRam、logBuffer等空间。

接下来走到RAM中的board_init_r(),建立片选、初始化串口、初始化NAND、MMC、flash,然后到do_cboot(NULL, 0, 1, NULL); // 进入启动函数,接着调用

  • board_boot_mode_regist(boot_mode_array)
  • 然后到boot_mode_array 选择模式,启动进入正常的模式:uis7862s_1h10_normal_mode();
  • vlx_nand_boot
  • drv_lcd_init 对lcd进行一个常规的初始化
  •  lcd_init 调用 lcd_ctrl_init 来完成lcd的初始化,另一方面通过lcd_clear()来完成控制输出的backcolor和frontcolor,并且将LOGO解压并放入Buffer
  •  lcd_ctrl_init 初始化lcd
    • sprdfb_probe 提供LCD具体驱动的入口
    • sprd_panel_probe 以数组的形式轮询每款屏read_id的值,也就是读取MIPI屏寄存器里的id值,读取成功返回0,也就是找到该款屏幕驱动,然后初始化,没找到就继续轮询,直到找到或者最后没找到会设置一个默认加载屏幕的驱动。
  • lcd_splash(LOGO_PART) 刷logo
  • set_backlight(backlight_set) 亮背光

uboot移植:

  • 首先到 bsp/bootloader/u-boot/drivers/video/sprd/lcd/ 目录下复制一份之前移植过的lcd屏驱动:lcd_xxx_video.c。
    • 修改 lcd_xxx_video.c里面的 init_data[] 初始化命令 
    • 修改lcd驱动名panel_driver xxx_mipi_driver
    • 修改proch值和分辨率的值
    • 修改 pixel_clk=(width+hfp +hbp +hsync )*(height +vfp +vbp +vsync )*fps,                      phy_freq= (pixe_lclk * 24 * 1.2)/lane_num
    • 修改read_id函数,如果是正确读取的id则返回0,表示找到该屏
    • 修改参数.lcd_name = "lcd_xxx_mipi_fhd", 使得内核找到该屏的dtsi驱动
  • 新增LCD宏,bsp/bootloader/u-boot/include/configs/uis7862s_1h10.h,新增#define CONFIG_LCD_xxx_MIPI_FHD
  • bsp/bootloader/u-boot/drivers/video/sprd/lcd/Makefile 把 lcd_xxx_video.c 编译规则加到Makefile里面:obj-$(CONFIG_LCD_xxx_MIPI_FHD) += lcd_xxx_video.o
  • bsp/bootloader/u-boot/drivers/video/sprd/lcd/panel_cfg.h,新增的驱动id:
    extern struct panel_driver xxx_mipi_driver;
    
    #ifdef CONFIG_LCD_xxx_MIPI_FHD
        {
            .lcd_id = 0x1111,//这个id通过lcd_id_to_kernel 传给kernel
            .drv = &xxx_mipi_driver,
        }

kernel移植比较简单

  • arch/arm64/boot/dts/sprd/lcd/目录下复制之前的dtsi屏驱动

  • 修改名称lcd_xxx_mipi_fhd,把uboot的proch、分辨率、pixel_clk、phy_freq、初始化命令修改到当前的dtsi文件

  • 这个驱动的dtsi就像 .h文件一样,将文件名加到改平台的dtsi文件中去。

移植结束后,看是否点亮该屏。如果屏幕没有亮,请检查:

  • 查看log读到的read_id是否正确。

  • 查看初始化命令 init_data 是否全部写对。

  • 查看proch值、phy_freq、pixel_clk是否正确。

proch值:

  • HFP:水平后沿:在每行或者每列像素数据开始输出时要插入的像素时钟周期。

  • HBP:水平前沿:在每行或每列的像素结束到LCD行时钟输出脉冲之间的像素时钟。

  • HSYNC:行(水平)同步脉宽

  • VFP:垂直前沿:本帧数据输出结束到下一个垂直同步周期开始之前的无效行数。

  • VBP:垂直后沿:在垂直同步周期之后帧开头时的无效行数。

  • VSYNC:垂直同步脉宽

猜你喜欢

转载自blog.csdn.net/weixin_42432281/article/details/114537268