【Linux入坑(一)—全志T133开发板适配欣瑞达LVDS 7寸(800*480)屏幕】


前言

前期准备:
1、解压完成飞凌的对应linux系统文件和虚拟机环境。
2、连接好屏幕硬件连接线
3、屏幕手册(关键)


一、修改dts参数

1、进入屏幕对应的修改文件夹

cd /home/forlinx/senye/01_source/ok113i/OK113i-linux-sdk/kernel/linux-5.4/arch/arm/boot/dts

在这里插入图片描述
2、查找文件OK113I-C-Linux.dts
在这里插入图片描述
3、修改对应的分辨率和参数,我的是lvds的显示方式,原本驱动中有对应的lvds(1280*800)的屏,可以直接在上面根据自己的屏幕参数修改,修改的屏幕参数根据屏幕手册来计算
在这里插入图片描述

#elif (DISP_TYPE == 5)
// lvds 1280x800
&lcd0 {
    lcd_used            = <1>;
    status              = "okay";

    lcd_driver_name     = "default_lcd";
    lcd_backlight       = <150>;//150
    lcd_if              = <3>;

   // lcd_x             = <1280>;
   // lcd_y             = <800>;
   
    lcd_x               = <800>;
    lcd_y               = <480>;
    lcd_width           = <155>;
    lcd_height          = <85>;
    lcd_dclk_freq       = <34>;//71
    lcd_lvds_colordepth = <0>;
    lcd_lvds_mode       = <1>;
     
    lcd_pwm_used        = <1>;
    lcd_pwm_ch          = <3>;
    lcd_pwm_freq        = <20000>;//20000
    lcd_pwm_pol         = <1>;
    lcd_pwm_max_limit   = <255>;

	//HBP 46
	//HSW 1-40
	//HFP 210
	//VSW 1-20
	//VBP 23
	//VFP 22

    lcd_hbp             = <66>;//66				   // 对应屏厂HBP+HSW
    //lcd_ht            = <1056>;//HSD period time // 对应屏厂Width + HSW + HBP + HFP
    lcd_ht              = <1076>;//HSD period time // 对应屏厂Width(800) + HSW + HBP(46) + HFP(210)
    lcd_hspw            = <20>;//20HSD Puls Width  // 对应屏厂HSW
    lcd_vbp             = <33>;//17   	     // 对应屏厂VBP+VSW
    lcd_vt              = <535>;//VSD period time  // 对应屏厂Height(480) + VSW + VBP(23) + VFP(22)
    lcd_vspw            = <10>;//VSD pulse width   // 对应屏厂VSW
    lcd_frm             = <1>;		// 1:rgb666

	lcd_bl_en = <&pio PB 1 GPIO_ACTIVE_HIGH>;
};

二、修改boot显示参数

1.进入boot显示界面

cd brandy/brandy-2.0/u-boot-2018/drivers/video/sunxi/bootGUI

2.打开display_menu.c

修改对应函数参数

void  bootup_menu_setprop_by_lcd_lvds_1280_800(int kernel)
{
	int offset_node = 0;
    unsigned int phandle0 = 0;
    unsigned int phandle1 = 0;
    unsigned long buffer = env_get_ulong("board", 10, 0);

    bootup_hal_save_lcd_to_kernel("lcd_used", FDT_UINT_VALUE, 1, NULL);
    bootup_hal_save_lcd_to_kernel("lcd_if", FDT_UINT_VALUE, 3, NULL);
	bootup_hal_save_lcd_to_kernel("lcd_driver_name", FDT_STRING_VALUE, 0, "default_lcd");

    bootup_hal_save_lcd_to_kernel("lcd_x", FDT_UINT_VALUE, 800, NULL);
   // bootup_hal_save_lcd_to_kernel("lcd_x", FDT_UINT_VALUE, 1280, NULL);
    bootup_hal_save_lcd_to_kernel("lcd_y", FDT_UINT_VALUE, 480, NULL);
   // bootup_hal_save_lcd_to_kernel("lcd_y", FDT_UINT_VALUE, 800, NULL);
   //bootup_hal_save_lcd_to_kernel("lcd_width", FDT_UINT_VALUE, 210, NULL);
   // bootup_hal_save_lcd_to_kernel("lcd_height", FDT_UINT_VALUE, 135, NULL);
   // bootup_hal_save_lcd_to_kernel("lcd_dclk_freq", FDT_UINT_VALUE, 71, NULL);
   #if 0
    bootup_hal_save_lcd_to_kernel("lcd_hbp", FDT_UINT_VALUE, 20, NULL);
    bootup_hal_save_lcd_to_kernel("lcd_ht", FDT_UINT_VALUE, 1440, NULL);
    bootup_hal_save_lcd_to_kernel("lcd_hspw", FDT_UINT_VALUE, 10, NULL);
    bootup_hal_save_lcd_to_kernel("lcd_vbp", FDT_UINT_VALUE, 17, NULL);
    bootup_hal_save_lcd_to_kernel("lcd_vt", FDT_UINT_VALUE, 823, NULL);
    bootup_hal_save_lcd_to_kernel("lcd_vspw", FDT_UINT_VALUE, 10, NULL);
    #endif
   bootup_hal_save_lcd_to_kernel("lcd_width", FDT_UINT_VALUE, 154, NULL);
   bootup_hal_save_lcd_to_kernel("lcd_height", FDT_UINT_VALUE, 86, NULL);
   bootup_hal_save_lcd_to_kernel("lcd_dclk_freq", FDT_UINT_VALUE, 34, NULL);

    bootup_hal_save_lcd_to_kernel("lcd_hbp", FDT_UINT_VALUE, 66, NULL);
    bootup_hal_save_lcd_to_kernel("lcd_ht", FDT_UINT_VALUE, 1076, NULL);
    bootup_hal_save_lcd_to_kernel("lcd_hspw", FDT_UINT_VALUE, 20, NULL);
    bootup_hal_save_lcd_to_kernel("lcd_vbp", FDT_UINT_VALUE, 33, NULL);
    bootup_hal_save_lcd_to_kernel("lcd_vt", FDT_UINT_VALUE, 535, NULL);
    bootup_hal_save_lcd_to_kernel("lcd_vspw", FDT_UINT_VALUE, 10, NULL);

	bootup_hal_save_lcd_to_kernel("lcd_lvds_if", FDT_UINT_VALUE, 0, NULL);
	bootup_hal_save_lcd_to_kernel("lcd_lvds_colordepth", FDT_UINT_VALUE, 0, NULL);
	//bootup_hal_save_lcd_to_kernel("lcd_lvds_mode", FDT_UINT_VALUE, 0, NULL);
	bootup_hal_save_lcd_to_kernel("lcd_lvds_mode", FDT_UINT_VALUE, 1, NULL);
	bootup_hal_save_lcd_to_kernel("lcd_hv_clk_phase", FDT_UINT_VALUE, 0, NULL);
	bootup_hal_save_lcd_to_kernel("lcd_hv_sync_polarity", FDT_UINT_VALUE, 0, NULL);
        bootup_hal_save_lcd_to_kernel("lcd_frm", FDT_UINT_VALUE, 1, NULL);

	bootup_hal_del_lcd_to_kernel("lcd_io_phase");
	bootup_hal_del_lcd_to_kernel("lcd_dsi_lane");
	bootup_hal_del_lcd_to_kernel("lcd_dsi_if");
	bootup_hal_del_lcd_to_kernel("lcd_dsi_format");

	if (kernel) {
		offset_node = fdt_path_offset(working_fdt, KERNEL_OFFSET_NAME"lvds0@0");
		assert(offset_node >= 0);

		fdt_getprop_u32(working_fdt, offset_node, "phandle", &phandle0);

		offset_node = fdt_path_offset(working_fdt, KERNEL_OFFSET_NAME"lvds0@1");
		assert(offset_node >= 0);

		fdt_getprop_u32(working_fdt, offset_node, "phandle", &phandle1);
	} else {
		offset_node = fdt_path_offset(working_fdt, UBOOT_OFFSET_NAME"lvds0@0");
		assert(offset_node >= 0);

		fdt_getprop_u32(working_fdt, offset_node, "phandle", &phandle0);

		offset_node = fdt_path_offset(working_fdt, UBOOT_OFFSET_NAME"lvds0@1");
		assert(offset_node >= 0);

		fdt_getprop_u32(working_fdt, offset_node, "phandle", &phandle1);
	}

    bootup_hal_save_lcd_to_kernel("pinctrl-0", FDT_UINT_VALUE, phandle0, NULL);
    bootup_hal_save_lcd_to_kernel("pinctrl-1", FDT_UINT_VALUE, phandle1, NULL);

	if (kernel) {
		if(buffer == 1)
			offset_node = fdt_path_offset(working_fdt, "/soc@3000000/twi@2502c00/gt928@14");
		else if(buffer == 2)
			offset_node = fdt_path_offset(working_fdt, "/soc@3000000/twi@2502000/gt928@14");
		assert(offset_node >= 0);

		fdt_delprop(working_fdt, offset_node, "status");
		fdt_setprop_string(working_fdt, offset_node, "status", "okay");

		if(buffer == 1)
			offset_node = fdt_path_offset(working_fdt, "/soc@3000000/twi@2502c00/gt911@14");
		else if(buffer == 2)
			offset_node = fdt_path_offset(working_fdt, "/soc@3000000/twi@2502000/gt911@14");
		assert(offset_node >= 0);

		fdt_delprop(working_fdt, offset_node, "status");
		fdt_setprop_string(working_fdt, offset_node, "status", "disabled");

		if(buffer == 1)
			offset_node = fdt_path_offset(working_fdt, "/soc@3000000/twi@2502c00/ft5x06@38");
		else if(buffer == 2)
			offset_node = fdt_path_offset(working_fdt, "/soc@3000000/twi@2502000/ft5x06@38");
		assert(offset_node >= 0);
		fdt_delprop(working_fdt, offset_node, "status");
		fdt_setprop_string(working_fdt, offset_node, "status", "disabled");
	}

	//bootup_setprop_by_lcd_disp_type(1280, 800);
	bootup_setprop_by_lcd_disp_type(800,480);
}

三、编译

//编译配置,选择显示方式为lvds1280800,实际内容已经修改为800480

./build.sh config

在这里插入图片描述
//全部编译

./build.sh

//打包

./build.sh pack

烧写界面完成后
在这里插入图片描述


遇到的问题

1、修改OK113I-C-Linux.dts分辨率,没有修改display_menu.c分辨率
启动后黑屏

2、修改完成OK113I-C-Linux.dts分辨率和display_menu.c分辨率。但是没有适配显示屏参数,显示屏出现分辨率正确,但是屏幕缺色
在这里插入图片描述
3、修改完成OK113I-C-Linux.dts分辨率和display_menu.c分辨率。同时适配完OK113I-C-Linux.dts屏幕参数(即使屏幕参数是对的),display_menu.c参数没有修改。也会出现下面现象
在这里插入图片描述
使用调试指令测试正常,但是显示不正常
//花屏测试(正常)

cat /dev/urandom > /dev/fb0

colorbar测试:

cat /dev/zero > /dev/fb0
echo 8 > /sys/class/disp/disp/attr/colorba

在这里插入图片描述

4、只有修改了display_menu.c分辨率和屏幕参数才能显示正常。关键还是在display_menu.c修改

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

未*望

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值