一、lcd
看着这个 4.3 寸的屏幕一直没有亮过感觉莫名伤感,还是想让他可以发光发热。
RGB lcd 硬件原理也就不讲了,网上有很多文章都有介绍。kernel 里是有 4412 lcd 的驱动,所以只要配置好设备树就可以使用了。
&pinctrl_0 {
lcd_backlight: lcd_backlight {
samsung,pins = "gpd0-1";
samsung,pin-function = <EXYNOS_PIN_FUNC_OUTPUT>;
samsung,pin-pud = <EXYNOS_PIN_PULL_NONE>;
samsung,pin-drv = <EXYNOS4_PIN_DRV_LV1>;
samsung,pin-val = <1>;
};
};
&pinctrl_1 {
lcd_power: lcd_power{
samsung,pins = "gpl0-4";
samsung,pin-function = <EXYNOS_PIN_FUNC_OUTPUT>;
samsung,pin-pud = <EXYNOS_PIN_PULL_NONE>;
samsung,pin-drv = <EXYNOS4_PIN_DRV_LV1>;
samsung,pin-val = <1>;
};
};
&fimd {
pinctrl-0 = <&lcd_clk &lcd_data24 &lcd_power &lcd_backlight>;
pinctrl-names = "default";
status = "okay";
samsung,invert-vclk; // 翻转
display-timings {
native-mode = <&timing0>;
timing0: timing {
hsync-active = <1>; // 行同步信号开始位高
vsync-active = <1>;
de-active = <0>;
clock-frequency = <24000000>;
hactive = <480>;
vactive = <272>;
hfront-porch = <40>;
hback-porch = <220>;
hsync-len = <60>;
vback-porch = <7>;
vfront-porch = <21>;
vsync-len = <10>;
};
};
};
不过刚配置好 dts 启动板子后会发现 lcd 白屏,再结合启动 log,可以确定应该是时钟过低。
[ 2.284053] exynos4-fb 11c00000.fimd: [drm:fimd_atomic_check] *ERROR* sclk_fimd clock too low(1500000) for requested pixel clock(24000000)
如果把上面设备树中的 clock-frequency
修改为 600000
, 就会变成这样:
肉眼可见的刷新率,说明时钟过低,需要提高时钟,不过很奇怪的是从 lcd driver 源码中 (似乎) 没有看到通过 dts 配置来设置时钟,只好修改 kernel 代码来修改这个时钟了。
- 在
vim vim drivers/clk/samsung/clk-exynos4.c
中的exynos4_clk_init()
函数的最后添加如下代码:
struct clk *sclk_fimd0;
sclk_fimd0 = __clk_lookup("sclk_fimd0");
if (IS_ERR(sclk_fimd0)) {
pr_info("failed to get sclk_fimd0 clock\n");
return ;
}
if (clk_set_rate(sclk_fimd0, 800000000)) {
pr_info("failed to clock set rate\n");
return ;
}
pr_info("[xhr4412] sclk_fimd0 clk rate = %ld\n", clk_get_rate(sclk_fimd0));
再次烧写启动板子,就可以正常显示了。
二、touchscreen
触摸屏就更简单了,kernel 中仍然是有触摸屏驱动的,所以配置好 dts,将驱动编译进 kernel 即可。
&pinctrl_1 {
tsc2007_irq: tsc2007_irq{
samsung,pins = "gpx0-0";
samsung,pin-function = <EXYNOS_PIN_FUNC_INPUT>;
samsung,pin-pud = <EXYNOS_PIN_PULL_NONE>;
samsung,pin-drv = <EXYNOS4_PIN_DRV_LV1>;
};
};
&i2c_7 {
samsung,i2c-sda-delay = <100>;
samsung,i2c-slave-addr = <0x10>;
samsung,i2c-max-bus-freq = <40000>;
pinctrl-0 = <&i2c7_bus>;
pinctrl-names = "default";
status = "okay";
tsc2007: tsc2007@48 {
compatible = "ti,tsc2007";
reg = <0x48>;
pinctrl-names = "default";
pinctrl-0 = <&tsc2007_irq>;
interrupt-parent = <&gpx0>;
interrupts = <0 IRQ_TYPE_EDGE_FALLING>;
gpios = <&gpx0 0 0>;
ti,x-plate-ohms = <660>;
status = "okay";
};
};
三、tslib
- 官方网站:http://www.tslib.org/
- The latest release is version 1.21 including libts library version 0.10.3, released on the 22nd of October 2019
获得源码包后:
tar Jxvf tslib-1.22.tar.xz
cd tslib-1.22/
./autogen.sh
mkdir out
./configure --host=arm-none-linux-gnueabihf --prefix=$(pwd)/out
make
make install
cd out/
cp -rdp * $ROOTFS_DIR # 复制到跟文件系统
在开发板上设置环境变量:
export TSLIB_TSDEVICE=/dev/input/event0
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONFFILE=/etc/ts.conf
export TSLIB_PLUGINDIR=/lib/ts
export TSLIB_CONSOLEDEVICE=none # 终端控制台设为 NULL
export TSLIB_FBDEVICE=/dev/fb0
拷贝到 xhr4412
后,使用命令 ts_calibrate
,然后在屏幕上点击,进行校准。
校准成功后,再使用命令 ts_test
进行测试。