Phytec中国的wiki
support@phytec.cn
热线:0755-61802110-803
display子系统简介
现在的display子系统都属于kernel DRM框架,framebuffer传入组成plane传递给CRTC,在交给encoder去转换display信号,最后通过connector输出到panel。如下是DRM的框架图:
其中涉及到的硬件是
Pipelines:从RAM中加载像素数据,执行颜色转换,复制,放大和缩小等功能
Overlay Managers (Compositors):混合不同管道的像素数据
Video Ports (Timing generators):转换成标准的RGB parellel信号
上述硬件和DRM框架软件object对应关系如下:不同平台硬件有所不一样,但是DRM架构是一致的,需要将对应的硬件转换到DRM架构上。
DRM term | HW term |
---|---|
plane | DSS pipeline |
crtc | DSS videoport |
encoder | Internal and external bridges |
connector | Connector or a panel |
平台CRTC一般都已经配置完成,需要配置的是encoder和connector的部分。即从哪个crtc出口,导出到哪个的encoder,最终导出到connector。然后再配置encoder的timing。关闭/删除不需要的硬件配置。
准备
phytec平台一般都会以overlay的形式提供LVDS或者parallel RGB的dts配置,所以可以在此基础上做新屏幕的适配更改。需要准备以下几点:
1,查看phytec支持的display子系统以及通道上的硬件组成
2,查看phytec支持的display 接口类型和信号,pixel clk范围以及支持的数据格式
3,查看panel的display接口信号
4,查看panel支持的像素数据格式,pixel clk的范围,具体的timing(即刷新屏幕的时机和period)以及屏幕实际的active长宽
5,根据以上四点判断平台是否支持该款屏幕,如果支持,就可以接下来动手去修改dts和驱动适配该屏幕了。
TI平台
display子系统
查看TI datasheet 关于display的章节,例如(AM62x Processors Silicon Revision 1.0
Texas Instruments Families of ProductsTechnical Reference Manua)我们可以看到AM62x有条独立的display pipeline,说明可以独立输出两路的显示数据。
一条输出到OLDITX( Open LVDS Display Interface transmitters),最后转换为两条4x LVDS的线路,这代表可以接两个LVDS屏幕输出相同的内容,或者组合使用,通过交叉输出奇偶像素的形式接入一个LVDS屏幕。
另外一条输出到
Parallel MIPI DPI 2.0 (Digital Pixel Interface): 或者BT.656/BT.1120 interface
重要数据:
name | value |
---|---|
VP out pixel-clock | up to 165M HZ |
VP out data | 12-bit 16-bit 18-bit or 24-bit RGB |
LVDS
从上述TI datasheet上可知,AM62x系列上OLDITX 连接LVDS和VP,input是RGB的parellel pixel 数据,OLDITX将parellel的数据转换成serial的LVDS数据。
LVDS的输出数据有两种格式,一种JEIDA的标准,一种是VESA的标准,18-bit的只支持VESA标准
name | value |
---|---|
VP1 out pixel-clock | up to 165M HZ |
input data | 18-bit or 24-bit RGB input source data. |
out lanes used | 4 lanes for 24-bit and 3 lanes for 18-bit |
out data mode | • Type A = Single-link 18-bit. • Type B = Single-link 24-bit JEIDA. • Type C = Single-link 24-bit. • Type D = Dual-link 18-bit. • Type E = Dual-link 24-bit JEIDA. • Type F = Dual-link 24-bit. |
Dual-link代表 两条LVDS线路接到一个panel上面,单个clk传输两个pixel。接下来根据需要根据屏幕的datasheet去调整这个timing和data mode.分为DTS修改和驱动的修改。
panel pins
1,panel的datasheet需要关注PIN脚配置,是4lane LVDS还是8lane的LVDS,代表Single-link和dual-link.如下是一个4lane的LVDS屏幕
panel signal
2,关注input panel signal,获得该panel支持的和系统输出的匹配模式和屏幕类型,如下为Single-link 18-bit。
对应到bus_format如下图:
其他bus_format可从下面查找
4.13.3.4.1. Media Bus Formats — The Linux Kernel documentation
panel timing
再看panel的timing,获得对应的clk等信息。屏幕分为两种,一种是DE模式的panel,没有sync信号,只有DE信号,另外一种是SYNC模式的显示屏,需要水平和竖直方向的同步信号去刷新屏幕像素。所以下图屏幕的类型为DE屏幕,DE高电平数据有效。
根据LCD datasheet里面的下图,得到最终的驱动参数表
对DE屏幕来说,由于只使用DE信号,没有sync信号,因此sync_len都设为0,而很多平台的lcd控制器不允许各个设定值出现0,因此这里推荐设为12。
上图horizontal cycle = hfront_porch + hback_porch + hactive + hsync_len
vertical cycle = vfront_porch + vback_porch + vactive + vsync_len
由于是DE屏幕,porch值不为0,可以任意设置,但是加起来需要满足上述等式的限制。
name | min | type | max | explaination |
---|---|---|---|---|
pixelclock(mhz) | 52 | 65 | 71 | input pixel clock for panel |
hactive | 1024 | 水平数据有效时间 | ||
hfront_porch | 10 | 10 | 26 | 水平同步信号前数据无效时间 |
hback_porch | 80 | 310 | 350 | 水平同步信号后数据无效时间 |
hsync_len | 12 | 水平同步信号时间 | ||
vactive | 768 | 垂直数据有效时间 | ||
vfront_porch | 3 | 6 | 10 | 垂直同步信号前数据无效时间 |
vback_porch | 4 | 20 | 55 | 垂直同步信号后数据无效时间 |
vsync_len | 5 | 12 | 12 | 垂直同步信号时间 |
* Active Video * Video ______________________XXXXXXXXXXXXXXXXXXXXXX_____________________ * |<- sync ->|<- back ->|<----- active ----->|<- front ->|<- sync.. * | | porch | | porch | * * HSync _|¯¯¯¯¯¯¯¯¯¯|___________________________________________|¯¯¯¯¯¯¯¯¯ * * VSync ¯|__________|¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯|_________ */
4,driver还需要屏幕的长宽物理参数,height=184,width=245
Driver 修改
数据格式和timing需要在linux-ti/drivers/gpu/drm/panel/panel-simple.c驱动当中配置。
platform_of_match数组变量中,新增需要适配的panel元素。如下以tianma 品牌的panel为例子的修改,其他品牌需要参考panel-simple.c里面对应品牌的显示屏进行修改。根据上述总结的timing表格,作如下修改
{ .compatible = "tianma,tm121tdsg04", .data = &tianma_tm121tdsg04, }, //@size: Structure containing the physical size of this panel. //@delay: Structure containing various delay values for this panel. //@bpc: Bits per color. static const struct panel_desc tianma_tm121tdsg04 = { .timings = &tianma_tm121tdsg04_timing, .num_timings = 1, .bpc = 6, .size = { .width = 245, .height = 184, }, .bus_format = MEDIA_BUS_FMT_RGB666_1X18, .connector_type = DRM_MODE_CONNECTOR_LVDS, }; static const struct display_timing tianma_tm121tdsg04_timing = { .pixelclock = { 52000000, 65000000, 71000000 }, .hactive = { 1024, 1024, 1024}, .hfront_porch = { 10, 10, 26 }, .hback_porch = { 80, 310, 350 }, .hsync_len = { 12, 12, 12 }, .vactive = { 768, 768, 768}, .vfront_porch = { 3, 6, 10 }, .vback_porch = { 4, 20, 55 }, .vsync_len = { 5, 12, 12 }, .flags = DISPLAY_FLAGS_DE_HIGH,//DE 高电平有效 };
drm模式的驱动格式如下:
}, { .compatible = "lnnolux,g101ice-lh1", .data = &lnnolux_g101ice_lh1, }, { //下面内容不可出现为0的值 static const struct drm_display_mode lnnolux_g101ice_lh1_mode = { .clock = 71000, .hdisplay = 1280, .hsync_start = 1280 + 136, .hsync_end = 1280 + 136 + 12, .htotal = 1280 + 136 + 12 + 12, .vdisplay = 800, .vsync_start = 800 + 5, .vsync_end = 800 + 5 + 5, .vtotal = 800 + 5 + 5 + 13, }; static const struct panel_desc lnnolux_g101ice_lh1 = { .modes = &lnnolux_g101ice_lh1_mode, .bpc = 6, .num_modes = 1, .size = { .width = 217, .height = 136, }, .delay = { .prepare = 50, .disable = 50, }, .bus_flags = DRM_BUS_FLAG_DE_HIGH, .bus_format = MEDIA_BUS_FMT_RGB666_1X7X3_SPWG, .connector_type = DRM_MODE_CONNECTOR_LVDS, };
驱动配置完成后,需要在dts里面配置上display的驱动,compatible值为上述新增platform_of_match数组元素的值.见下节
DTS 修改
如果屏幕是Single-link,只需要配置一个port@0,删除第二个port@1。Dual-link需要根据屏幕类型配置port属性dual-lvds-even-pixels;和dual-lvds-odd-pixels;
mode | dts |
---|---|
Single-link | display { port@0 { }; |
Dual-link | display { port@0 { port@1 { |
以上,lvds部分配置完成。
背光灯
backlight有gpio backlight和pwmbacklight之分,gpio backlight只支持开和关,不支持亮度调节;pwm backlight支持多种亮度调节。
gpio backlight
使用linux-ti/drivers/video/backlight/gpio_backlight.c驱动,需要打开kernel CONFIG_BACKLIGHT_GPIO宏
dts里面配置控制backlight的gpio,pinctrl等,以及gpio高电平/低电平有效,defalut-on代表默认是打开的状态。
backlight: backlight { compatible = "gpio-backlight"; pinctrl-names = "default"; pinctrl-0 = <&pinctrl_backlight>; gpios = <&gpio1 7 GPIO_ACTIVE_HIGH>; default-on; };
pwm backlight
需要pwm接口连接屏幕,打开kernel CONFIG_BACKLIGHT_PWM 宏开关
配置pwm的pinctrl功能,根据原理图配置enable_gpio,去使能/关闭pwm。根据所使用的pwm接口号,去使用对应的pwm节点,如epwm0/epwm1/epwm2
backlight: backlight { pinctrl-names = "default"; pinctrl-0 = <&bl_pwm_pins_default>; compatible = "pwm-backlight"; brightness-levels = <0 4 8 16 32 64 128 255>; default-brightness-level = <6>; enable-gpios = <&gpio_exp 5 GPIO_ACTIVE_HIGH>; pwms = <&epwm0 1 50000 0>; };
注意:可以参考现有的phytec lcd.dts进行修改,如linux-ti/arch/arm64/boot/dts/ti/k3-am62-phyboard-lyra-oldi-lcd185.dts
默认配置了touch screen,如果不适用touch screen的话需要将touch screen的main_i2c1节点,以及对应的touch_screen_pins_default节点删除。
该k3-am62-phyboard-lyra-oldi-lcd185.dts是以overlay形式存在,如果要使能该dts
参考
Configuring the Bootloader — PHYTEC 0.2 documentation
测试
export WAYLAND_DISPLAY=/run/wayland-0
weston-simple-egl