【Linux入坑(一)—全志T133开发板适配欣瑞达LVDS 7寸(800*480)屏幕】
文章目录
- 前言
- 一、修改dts参数
- 二、修改boot显示参数
- 1.进入boot显示界面
- 2.打开display_menu.c
- 三、编译
- 遇到的问题
前言
前期准备:
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>;//150lcd_if = <3>;// lcd_x = <1280>;// lcd_y = <800>;lcd_x = <800>;lcd_y = <480>;lcd_width = <155>;lcd_height = <85>;lcd_dclk_freq = <34>;//71lcd_lvds_colordepth = <0>;lcd_lvds_mode = <1>;lcd_pwm_used = <1>;lcd_pwm_ch = <3>;lcd_pwm_freq = <20000>;//20000lcd_pwm_pol = <1>;lcd_pwm_max_limit = <255>;//HBP 46//HSW 1-40//HFP 210//VSW 1-20//VBP 23//VFP 22lcd_hbp = <66>;//66 // 对应屏厂HBP+HSW//lcd_ht = <1056>;//HSD period time // 对应屏厂Width + HSW + HBP + HFPlcd_ht = <1076>;//HSD period time // 对应屏厂Width(800) + HSW + HBP(46) + HFP(210)lcd_hspw = <20>;//20HSD Puls Width // 对应屏厂HSWlcd_vbp = <33>;//17 // 对应屏厂VBP+VSWlcd_vt = <535>;//VSD period time // 对应屏厂Height(480) + VSW + VBP(23) + VFP(22)lcd_vspw = <10>;//VSD pulse width // 对应屏厂VSWlcd_frm = <1>; // 1:rgb666lcd_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 0bootup_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);#endifbootup_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修改