转自:https://blog.csdn.net/vonchn/article/details/80784579

ARM40-A5应用——fbset与液晶屏参数的适配

2018.6.18

版权声明:本文为博主原创文章,允许转载。

在ARM板卡上使用某个型号的LCD,往往要修改LCD驱动程序或者设备树,很不方便。

在ARM40-A5中,我们把常用的LCD型号的配置指令存放在 /etc/init.d/S01user1lcd 文件中,通过修改该文件,即可非常方便的适配不同的LCD。

对于 /etc/init.d/S01user1lcd 文件中未包含的LCD型号,也可通过本文介绍的方法,方便的自行在该文件中添加新的LCD型号。

一、Linux fbset 指令介绍

fbset指令可用于设置framebuffer缓冲区的大小,还能调整画面分辨率,位置,高低宽窄,色彩深度,并可决定是否启动显卡之各项硬件特性。

语法

fbset [-ahinsvVx][-db <信息文件>][-fb <外围设备代号>][--test][显示模式]

参数:

二、fbset 指令在ARM40-A5上的应用

在 /etc/init.d/S01user1lcd 文件中,有如下的内容:

#for TM028HDHG59

#fbset -fb /dev/vfb -g 240 320 240 320 24 -t 142857 38 10 8 4 10 4

#for TM035kdh03,vrefresh=36

#fbset -fb /dev/vfb -g 320 240 320 240 24 -t 254320 19 50 10 13 20 1

#for at043tn24 and G043FW01

#fbset -fb /dev/vfb -g 480 272 480 272 24 -t 180000 2 41 2 11 2 2

#for AT070TN92

#fbset -fb /dev/vfb -g 800 480 800 480 24 -t 30030 210 41 22 21 5 2

#for NL084SV01L

#fbset -fb /dev/vfb -g 800 600 800 600 24 -t 26040 200 12 5 15 12 5

#for A104SN03

#fbset -fb /dev/vfb -g 800 600 800 600 24 -t 25000 40 88 1 24 128 3

例如我们现在要使用 NL084SV01L 这一款LCD,则取消LCD配置指令前面的注释,改为:

fbset -fb /dev/vfb -g 800 600 800 600 24 -t 26040 200 12 5 15 12 5

保存后,reboot 重启 ARM40-A5,即已适配 NL084SV01L,然后可用《ARM40-A5应用程序——液晶屏触摸屏测试程序》介绍的方法,对LCD做简单的测试,观察适配是否完美。

LCD的接线情况,需参阅ARM40-A5的硬件文档、TCON板文档、以及LCD本身的数据手册。

三、fbset 指令参数详解

仍以 NL084SV01L 液晶屏为例,根据该LCD的数据手册,可知其部分参数:

图1

我们参照图1的 Timing characteristics 表格对 fbset -fb /dev/vfb -g 800 600 800 600 24 -t 26040 200 12 5 15 12 5 中的参数进行解析。

(1)fbset 指令中 -g 800 600 800 600 24 的前两个参数为XRES和YRES,是液晶屏的分辨率,对应于图1中的 thd 和 tvd 。第5个参数24为色彩深度,对于ARM40-A5,若硬件接线为888,则色彩深度为24;若硬件接线为666,则色彩深度为18.

(2)fbset 指令中 -t 26040 200 12 5 15 12 5 的参数,名称依次为 PIXCLOCK、LEFT、RIGHT、UPPER、LOWER、HSLEN、VSLEN,其中:(实际数值与LCD数据手册中的可能稍有差异,需根据调试的情况决定实际数值)

LEFT值200为HBP,“HS Back Porch”;

RIGHT值12为HFP,“HS Front Porch”;

HSLEN值12为HPW或HWH,“HS pluse width”;

XRES+LEFT+RIGHT+HSLEN 应等于 th 的值 1024(CLK),有的LCD给出的 th 值是一个范围,则 XRES+LEFT+RIGHT+HSLEN 的值应在 th 的范围内。

由于 NL084SV01L 未给出LEFT、RIGHT、HSLEN三者的值,本文中三者的值由实际调试得来,其意义在第四节讲解。

UPPER值5为VBP,“VS Back Proch”;

LOWER值15为VFP,“VS Front Porch”;

VSLEN值5为VPW或VWH,“VS pulse width”;

YRES+UPPER+LOWER+VSLEN 应等于 tv 的值 625(H),有的LCD给出的 tv 值是一个范围,则 YRES+UPPER+LOWER+VSLEN 的值应在 tv 的范围内。

由于 NL084SV01L 未给出UPPER、LOWER、VSLEN三者的值,本文中三者的值由实际调试得来,其意义在第四节讲解。

注意:

不同的型号的LCD和CPU/GPU,“VS pulse width”、“VS Front Porch”等术语和缩写会有差异,请注意理解其实质,避免因为术语和缩写的不同产生误解。本文亦未严格统一术语和缩写。

PIXCLOCK的计算公式:

① 假定LCD的刷新率为60Hz,则

(XRES+LEFT+RIGHT+HSLEN) * (YRES+UPPER+LOWER+VSLEN) * 60

= 1024 * 625 * 60 = 38400000

② PIXCLOCK = 10^12/38400000 = 26040

③ 上述计算方式可以这样理解:

th * tv * 刷新率 = fclk                                   // fclk = 1/tc

按实际取的值,计算fclk为:

fclk = 1024 * 625 * 60 = 38.4 MHz               // 与数据手册中的的典型值 1/tc = 38.362MHz 极为接近

PIXCLOCK = tc = 1 / fclk = 26042 (ps)        // 实际取值26040,与数据手册中的典型值26067很接近

上述计算,可参照 AT070TN92、A104SN03等其它液晶屏进一步理解。

液晶屏 fbset 参数的调试,应以其数据手册为基本依据,根据测试时图像的显示情况,反复多次调整,方能得到理想的参数。

四、LCD参数的时序解析

4.1、VSLEN与HSLEN

仍以 NL084SV01L 液晶屏为例,其分辨率为800 * 600,若刷新率为60时,每秒LCD刷 800 * 600 * 60 个像素。 而CPU/GPU 不可能恰好给出 800 * 600 * 60 个像素的信号,这样LCD会无法确知信号的起始和结束,因此需要给信号添加一些标识,方便识别。这一帧信号与下一帧信号之间需要增加一个标识,宽度为VSLEN,为方便行文,以VSLEN指代这个标识。一行信号与下一行信号之间,也需要增加一个标识,宽度为HSLEN,即以HSLEN指代这个标识。

在其它资料中,我们也可以看到类似场同步和行同步的描述:LCD的垂直同步(Vertical Sync),用来表示一帧(Frame)图像的起始的,有的时候也会被称为场同步(即VSLEN);而水平同步(Horizontal Sync),则是用来表示一行像素点(即一帧图像中的一行)的起始的,有的时候也会被称为行同步(即HSLEN)。

4.2、LEFT、RIGHT、UPPER、LOWER

但是,除了给信号添加标识以外,剩余的信号,仍难以恰好是 800 * 600 * 60 个像素,因为这样就要求CPU/GPU与LCD的时序严格同步,实际上有困难。因此,除了VSLEN和HSLEN标识以外,VSLEN和HSLEN的前后,都需要一段时间的空白。VSLEN前的空白为LOWER,其后的空白为UPPER。HSLEN前的空白为RIGHT,其后的空白为LEFT。

我们结合图2、图3做进一步的讲解,在很多LCD数据手册中,都能看到图2、图3,或类似的时序图。

图2

对 fbset -fb /dev/vfb -g 800 600 800 600 24 -t 26040 200 12 5 15 12 5 来说:

VSLEN值5为“VS pulse width”,即图2中的 tvp;

UPPER值5为“VS Back Proch”,即图2中的 tvb;

LOWER值15为“VS Front Porch”,即图2中的 tvf;

YRES值600为“Vertial Display period”,即图2中的 tvd;

YRES+UPPER+LOWER+VSLEN值625为“Vertical Cycle”,即图中的 tv;

注意:

① VSLEN 前面的空白为LOWER(tvf),其后的空白为UPPER(tvb),可与下文的图5相应证。

② VSLEN、UPPER、LOWER、YRES的单位是PIXCLOCK。

图3

对 fbset -fb /dev/vfb -g 800 600 800 600 24 -t 26040 200 12 5 15 12 5 来说:

HSLEN值12为“HS pulse width”,即图3中的 thp;

LEFT值200为“HS Back Proch”,即图3中的 thb;

RIGHT值12为“HS Front Porch”,即图3中的 thf;

XRES值800为“Hertial Display period”,即图3中的 thd;

XRES+LEFT+RIGHT+HSLEN值1024为“Horizontal Cycle”,即图3中的 th;

注意:

① HSLEN前的空白为RIGHT,即上图thd后面的一段;HSLEN后的空白为LEFT,即上图中thd前面的一段,可与下文的图5对照理解。

② HSLEN、LEFT、RIGHT、XRES的单位是H,即“Horizontal Cycle”,1H = 1024 * PIXCLOCK。

4.3、DE

图4进一步图示了LEFT、RIGHT、UPPER、LOWER、XRES、YRES、VSLEN、HSLEN的关系。

另外,图4中没有使用行同步HS、场同步VS信号,而是使用另一种常见的DE信号,DE信号相对HS、VS来说,只有一根线,其作用仍旧是标识。其中:

UPPER+LOWER+VSLEN = tvdh + tvds + tvp = tv - tvd

LEFT+RIGHT+HSLEN = th - thd

我们经常会碰到LCD数据手册仅给出了DE的时序图,只有tv、tvd、th、thd的数值,这时只有依据上面两个公式,通过反复调试,得到最佳的 fbset 参数。

图4

五、LCD参数的空间域解析

Linux 操作系统源码的 Documentation/fb/framebuffer.txt 文件中,给出了LCD参数的空间域解析,见图5所示。

图5

Documentation/fb/framebuffer.txt 文件中对图5的解释摘录如下:

The frame buffer device expects all horizontal timings in number of dotclocks (in picoseconds, 1E-12 s), and vertical timings in number of scanlines.

The frame buffer device uses the following fields:

- pixclock: pixel clock in ps (pico seconds)

- left_margin: time from sync to picture                // 行同步信号后肩,“HS Back Proch”

- right_margin: time from picture to sync              // 行同步信号前肩,“HS Front Proch”

- upper_margin: time from sync to picture            // 场同步信号后肩,“VS Back Porch”

- lower_margin: time from picture to sync            // 场同步信号前肩,“VS Front Porch”

- hsync_len: length of horizontal sync                   // 行同步信号脉宽,“HS pulse width”

- vsync_len: length of vertical sync                       // 场同步信号脉宽,“VS pulse width”

下面的三张图是《Configuring the LCD Controller of SAMA5D3x Devices》中给的一个计算实例:

六、常见问题

刷新率

有些LCD的刷新率不高,甚至远低于其数据手册中的典型值,此时可以尝试较低的刷新率,例如30、36、40等。

LEFT、RIGHT、UPPER、LOWER

图5转动180°后,LEFT、RIGHT、UPPER、LOWER会两两互换。难以调通时,可以尝试互换LEFT与RIGHT,UPPER与LOWER。

spwg和jeida

液晶屏的接线有spwg和jeida两种接法,请根据LCD数据手册,正确接线。

fbset

本文的fbset与液晶屏参数的适配,仅针对ARM40-A5产品;其它产品极少有类似便利的方法。

参考文章:

Linux fbset命令

https://wizardforcel.gitbooks.io/tutorialspoint-misc/content/linux-ref/316.html

https://www.zzxworld.com/linux/commands/fbset

BusyBox - The Swiss Army Knife of Embedded Linux,Chapter 3. BusyBox Commands,fbset

http://www.spblinux.de/2.0/doc/fbset.html

ABLE User Guide,Chapter 17. Framebuffer commands,fbset

http://www.simtec.co.uk/products/SWABLE/files/userguide-v2.54/userguide/command_fbset.html

NL084SV01L液晶屏数据手册

NL6448BC33-59液晶屏数据手册

Linux 操作系统源码 Documentation/fb/framebuffer.txt 文件

Mstar ScalerTiming调整

LCD RGB 控制技术 时钟篇(上)

https://blog.csdn.net/Richard_LiuJH/article/details/46352857

LCD RGB 控制技术 时钟篇(下)

https://blog.csdn.net/richard_liujh/article/details/46363483

Configuring the LCD Controller of SAMA5D3x Devices

荟聚计划:共商 共建 共享 Grant

ARM40-A5应用——fbset与液晶屏参数的适配【转】的更多相关文章

  1. s3c2440液晶屏驱动 (内核自带) linux-4.1.24

    自带有一部分驱动的配置信息,只要修改这部分就能支援 不同的液晶屏 - /arch/arm/mach-s3c24xx/mach-smdk2440.c 另一部分在 /drivers/video/fbdev ...

  2. 51单片机 | 实现SMC1602液晶屏显示实例

    ———————————————————————————————————————————— LCD1602 - - - - - - - - - - - - - - - - - - - - - - - - ...

  3. 使用Proteus模拟操作HDG12864F-1液晶屏

    在Proteus中模拟了89C52操作HDG12864F-1液晶屏,原理图如下: 一.HDG12864F-1官网信息 该液晶屏是Hantronix的产品,官网上搜索出这个型号是系列型号中的一种,各种型 ...

  4. 【雕爷学编程】MicroPython动手做(05)——零基础学MaixPy之LCD液晶屏

    配套 2.4寸LCD屏 ST7789驱动器芯片(24P 320X240) ST7789驱动器芯片2.4寸LCD屏(24P 320X240)主要参数 1. 模块名称:液晶显示模块2. 型号:KD024C ...

  5. 联盛德 HLK-W806 (六): I2C驱动SSD1306 128x64 OLED液晶屏

    目录 联盛德 HLK-W806 (一): Ubuntu20.04下的开发环境配置, 编译和烧录说明 联盛德 HLK-W806 (二): Win10下的开发环境配置, 编译和烧录说明 联盛德 HLK-W ...

  6. 联盛德 HLK-W806 (八): 4线SPI驱动SSD1306/SSD1315 128x64 OLED液晶屏

    目录 联盛德 HLK-W806 (一): Ubuntu20.04下的开发环境配置, 编译和烧录说明 联盛德 HLK-W806 (二): Win10下的开发环境配置, 编译和烧录说明 联盛德 HLK-W ...

  7. Arduino 1602液晶屏实验和程序

    在Arduino IDE中, 项目->加载库->管理库中搜索LiquidCrystal,然后安装即可 1.接线图 2.引脚图 3.最简单程序 #include <LiquidCrys ...

  8. RK3288 mipi屏参数配置文件

    RK3288     Android 5.1系统     Linux 3.10 mipi屏参数配置文件所在的路径:kernel/arch/arm/boot/dts/xxx_mipi.dtsi 屏参数配 ...

  9. 拓普微小尺寸TFT液晶屏-高性价比

    智能模块(Smart LCD)是专为工业显示应用而设计的TFT液晶显示模块. 模块自带主控IC.Flash存储器.实时嵌入式操作系统,客户主机可把要存储的数据(如背景图.图标等)存储到屏的flash中 ...

随机推荐

  1. BZOJ 2434 阿狸的打字机 | AC自动机

    题目戳这里 AC自动机上有神奇的东西叫做fail指针--所有fail指针连起来恰好构成一棵以1为根的树! 而这道题问x在y中出现过多少次,就是问Trie树上根到y的结束节点的路径上有多少节点能通过跳f ...

  2. Luogu 2680 NOIP 2015 运输计划(树链剖分,LCA,树状数组,树的重心,二分,差分)

    Luogu 2680 NOIP 2015 运输计划(树链剖分,LCA,树状数组,树的重心,二分,差分) Description L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之 ...

  3. 跟我一起学习vue2(使用命令行搭建单页应用)[二]

    第一步:运行git命令,全局安装 vue-cli $ cnpm install --global vue-cli 第二步: 创建一个基于 webpack 模板的新项目 $ vue init webpa ...

  4. GBDT原理详解

    从提升树出发,——>回归提升树.二元分类.多元分类三个GBDT常见算法. 提升树 梯度提升树 回归提升树 二元分类 多元分类 面经 提升树 在说GBDT之前,先说说提升树(boosting tr ...

  5. hdu 4685(强连通分量+二分图的完美匹配)

    传送门:Problem 4685 https://www.cnblogs.com/violet-acmer/p/9739990.html 参考资料: [1]:二分图的最大匹配.完美匹配和匈牙利算法 [ ...

  6. EOJ2018.10 月赛

    EOJ2018.10 月赛 题目一览表(Green color indicate understand and Accept) 来源 考察知识点 完成时间 A oxx 的小姐姐们 EOJ 数学+思维 ...

  7. 在kubernetes中运行单节点有状态MySQL应用

    Deploy MySQL https://kubernetes.io/docs/tasks/run-application/run-single-instance-stateful-applicati ...

  8. Eclipse启动时出现错误 An internal error occurred during: "Updating indexes"

    在Eclipse的workspace下有个.metadata文件夹,Eclipse出现异常的log文件就在这个目录下. 最近出现了这样的错误: 查看日志文件发现:     !ENTRY org.ecl ...

  9. maven中修改可用的版本

    一般情况下,我们都是建项目,写代码,然后再部署运行的.到最后因为版本问题无法部署的情况下怎么办?重新建项目,然后导代码,这太麻烦了. 一般的处理情况:在项目的硬盘目录中,找到.setting文件夹下的 ...

  10. jackson用法

    ObjectMapper mapper=new ObjectMapper(); //3.调用mapper的writeValueAsString()方法把一个对象或集合转为json字符串 Custome ...