2019-08-09
關鍵字:LVDS點屏、rk3288 LVDS點屏、奇美LVDS屏幕點屏
奇美M215HGE-L21 是一款 21.5 寸的分辨率達 1920*1080 的不可觸摸的 LVDS 型顯示屏。
筆者這邊的這塊屏幕是一種嵌在一塊觸摸板里的。有兩根線需要連接到 rk3288 上,一根是 LVDS 線,用於視頻數據的傳輸,另一根是 USB 線,用於觸摸信號的傳輸。這塊屏幕默認並不帶觸摸功能,所以觸摸板是我們這邊額外增加的。
在點屏之前首先必須要確認硬件電路,點屏是一種非常依賴硬件的事情,誰也無法確保自己的硬件工程師在設計電路時不會出什么差錯。當然,我們作為軟件肯定是很難判斷電路到底有沒有問題的,但是我們必須有這種意識。如果在㤐屏過程中遇到什么很匪夷所思的事情,不無理由不叫上硬件人員一起過來分析一下。
筆者這邊的 rk3288 運行的是 Android5.1,rk 原廠 SDK 就已經有很完善的 lvds 屏幕支持了。所以點屏對我們軟件來說,基本就是照着屏幕規格書來填一下參數而已。屏幕規格書一般是由硬件或項目經理給到我們,當然也可以在網上找到。
然后需要確認一下你編譯 kernel 時所使用的 dts 文件是哪一個。一般 3288 都會有一個編大包的腳本,在這個腳本里可以看到編譯命令,如下圖所示
一般 dts 的名稱與所編譯的鏡像名稱一致。所以,按照上圖,筆者這邊使用到的 dts 應該是:
./kernel/arch/arm/boot/dts/rk3288_lvds.dts
打開 dts,我們需要關注的是 backlight 節點:
backlight { compatible = "pwm-backlight"; pwms = <&pwm0 0 25000>; brightness-levels = < 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255>; default-brightness-level = <200>; enable-gpios = <&gpio7 GPIO_A2 GPIO_ACTIVE_HIGH>; };
這個節點里比較重要的是 pwms 屬性與 enable-gpios 屬性。這兩個屬性一般都直接控制着屏幕背光的亮度,它們的值要參照你自己的電路原理圖來填。同時還得注意,由於背光的亮度是靠 PWM 來控制的,所以具體的 pwm 還不能忘記把它打開,如下:
&pwm0 { status = "okay"; };
另一個要關注的節點是 lcdc0 節點
&lcdc0 { status = "okay"; rockchip,mirror = <NO_MIRROR>; rockchip,cabc_mode = <0>; power_ctr: power_ctr { rockchip,debug = <1>; lcd_en:lcd_en { rockchip,power_type = <GPIO>; gpios = <&gpio7 GPIO_B1 GPIO_ACTIVE_HIGH>; rockchip,delay = <200>; }; }; };
這個節點控制的主要是 lcdc0 相關的狀態,如使能腳、復位腳等等。上面的 backlight 是控制背光亮度,這個則是控制背光燈亮不亮的。它的值也是要參照具體電路圖來填寫的。
可能有的同學會有疑問,3288 上有好多組 lcdc ,為什么偏偏是 lcdc0 呢?一圖勝千言:
第三個要關注的節點是 rk_screen
&rk_screen { display-timings = <&disp_timings>; };
這個是表明依賴的屏幕參數節點的。
第四個則是要注意將 lvds 節點置為 okay 狀態,好讓編譯時去編譯 lvds 相關的驅動。
&lvds{ status = "okay"; };
最后一個要關注的節點則是我們在第三點處就提到的屏幕參數節點:
disp_timings: display-timings { native-mode = <&timing0>; timing0: timing0 { screen-type = <SCREEN_DUAL_LVDS>; lvds-format = <LVDS_8BIT_1>; color-mode = <COLOR_RGB>; out-face = <OUT_P888>; clock-frequency = <148000000>; hactive = <1920>; vactive = <1080>; hback-porch = <35>; //屏的行場后肩 hfront-porch = <100>; //屏的行場掃描前肩 vback-porch = <15>; //屏的幀同步后肩 vfront-porch = <20>; //屏的幀同步前肩 hsync-len = <5>; //屏的行同步信號寬度 vsync-len = <10>; //屏的幀同步信號寬度 hsync-active = <0>; //屏的行場同步信號極性 vsync-active = <0>; //屏的幀同步信號極性 de-active = <0>; //屏的 DE 信號極性 pixelclk-active = <1>; //屏的 dclk 極性 swap-rb = <0>; //紅藍顏色交換 swap-rg = <0>; //紅綠交換 swap-gb = <0>; //藍綠交換 }; };
如果你需要點的屏幕型號與筆者的是一樣的,那么照着填寫就可以了。
上面 disp_timings 節點記載的參數的值都是從屏幕規格書來得到的,下面簡單介紹一下屏幕規格書的解讀。
在拿到一份屏幕規格書時,首先看一下它的屏幕特性,一般規格書正文的第一塊內容就是它。如下圖所示
這部分一般我們只需要關注屏幕尺寸: 1920 * 1080。hactive 的值是 1920, vactive 的值是 1080。同時我們也能知道這是一塊 “橫屏屏幕”。
然后我們就要往下翻,去看一下屏幕的顯示時鍾特性,如下圖所示:
這里我們一般只關注它的典型值。首先第一行,這個是它的時鍾頻率,為 74.25MHz。它就是上面 disp_timings 節點的 clock-frequency 應該填的值。但是,由於我們這款屏幕的類型是 SCREEN_DUAL_LVDS ,因此實際的時鍾值應該再乘個 2。所以,最終填寫的值為
clock-frequency = <148000000>;
可能有的同學會說 74.25MHz 乘個 2 以后的值應該是 14.85MHz,對,沒錯,但其實這條屬性的值的要並沒有那么嚴格。它可以填入一個范圍內的值。
接下來,我們要記住這幾個值:
Tv : 1125
Tvd : 1080
Th : 1100
Thd : 960
另外:
有一些LVDS屏幕的規格書上這些電氣值的名稱可能不是 Tv, Tvd, Th, Thd,如下圖所示:
對於這種我們只要看它前面的描述詞即可,如 Horizontal Active Display Term 行的 Total 欄就對應於 Th,Valid 對應於 Thd。以此類推,Vertical Active Display Term 行的 Total 對應於 Tv, Valid 對應於 Tvd。大家仔細體會一下上面兩張圖的差別就很好理解的了。
我們要根據這幾個值算出 disp_timings 中的 hback-porch, hfront-porch, vback-porch, vfront-porch, hsync-len, vsync-len 的值。它們之間的關系如下:
Tv = vback-porch + vfront-porch + vsync-len + Tvd
Th = hback-porch + hfront-porch + hsync-len + Thd
所以:
vback-porch + vfront-porch + vsync-len = 1125 - 1080 = 45
hback-porch + hfront-porch + hsync-len = 1100 - 960 = 140
這里只需要保證這 3 個參數之和等於那個數就可以了,對具體的值沒有特別的要求。
最后剩下那幾個參數,照着填就好了。
hsync-active = <0>; vsync-active = <0>; de-active = <0>; pixelclk-active = <1>; swap-rb = <0>; swap-rg = <0>; swap-gb = <0>;
最后,再貼一下幾個比較重要的屬性的可選值,如果懷疑是自己填的參數不對導致屏幕點不亮的話,可以逐個嘗試一下。
screen-type 的可選值:
SCREEN_NULL
SCREEN_RGB
SCREEN_LVDS
SCREEN_DUAL_LVDS
SCREEN_MCU
SCREEN_TVOUT
SCREEN_HDMI
SCREEN_MIPI
SCREEN_DUAL_MIPI
SCREEN_EDP
SCREEN_TVOUT_TEST
lvds-format 的可選值:
LVDS_8BIT_1
LVDS_8BIT_2
LVDS_8BIT_3
LVDS_6BIG
LVDS_10BIT_1
LVDS_10BIT_2
out-face 的可選值:
OUT_P888
OUT_P666
OUT_P565
OUT_CCIR656
OUT_S888
OUT_S888DUMY
OUT_YUV_420
OUT_P101010
OUT_YUV_420_10BIT
OUT_P16BPP4
OUT_D888_P666
OUT_D888_P565
關於調試過程
這款屏幕電源正常供電但沒有視頻信號過去時將會顯示純白色背景。如果發現 LVDS 信號線不管接不接都顯示純白色,那么極有可能是 LVDS 信號線線序不對,要叫硬件檢查一下。
如果發現不插信號線顯示純白色,接了信號線后就黑屏了,則說明有信號過去了,但 dts 的配置可能不正確。在 disp_timings 節點的 screen-type, lvds-format, out-face 幾個屬性檢查一下。還有就是里面的寬高尺寸,尺寸不對也會黑屏。
關於觸摸屏
筆者手里的屏幕是顯示觸摸一體式的。顯示通過 LVDS 信號線傳輸,觸摸通過 USB 線傳輸。rk3288 只要配好 USB 模式,觸摸板就是即插即用的。觸摸板的 USB 口插入后會有如下打印提示
EHCI: rk_ehci_hcd_enable, enable host controller usb 3-1: new full-speed USB device number 3 using ohci-rockchip usb 3-1: New USB device found, idVendor=222a, idProduct=0001 usb 3-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0 usb 3-1: Product: ILITEK-TP usb 3-1: Manufacturer: ILITEK input: ILITEK ILITEK-TP as /devices/ff520000.usb/usb3/3-1/3-1:1.0/input/input3 gpufreq_input_connect hid-multitouch 0003:222A:0001.0002: input,hiddev0,hidraw0: USB HID v1.10 Mouse [ILITEK ILITEK-TP] on usb-ff520000.usb-1/input0 rockchip-rt5631 rockchip-rt5631.30: ASoC: CODEC (null) not registered rockchip_rt5631_audio_probe() register card failed:-517 platform rockchip-rt5631.30: Driver rockchip-rt5631 requests probe deferral rockchip-rt3261 rockchip-rt3224.31: ASoC: CODEC (null) not registered rockchip_rt3261_audio_probe() register card failed:-517 platform rockchip-rt3224.31: Driver rockchip-rt3261 requests probe deferral
觸摸驅動代碼主要在
./kernel/drivers/hid/hid-multitouch.c
筆者在適配觸摸板時發現觸摸坐標點發生了翻轉,即屏幕的右下角變成了“坐標原點”。很有可能是驅動程序不匹配導致的。但是偏偏筆者又弄不到合適的驅動程序,所以只能改現有驅動。改動的地方倒也很小,只需將接收並傳遞觸摸坐標的地方將坐標轉換一下就好了。
整個操作都在上面提到的 hid-multitouch.c 中實現。首先記錄下觸摸板的尺寸,然后在轉發坐標時做一下翻轉。具體如下