硬件_IMX6ULL的LCD控制器

news2024/11/18 15:45:22

硬件_IMX6ULL的LCD控制器


文章目录

  • 硬件_IMX6ULL的LCD控制器
    • 一、 LCD控制器模块介绍
      • 1.1 硬件框图
      • 1.2 数据传输与处理
      • 1.3 时序控制
    • 二、 LCD控制器寄存器简介
      • 2.1 LCDIF_CTRL寄存器
      • 2.2 LCDIF_CTRL1寄存器
      • 2.3 LCDIF_TRANSFER_COUNT寄存器
      • 2.4 LCDIF_VDCTRL0寄存器
      • 2.5 LCDIF_VDCTRL1寄存器
      • 2.6 LCDIF_VDCTRL2寄存器
      • 2.7 LCDIF_VDCTRL3寄存器
      • 2.8 LCDIF_VDCTRL4寄存器
      • 2.9 LCDIF_CUR_BUF寄存器
      • 2.10 LCDIF_NEXT_BUF寄存器
  • 致谢



一、 LCD控制器模块介绍

1.1 硬件框图

IMX6ULL的LCD控制器名称为eLCDIF(Enhanced LCD Interface,增强型LCD接口),主要特性如下:

  • 支持MPU模式:有些显示屏自带显存,只需要把命令、数据发送给显示屏即可;就是前面讲的8080接口
  • VSYNC模式:跟MPU模式类似,多了VSYNC信号。针对高速数据传输(行场信号)
  • 支持DOTCLK模式:RGB接口,就是前面讲的TFT-RGB接口
  • 支持ITU-R BT.656接口,可以把4:2:2 YcbCr格式的数据转换为模拟电视信号
  • 8/16/18/24/32 bit 的bpp数据都支持,取决于IO的复用设置及寄存器配置
  • MPU模式,VSYNC模式,DOTCLK模式,都可以配置时序参数。
    在这里插入图片描述上图是IMX6ULL的LCD控制器框图。
    我们在内存中划出一块内存,称之为显存,软件把数据写入显存。
    设置好LCD控制器之后,它会通过AXI总线协议从显存把RGB数据读入FIFO,再到达LCD接口(LCD Interface)。
    LCD控制器有两个时钟域:外设总线时钟域,LCD像素时钟域。前者是用来让LCD控制器正常工作,后者是用来控制电子枪移动。
    上图的Read_Data操作,在MPU模式下才用到;我们采用的是DCLK模式,因此不予考虑。

更详细的内容可以查看IMX6ull芯片手册《Chapter 34 Enhanced LCD Interface (eLCDIF)》。

1.2 数据传输与处理

  • 框图:
    在这里插入图片描述

1.3 时序控制

看寄存器说明。

二、 LCD控制器寄存器简介

查看任何芯片的LCD控制器寄存器时,记住几个要点:

① 怎么把LCD的信息告诉LCD控制器:即分辨率、行列时序、像素时钟等;
② 怎么把显存地址、像素格式告诉LCD控制器。

在这里插入图片描述
上图是我们将要使用到的寄存器,下面逐个讲解这些寄存器,在后续的LCD控制编程实验会用到。

2.1 LCDIF_CTRL寄存器

在这里插入图片描述

位域读写描述
[31]SFTRSTR/W软件复位,正常工作时应设为0;如果设为1,它会复位整个LCD控制器
[30]CLKGATER/W时钟开关, 0:正常工作时要设置为0; 1:关闭LCD控制器时钟
[29]YCBCR422_INPUTR/W使用RGB接口时,设置为0;其他接口我们暂时不关心
[28]READ_WRITEBR/W使用RGB接口时,设置为0;其他接口我们暂时不关心
[27]WAIT_FOR_VSYNC_EDGER/W在VSYNC模式时,设置为1;我们不关心
[26]DATA_SHIFT_DIRR/W在DVI模式下才需要设置,我们不关心
[25:21]SHIFT_NUM_BITSR/W在DVI模式下才需要设置,我们不关心
[20]DVI_MODER/W设置为1时,使用DVI模式,就是ITU-R BT.656数字接口
[19]BYPASS_COUNTR/WDOTCLK和DVI模式下需要设置为1;MPU、VSYNC模式时设为0
[18]VSYNC_MODER/W使用VSYNC模式时,设置为1
[17]DOTCLK_MODER/W使用DOTCLK模式时,设置为1;本实验用的就是这个模式
[16]DATA_SELECTR/WMPU模式下才用到,我们不关心
[15:14]INPUT_DATA_SWIZZLER/W显存中像素颜色的数据转给LCD控制器时,字节位置是否交换:
0x0:NO_SWAP,不交换;
0x0:LITTLE_ENDIAN,小字节序,跟NO_SWAP一样;
0x1:BIG_ENDIAN_SWAP,字节0、3交换;字节1、2交换;
0x1:SWAP_ALL_BYTES,字节0、3交换;字节1、2交换;
0x2:HWD_SWAP,半字交换,即0x12345678转为0x56781234
0x3:HWD_BYTE_SWAP,在每个半字内部放换字节, 即0x12345678转换为0x34127856
[13:12]CSC_DATA_SWIZZLER/W显存中的数据被传入LCD控制器内部并被转换为24BPP后,在它被转给LCD接口之前,字节位置是否交换: 0x0:NO_SWAP,不交换; 0x0:LITTLE_ENDIAN,小字节序,跟NO_SWAP一样; 0x1:BIG_ENDIAN_SWAP,字节0、3交换;字节1、2交换; 0x1:SWAP_ALL_BYTES,字节0、3交换;字节1、2交换; 0x2:HWD_SWAP,半字交换,即0x12345678转为0x56781234 0x3:HWD_BYTE_SWAP,在每个半字内部放换字节, 即0x12345678转换为0x34127856
[11:10]LCD_DATABUS_WIDTHR/WLCD数据总线宽度,就是对外输出的LCD数据的位宽, 0x0:16位; 0x1:8位; 0x2:18位; 0x3:24位
[9:8]WORD_LENGTHR/W输入的数据格式,即显存中每个像素占多少位, 0x0:16位; 0x1:8位; 0x2:18位; 0x3:24位
[7]RGB_TO_YCBCR422_CSCR/W设置为1时,使能颜色空间转换:RGB转为YCbCr
[6]ENABLE_PXP_HANDSHAKER/W当LCDIF_MASTER设置为1时,再设置这位, 则LCD控制器跟PXP之间的握手机制被关闭(我们不关心)
[5]MASTERR/W设置为1时,LCD控制器成为bus master
[4]RSRVD0R/W保留
[3]DATA_FORMAT_16_BITR/WWORD_LENGTH为0时,表示一个像素用16位,此位作用如下: 0:数据格式为ARGB555; 1:数据格式为RGB565
[2]DATA_FORMAT_18_BITR/WWORD_LENGTH为2时,表示一个像素用18位,RGB数据还是保存在32位数据里,此位作用如下: 0:低18位用来表示RGB666,高14位无效 1:高18位用来表示RGB666,低14位无效
[1]DATA_FORMAT_24_BITR/WWORD_LENGTH为3时,表示一个像素用24位,此位作用如下: 0:所有的24位数据都有效,格式为RGB888 1:转给LCD控制器的数据是24位的,但只用到其中的18位, 每个字节用来表示一个原色,每字节中高2位无效
[0]RUNR/W使能LCD控制器,开始传输数据

2.2 LCDIF_CTRL1寄存器

在这里插入图片描述
本实验中使用TFT LCD,LCD控制器使用DOTCLK模式。本寄存器中其他用不到的位,就不介绍了。

位域读写描述
[19:16]BYTE_PACKING_FORMATR/W用来表示一个32位的word中,哪些字节是有效的,即哪些字节是用来表示颜色的。 bit16、17、18、19分别对应byte0、1、2、3;某位为1,就表示对应的字节有效。 默认值是0xf,表示32位的word中,所有字节都有效。 对于8bpp,可以忽略本设置,所有的字节都是有效的; 对于16bpp,bit[1:0]、bit[3:2]分别对应一个字节,组合中的2位都为1时,对应的字节才有效; 对于24bpp,0x7表示32位数据中只用到3个字节,这称为“24 bit unpacked format”,即ARGB,其中的A字节被丢弃
[0]RESETR/W用来复位了接的LCD, 0:LCD_RESET引脚输出低电平; 1:LCD_RESET引脚输出高电平

2.3 LCDIF_TRANSFER_COUNT寄存器

在这里插入图片描述

位域读写描述
[31:16]V_COUNTR/W一帧中,有多少行有效数据
[15:0]H_COUNTR/W一行中,有多少个像素

2.4 LCDIF_VDCTRL0寄存器

在这里插入图片描述
本寄存器用来设置Vsync信号相关的时序,及极性。

位域读写描述
[29]VSYNC_OEBR/W用来控制VSYNC信号,对于DOTCLK模式,设为0, 0:VSYNC是输出引脚,用LCD控制器产生; 1:VSYNC是输入引脚
[28]ENABLE_PRESENTR/W在DOTCLK模式下,硬件是否会产生数据使能信号ENALBE: 0:不产生; 1:产生
[27]VSYNC_POLR/W用来决定VSYNC脉冲的极性, 0:低脉冲; 1:高脉冲
[26]HSYNC_POLR/W用来决定HSYNC脉冲的极性, 0:低脉冲; 1:高脉冲
[25]DOTCLK_POLR/W用来决定DOTCLK的极性, 0:LCD控制器在DOTCLK下降沿发送数据,LCD在上升沿捕获数据; 1:反过来
[24]ENABLE_POLR/W用来决定ENABLE信号的极性, 0:数据有效期间,ENABLE信号为低; 1:反过来
[21]VSYNC_PERIOD_UNITR/W用来决定VSYNC_PERIOD的单位, 0:单位是像素时钟(pix_clk),这在VSYNC模式下使用; 1:单位是“整行”,这在DOTCLK模式下使用
[20]VSYNC_PULSE_WIDTH_UNITR/W用来决定VSYNC_PULSE_WIDTH的单位, 0:单位是像素时钟(pix_clk); 1:单位是“整行”
[19]HALF_LINER/WVSYNC周期是否周加上半行的时间, 0:VSYNC周期=VSYNC_PERIOD; 1:VSYNC周期=VSYNC_PERIOD+HORIZONTAL_PERIOD/2
[18]HALF_LINE_MODER/W0:第1帧将在一行的中间结束,第2帧在一行的中间开始; 1:所有帧结束前都加上半行时间,这样所有帧都会起始于“行的开头”
[17:0]VSYNC_PULSE_WIDTHR/WVSYNC脉冲的宽度

2.5 LCDIF_VDCTRL1寄存器

在这里插入图片描述

位域读写描述
[29]VSYNC_PERIODR/W两个垂直同步信号之间的间隔,即垂直方向同步信号的总周期; 单位由VSYNC_PERIOD_UNIT决定

2.6 LCDIF_VDCTRL2寄存器

在这里插入图片描述
HSYNC_PULSE_WIDTH:水平同步信号脉冲宽度;

​ HSYNC_PERIOD:两个水平同步信号之间的总数,即水平方向同步信号的总周期

位域读写描述
[31:18]HSYNC_PULSE_WIDTHR/WHSYNC脉冲的宽度(单位:pix_clk)
[17:0]HSYNC_PERIODR/W整行的宽度,即两个HYSNC信号之间的宽度(单位:pix_clk)

2.7 LCDIF_VDCTRL3寄存器

在这里插入图片描述

位域读写描述
[29]MUX_SYNC_SIGNALSR/W用不着
[28]VSYNC_ONLYR/W0:DOTCLK模式时必须设置为0; 1:VSYNC模式时必须设置为1
[27:16]HORIZONTAL_WAIT_CNTR/W水平方向上的等待像素个数,等于thp+thb
[15:0]VERTICAL_WAIT_CNTR/W垂直方向上的等待行数,等于tvp+tvb

2.8 LCDIF_VDCTRL4寄存器

在这里插入图片描述

位域读写描述
[31:29]DOTCLK_DLY_SELR/W在LCD控制器内部的DOTCLK输出到LCD_DOTCK引脚时,延时多久: 0:2ns; 1:4ns; 2:6ns; 3:8ns; 其他值保留
[18]SYNC_SIGNALS_ONR/WDOTCLK模式下必须设为1
[17:0]DOTCLK_H_VALID_DATA_CNTR/W水平方向上的有效像素个数(pix_clk),即分辨率的y

2.9 LCDIF_CUR_BUF寄存器

在这里插入图片描述

位域读写描述
[31:0]ADDRR/WLCD控制器正在传输的当前帧在显存中的地址

2.10 LCDIF_NEXT_BUF寄存器

在这里插入图片描述

位域读写描述
[31:0]ADDRR/W下一帧在显存中的地址

LCD控制器传输完当前帧后,会把LCDIF_NEXT_BUF寄存器的值复制到LCDIF_CUR_BUF寄存器。



致谢

以上笔记源自韦东山老师的视频课程,感谢韦老师,韦老师是嵌入式培训界一股清流,为嵌入式linux开发点起的星星之火,也愿韦老师桃李满园。聚是一团火,散是满天星!

在这样一个速食的时代,坚持做自己,慢下来,潜心琢磨,心怀敬畏,领悟知识,才能向下扎到根,向上捅破天,背着世界往前行!
仅此向嵌入行业里的每一个认真做技术的从业者致敬!



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/353102.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基础篇—一文掌握css的边框属性

CSS 边框属性 CSS边框属性允许你指定一个元素边框的样式和颜色。 1、边框样式 边框样式属性指定要显示什么样的边界。 border-style属性用来定义边框的样式 2、边框宽度 您可以通过 border-width 属性为边框指定宽度。 为边框指定宽度有两种方法:可以指定长度值,比如 2px…

检查nmos管是否损坏

NCEP85T14 功率mos管为例 以NMOS举例,只用万用表二极管档测量MOS管的好坏-电子发烧友网 NMOS的D极和S极之间有一个寄生二极管,方向为S到D,利用二极管单向导电性以及MOS管导通时寄生二极管截止的特性,可以快速测量MOS好坏。 1、测…

搭建Hexo博客-第2章-Hexo基本用法

搭建Hexo博客-第2章-Hexo基本用法 搭建Hexo博客-第2章-Hexo基本用法 搭建Hexo博客-第2章-Hexo基本用法 大家好,在上一篇文章中,我们学习了 Git 、GitHub 和 Coding 的基本用法,在这一节中,我将介绍 Hexo 的基本用法。阅读完这篇…

举个栗子~Tableau 技巧(251):统一多个工作表的坐标轴范围

在工作汇报场景,有一个很常见、很多数据粉反馈的需求:同一看板上的两个图表,因为轴范围不一致(如下图),很难直观比较。有什么办法可以统一它们的坐标轴范围呢? 类似需求,不论两个还是…

SpringCloud学习笔记 - @SentinelResource的fallbackblockHandler配置详解 - sentinel

1. sentinel服务负载均衡测试 sentinel默认开启了负载均衡的轮询模式,为了测试sentinel服务负载均衡的效果,需要先创建两个服务提供者和一个服务消费者。 1.1. 分别创建两个服务提供者-支付服务9003、9004 1. 添加pom依赖: 提供者只需要将…

ElementUI中为什么使用this.$refs.form.validate验证成功却直接跳过

ElementUI中为什么使用this.$refs.form.validate验证成功却直接跳过 问题背景 在写一个Vue练手项目时,我使用rulse对表单中用户输入的数据进行校验,但莫名奇妙就发现:当我点击提交表单时,表单中的数据都验证成功了,但是…

SpringBoot分页实现

简介 分页功能是一个简单但必需的功能,在 SpringBoot 中分页实现非常的简单,有多种实现方式;主要和项目集成的持久层框架有关;这里主要介绍集成 MyBatis 和 SpringDataJpa 的分页实现 Mybatis - 使用 PageHelper 分页 首先在 p…

mybatis源码中一级和二级缓存分析

mybatis中,一级缓存的作用域为一个会话内; 二级缓存的作用域为全局的,可在多个会话中使用 1、一级缓存 [此处不讨论开启二级缓存的代码逻辑] 一级缓存的作用域在同一个事物中起作用。真正执行sql的是在 Executor;类图如下; 1.1、生成 Executor对象的…

玩转代码|使用acme.sh在Ubuntu配置Let’s Encrypt免费通配符SSL证书

📣今日作品:使用acme.sh在Ubuntu配置Let’s Encrypt免费通配符SSL证书👦 创作者:Jum朱⏰预计花费:10分钟📖个人主页: Jum朱博客的个人主页acme.sh 是一款方便,强大的 Lets Encrypt 域名证书申请…

反射内存卡读写测试(RFM2gRead和RFM2gWrite)-- C++

一、函数介绍: 1.1 RFM2gWrite STDRFM2GCALL RFM2gWrite( RFM2GHANDLE rh, RFM2G_UINT32 Offset, void *Buffer, RFM2G_UINT32 Length ); 说明: RFM2gWrite()函数将一个或多个I/O数据缓冲区从应用程序传输到RFM2g节点,从指定的对齐内存偏…

InVEST模型 | 02 InVEST模型Python安装

InVEST在生态系统评估领域有着广泛的应用,由于其交互界面简洁直接,大大降低了模型的使用门槛。但当需要多次、多区域的运算时,手动点击的方法十分耗时费力,针对这样的情况,InVEST团队推出了natcap.invest接口&#xff…

Centos7部署Sonic前后端和Agent 端

前言 1、sonic介绍 Sonic是一款开源、支持分布式部署、在线自动化测试的私有云真机平台,Sonic官网地址 功能特性: Sonic架构: 2、准备工作 ①准备两台设备,并安装Centos系统,设备名称简称:设备1和设…

【Java】Java零基础第一节

Java.java 与 .class关于开发环境 - SDK第一个程序 - Hello worldJava程序理解 - Classes, New, Methods and Type.java 与 .class xxx.java文件: 存储的是人类语言可以看懂的高级语言(Language),但是计算机不能看懂; xxx.class文件&#xf…

【YOLO V5】代码复现过程

接上篇,讲到如何从mask转成YOLOv5训练需要的txt数据集格式,这篇就在此基础上进行模型训练预测和部署转换吧! 目录 1.环境准备 2.YOLO训练 2.1 数据集准备 2.2 data.yaml准备 2.3 yolov5.yaml准备 2.4 训练命令 3.YOLO预测 3.1OLOv5 P…

大猫盘 黑群晖 不用Docker 部署属于自己的聊天工具voceChat

引入 原因很简单我有个大猫盘,自己搞成了黑群,不支持Docker,我自己购买了域名,做了ddns解析,给群晖加了ssl证书,感觉既然数据安全了,服务也在自己家里能不能搭建一个自己的聊天软件&#xff0c…

windows下nvvp的基础使用1

windows下nvvp的基础使用1 cuda编程的重要帮手可视化工具nvvp 本来先写nsignt的使用方式,不过折腾了一会发现没弄得那么明白.先用着nvvp好了,毕竟只是先看书配合着写点简单的cuda代码而已 安装建议 在windows下安装cuda的话,也就那回事,自己可以参考一下搜索引擎 (win10安…

一次漏洞挖掘的简单组合拳

前言: 在最近的wxb举行hw中,同事让我帮他看看一些后台登录站点。尝试了未授权,弱口令皆无果,要么不存在弱口令,要么有验证码,没办法绕过。本文章仅提供一个思路,在hw中更多时候并不推荐尝试这种…

给正在注册或即将注册个体工商户营业执照的你

大家好,我是中国码农摘星人。 欢迎分享/收藏/赞/在看! 作为程序员,平时除了主业,发展一些副业再正常不过。为了取得开展业务的合法性、合规性,以及后续的拓展,避免产生不必要的纠纷,这边就得注册…

ChatGPT真的会取代程序员吗?

程序员这两年被碰的瓷儿可不少啊,这架势不像是AI抢了程序员的饭碗,倒像是程序员抢了AI的饭碗一样...... 前两年低代码出来了,你们说程序员要被取代了,惹得大神们一顿输出;去年元宇宙出来了,你们又说程序员…

map相关接口(map接口、HashMap、LinkedHashMap、TreeMap)

Java知识点总结:想看的可以从这里进入 目录8.3、map结构8.3.1、 map接口8.3.2、HashMap8.3.3、LinkedHashMap8.3.4、TreeMap8.3、map结构 8.3.1、 map接口 map的集合是以键值对的形式存在的 (key-value),每个键只能对应一个值,通常通过键去…