Display Controller 显示处理单元
模块功能介绍
图层特性:
输入格式支持RGB888,RGB565,RGB555;
显示特性:
支持TFT,SLCD;
驱动源码位置
驱动源码所在位置:
module_drivers/drivers/video/fbdev/ingenic/fb_stage
添加屏
在**module_drivers/drivers/video/fbdev/ingenic/fb_stage/displays/**下新建相关屏的文件
以FW050为例
touch panel-fw050.c
在Kconfig中添加屏的标志和依赖,路径如下:
module_drivers/drivers/video/fbdev/ingenic/fb_stage/displays/Kconfig
以FW050为例
config STAGE_FW050 tristate "lcd panel FW050" depends on FB_INGENIC_DISPLAYS_STAGE help lcd panel FW050, for ingenicfb drivers.
在Makefile中添加新的编译文件,文件路径如下:
module_drivers/drivers/video/fbdev/ingenic/fb_stage/displays/Makefile
以FW050为例
obj-$(CONFIG_STAGE_FW050) += panel-fw050.o
根据屏幕手册配置完成屏文件后,在内核编译配置中选择新添加的屏。
注意事项
保证MIPI lcd 的各路电压都正常
保证复位引脚时序正常
保证lcd 的clk设置正常,差距不易过大,否则可能导致屏幕不亮
保证lcd 的hbp,fbp,vfb,vbp等各项参数正常
如果有初始化参数,需保证初始化参数是对的
MIPI屏需保证MIPI 屏幕各项设置参数以及MIPI接口参数设置函数是对的
设备树配置
设备树所在位置:
kernel内核(version <= 5.10)dts文件路径:
module_drivers/dts-stage/x1600/halley6_v10.dts
需在设备树中包含对应的屏
module_drivers/dts-stage/x1600/halley6_lcd/RD_X1600_HALLEY6_RGB_SLCD_1V0.dtsi
kernel内核(version > 5.10)dts文件路径:
module_drivers/dts/x1600/halley6_v10.dts
需在设备树中包含对应的屏
module_drivers/dts/x1600/halley6_lcd/RD_X1600_HALLEY6_RGB_SLCD_1V0.dtsi
DPU控制器描述:
dpu: dpu@0x13050000 {
compatible = "ingenic,x1600-dpu";
reg = <0x13050000 0x10000>;
interrupt-parent = <&core_intc>;
interrupts = <IRQ_LCD>;
status = "disabled";
};设备树默认配置
设备树默认编译会产生DPU控制器设备。
DPU控制器配置
在RD_X1600_HALLEY6_RGB_SLCD_1V0.dtsi中配置如下:
&dpu {
status = "okay";
port {
dpu_out_ep: endpoint {
remote-endpoint = <&panel_fw035_ep>;
};
};
};显示屏配置
display-dbi {
compatible = "simple-bus";
#interrupt-cells = <1>;
#address-cells = <1>;
#size-cells = <1>;
ranges = <>;
panel_fw035 {
compatible = "ingenic,fw035";
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&smart_lcd_pa_8bit>;
ingenic,pwm-gpio = <&gpc 0 GPIO_ACTIVE_HIGH INGENIC_GPIO_NOBIAS>;*/
ingenic,cs-gpio = <&gpa 23 GPIO_ACTIVE_LOW INGENIC_GPIO_NOBIAS>;
ingenic,rd-gpio = <&gpa 16 GPIO_ACTIVE_HIGH INGENIC_GPIO_NOBIAS>;
ingenic,vdd-en-gpio = <&gpa 31 GPIO_ACTIVE_HIGH INGENIC_GPIO_NOBIAS>;
ingenic,rst-gpio = <&gpb 13 GPIO_ACTIVE_LOW INGENIC_GPIO_NOBIAS>;
port {
panel_fw035_ep: endpoint {
remote-endpoint = <&dpu_out_ep>;
};
};
};
};设备树自定义配置
用户可根据实际需求关闭dpu设备,将以上节点配置为disabled,或匹配其他型号显示屏。
X1600 DPU 支持的屏幕种类
smart lcd: dbi硬件接口,液晶屏有自己的ram,防裂屏需要有te功能
tft lcd: dpi硬件接口,没有ram,需要按照一定的帧率刷新屏幕
匹配其他型号显示屏
DPU控制器端点(port)与显示屏配置端点对应
配置兼容的屏(compatible)
根据不同型号的屏选择控制引脚(pinctrl-0),不同的引脚设置在module_drivers/dts-stage/x1600/x1600-pinctrl.dtsi或module_drivers/dts/x1600/x1600-pinctrl.dtsi
根据不同的屏配置其他与屏相关的引脚,例如供电引脚,复位引脚等
内核模块差异
屏幕配置
屏幕配置
struct lcd_panel {
const char *name;
unsigned int num_modes; /*显示模式支持的数量,固定值1*/
struct fb_videomode *modes; /*显示模式*/
struct jzdsi_data *dsi_pdata; /*如果屏幕是mipi dsi接口需要实现*/
enum ingenic_lcd_type lcd_type; /*屏幕种类,如果是mipi tft lcd需要配置LCD_TYPE_TFT,其它的按功能配置*/
unsigned int bpp; /*不需要填充*/
unsigned int width; /*屏幕实际物理宽度,单位mm*/
unsigned int height; /*屏幕实际物理高度,单位mm*/
struct smart_config *smart_config; /*如果屏幕是smart lcd需要实现*/
struct tft_config *tft_config; /*如果屏幕是tft lcd需要实现*/
unsigned dither_enable:1; /*打开dither功能*/
struct {
unsigned dither_red;
unsigned dither_green;
unsigned dither_blue;
} dither;
struct lcd_panel_ops *ops; /*不需要实现*/
};
struct fb_videomode {
const char *name; /* optional */
u32 refresh; /*配置帧率,驱动会根据配置参数和帧率计算pixclock*/
u32 xres; /*显示有效宽度,按照屏手册填写*/
u32 yres; /*显示有效高度,按照屏手册填写*/
u32 pixclock;
u32 left_margin; /*tft屏时按照手册填写,当smart lcd时赋值0*/
u32 right_margin; /*tft屏时按照手册填写,当smart lcd时赋值0*/
u32 upper_margin; /*tft屏时按照手册填写,当smart lcd时赋值0*/
u32 lower_margin; /*tft屏时按照手册填写,当smart lcd时赋值0*/
u32 hsync_len; /*tft屏时按照手册填写,当smart lcd时赋值0*/
u32 vsync_len; /*tft屏时按照手册填写,当smart lcd时赋值0*/
u32 sync; /*当mipi dsi tft lcd时需要赋值(FB_SYNC_HOR_HIGH_ACT & FB_SYNC_VERT_HIGH_ACT),其他的屏幕不关注*/
u32 vmode; /*默认值:FB_VMODE_NONINTERLACED*/
u32 flag;
};smart lcd 配置
struct smart_config {
unsigned int te_switch; /*smart lcd te功能控制*/
unsigned int te_mipi_switch; /*设置 mipi dsi smart lcd te功能控制*/
unsigned int te_md; /*0:te前沿有效,1:后沿有效*/
unsigned int te_dp; /*0:te低电平有效,1:高电平有效*/
unsigned int te_anti_jit; /*0:te信号保持1个pixclk有效,1:te信号保持3个pixclk有效*/
unsigned int dc_md; /*0:DC高电平数据,低电平命令, 1:DC高电平命令,低电平数据*/
unsigned int wr_md; /*0:下降沿采样,1:上升沿采样 */
enum smart_lcd_type smart_type; /*smart slcd种类,支持6800/8080/spi-3/spi-4*/
enum smart_lcd_format pix_fmt; /*总线数据格式,支持565,666等*/
enum smart_lcd_dwidth dwidth; /*数据总线宽度*/
enum smart_lcd_cwidth cwidth; /*命令总线宽度*/
unsigned int bus_width;
unsigned long write_gram_cmd; /*发送数据前需要发送的命令,默认0x2c*/
unsigned int length_cmd; /*不需要实现*/
struct smart_lcd_data_table *data_table; /*配置屏幕命令表*/
unsigned int length_data_table; /*配置屏幕命令数量*/
};tft lcd配置
struct tft_config {
unsigned int pix_clk_inv; /*0:pixclk默认输出, 1:反转pixclk*/
unsigned int de_dl; /*0:DE引脚高电平输出有效数据, 1:低电平输出有效数据*/
unsigned int sync_dl; /*0:vsync和hsync引脚高电平输出有效数据, 1:低电平输出有效数据*/
enum tft_lcd_color_even color_even; /*偶数行时总线RGB顺序*/
enum tft_lcd_color_odd color_odd; /*奇数行时总线RGB顺序*/
enum tft_lcd_mode mode; /*总线数据格式,支持888/666/565*/
};pwm背光配置
需要使用pwm背光时可在板级.dts配置pwm:
&pwm {
pinctrl-names = "default";
pinctrl-0 = <&pwm0_pc>;
status = "okay";
};目前支持的屏幕pwm背光设备树位置:
module_drivers/dts-stage/x1600/halley6_lcd或module_drivers/dts/x1600/halley6_lcd
以fw035型号屏幕为例:
backlight {
compatible = "pwm-backlight";
pwms = <&pwm 0 1000000>;
brightness-levels = <0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15>;
default-brightness-level = <4>;
};内核编译配置
内核进行控制器和显示屏及背光配置,配置说明如下:
控制器驱动配置:
Symbol: FB_INGENIC_STAGE [=y] Type : tristate Prompt: Ingenic Framebuffer Driver for stage Location: -> Ingenic device-drivers Configurations -> [LCD] Panel/Touchscreen Drivers -> Ingenic Framebuffer Driver (FB_INGENIC [=y]) Defined at module_drivers/drivers/video/fbdev/ingenic/fb_stage/Kconfig
显示屏配置
Symbol: STAGE_FW035 [=y] Type : tristate Prompt: lcd panel FW035 Location: -> Ingenic device-drivers Configurations -> [LCD] Panel/Touchscreen Drivers -> Ingenic Framebuffer Driver (FB_INGENIC [=y]) -> Ingenic Framebuffer Driver for stage (FB_INGENIC_STAGE [=y]) -> Supported lcd panels (FB_INGENIC_DISPLAYS_STAGE [=y]) Defined at module_drivers/drivers/video/fbdev/ingenic/fb_stage/displays/Kconfig
pwm背光驱动配置:
Symbol: PWM_INGENIC_V3 [=y] Type : boolean Prompt: Ingenic V3 PWM support Location: -> Ingenic device-drivers Configurations -> [PWM] drivers Defined at module_drivers/drivers/pwm/Kconfig
设备节点生成
驱动加载成功后生成以下节点:
/dev/fb0