TQ2440移植u-boot2016.11全过程记录-【4】LCD驱动移植并显示

2023-11-11

TQ2440移植u-boot2016.11-LCD驱动移植并显示


LCD初始化流程分析

u-boot的LCD初始化代码是在common/lcd.c中,我们找到lcd_init函数:
在这里插入图片描述
该函数功能流程为:lcd_ctrl_init初始化了LCD的硬件参数---->开辟LCD的帧缓冲(缓冲基地址保存在了gd->fs_base变量中)—>清屏—>使能LCD—>设置LCD控制台参数

lcd_ctrl_initlcd_enable函数是u-boot抽离出的函数接口,需要根据LCD的实际情况进行底层硬件的初始化操作实现这两个函数;除此之外还需要定义一个名为panel_infovidinfo_t结构类型变量,该结构变量保存了LCD屏幕的大小和颜色位深,用于LCD屏幕的控制台显示。


LCD驱动移植

我的屏幕是W43,分辨率480x272,驱动编写参考的TQ2440官方的LCD屏幕驱动代码修改而来。

添加LCD的相关配置宏:
gedit include/configs/tq2440.h

末尾添加如下代码:

/*
 * LCD configuration
 */
#define CONFIG_LCD                        /* 该宏用于添加进LCD相关的编译项 */
#define LCD_BPP LCD_COLOR16               /* 每像素为16bits */
#define CONFIG_LCD_LOGO                   /* 显示LOGO */
#define CONFIG_LCD_INFO                   /* 显示用户自定义信息 */
#define CONFIG_LCD_INFO_BELOW_LOGO        /* 用户自定义信息与LOGO的位置无关 */
#define CONFIG_SYS_WHITE_ON_BLACK         /* 黑底白字 */
#define CONFIG_SYS_CONSOLE_IS_IN_ENV      /* 控制台接收自环境变量 */
#define CONFIG_CONSOLE_MUX                /* 定义该宏可支持将打印信息同时输出到串口和LCD */
#define CONFIG_CONSOLE_SCROLL_LINES 16    /* 屏幕显示总行数 */

/* 以下三个宏为我自己定义的 */
#define CONFIG_TQ2440_LCD                  /* 该宏用于将tq2440_lcd.c文件编译进来 */
#define LCD_XSIZE_TFT 480                  /* LCD行数 */
#define LCD_YSIZE_TFT 272                  /* LCD列数 */

#define MVAL      13
#define MVAL_USED 0           /* 0:each frame    1:rate by MVAL */
#define INVVDEN   1           /* 0:normal        1:inverted     */
#define BSWP      0           /* byte swap control              */
#define HWSWP     1           /* half word swap control         */

#define CONFIG_TQ2440_LCD_VBPD    1
#define CONFIG_TQ2440_LCD_VFPD    1
#define CONFIG_TQ2440_LCD_VSPW    9
#define CONFIG_TQ2440_LCD_HBPD    1
#define CONFIG_TQ2440_LCD_HFPD    1
#define CONFIG_TQ2440_LCD_HSPW    40
#define CONFIG_TQ2440_LCD_CLKVAL  4

添加tq2440的LCD文件:

gedit drivers/video/tq2440_lcd.c

粘贴进如下代码:

#include <common.h>
#include <lcd.h>
#include <asm/system.h>
#include <asm/gpio.h>
#include <asm/arch/s3c24x0_cpu.h>
#include <lcd.h>
#include <version.h>

DECLARE_GLOBAL_DATA_PTR;    /* 导入gd_t结构变量gd */

/* to get lower 21bits */
#define M5D(n) ((n) & 0x1FFFFF)

vidinfo_t panel_info =
{
    .vl_col  = LCD_XSIZE_TFT,    /* 列数 */
    .vl_row  = LCD_YSIZE_TFT,    /* 行数 */
    .vl_bpix = LCD_BPP,          /* 像素位数为16bits,该宏在tq2440.h中被定义 */
};

/* 将LCD缓冲数组转为二维数组来用 */
#define tq2440_lcd_frame_pbuf ((volatile unsigned short (*)[LCD_XSIZE_TFT])(gd->fb_base))

void tq2440_lcd_clear_screen(unsigned short color)
{
    int x = 0, y = 0;

    for (y = 0; y < LCD_YSIZE_TFT; y++)
    {
        for (x = 0; x < LCD_XSIZE_TFT; x++)
        {
            tq2440_lcd_frame_pbuf[y][x] = color;
        }
    }
}

void lcd_ctrl_init(void* lcdbase)
{
    char vbpd = 0;
    char vfpd = 0;
    char vspw = 0;
    char hbpd = 0;
    char hfpd = 0;
    char hspw = 0;
    char clkval = 0;
    char* lcdenv = NULL;
    struct s3c24x0_gpio* const gpio = s3c24x0_get_base_gpio();
    struct s3c24x0_lcd*  const lcd  = s3c24x0_get_base_lcd();

    /* set lcd frame buffer start adddress */
    lcd->lcdsaddr1 = (((unsigned int)tq2440_lcd_frame_pbuf >> 22) << 21) | M5D((unsigned int)tq2440_lcd_frame_pbuf >> 1);

    /* set lcd frame buffer end adddress */
    lcd->lcdsaddr2 = M5D(((unsigned int)tq2440_lcd_frame_pbuf + (LCD_XSIZE_TFT * LCD_YSIZE_TFT * 2)) >> 1);

    /* set virtul screen page wigth */
    lcd->lcdsaddr3 = (((LCD_XSIZE_TFT - LCD_XSIZE_TFT) / 1) << 11) | (LCD_XSIZE_TFT / 1);

    lcdenv = getenv("dwVBPD");
    vbpd = lcdenv ? (int)simple_strtol(lcdenv, NULL, 10) : CONFIG_TQ2440_LCD_VBPD;

    lcdenv = getenv("dwVFPD");
    vfpd = lcdenv ? (int)simple_strtol(lcdenv, NULL, 10) : CONFIG_TQ2440_LCD_VFPD;

    lcdenv = getenv("dwVSPW");
    vspw = lcdenv ? (int)simple_strtol(lcdenv, NULL, 10) : CONFIG_TQ2440_LCD_VSPW;

    lcdenv = getenv("dwHBPD");
    hbpd = lcdenv ? (int)simple_strtol(lcdenv, NULL, 10) : CONFIG_TQ2440_LCD_HBPD;

    lcdenv = getenv("dwHFPD");
    hfpd = lcdenv ? (int)simple_strtol(lcdenv, NULL, 10) : CONFIG_TQ2440_LCD_HFPD;

    lcdenv = getenv("dwHSPW");
    hspw = lcdenv ? (int)simple_strtol(lcdenv, NULL, 10) : CONFIG_TQ2440_LCD_HSPW;

    lcdenv = getenv("dwCLKVAL");
    clkval = lcdenv ? (int)simple_strtol(lcdenv, NULL, 10) : CONFIG_TQ2440_LCD_CLKVAL;

    /* clear screen */
    tq2440_lcd_clear_screen(0x0000);

	/* initialize VD[7:0] */
	gpio->gpcup  = 0xFFFFFFFF;
	gpio->gpccon = 0xAAAAAAAA;

	/* initialize VD[15:8] */
	gpio->gpdup  = 0xFFFFFFFF;
	gpio->gpdcon = 0xAAAAAAAA;
	
    /* lcd config */
    lcd->lcdcon1 = (clkval << 8) | (MVAL_USED << 7) | (3 << 5) | (12 << 1) | 0;
    lcd->lcdcon2 = (vbpd << 24) | ((LCD_YSIZE_TFT - 1) << 14) | (vfpd << 6) | vspw;
    lcd->lcdcon3 = (hbpd << 19) | ((LCD_XSIZE_TFT - 1) << 8) | hfpd;
    lcd->lcdcon4 = (MVAL << 8) | hspw;
    lcd->lcdcon5 = (1 << 11) | (0 << 10) | (1 << 9) | (1 << 8) | (0 << 7) | (0 << 6) | (1 << 3) | (BSWP << 1) | HWSWP;

    /* make lcd sub interrupt */
    lcd->lcdintmsk |= 0x3;

    /* disable lpc3480 */
    lcd->lpcsel &= ~(0x7);

    /* disbale temp palette */
    lcd->tpal = 0x0;

    /* disable gpg4 pull-up */
    gpio->gpgup &= ~(1 << 4);

    /* set gpg4 mode to lcd_pwrdn */
    gpio->gpgcon |= 3 << 8;

    /* set gpg4 to high */
    gpio->gpgdat |= 1 << 4;

    /* enable pwren signal */
    lcd->lcdcon5 |= 1 << 3;

    /* set signal polarity to normal */
    lcd->lcdcon5 &= ~(1 << 5);
}

void lcd_enable(void)
{
	struct s3c24x0_lcd* const lcd = s3c24x0_get_base_lcd();

	/* Enable the video output and the LCD control signal. */
	lcd->lcdcon1 |= (1 << 0);
}

#ifdef CONFIG_LCD_INFO
void lcd_show_board_info(void)
{
	lcd_printf("%s (%s - %s)\n", U_BOOT_VERSION, U_BOOT_DATE, U_BOOT_TIME);
}
#endif

添加进编译项:
gedit drivers/video/Makefile

末尾添加一行:

obj-$(CONFIG_TQ2440_LCD) += tq2440_lcd.o

测试

编译后使用tftp下载到内存0x30008000处并运行程序,查看效果:
在这里插入图片描述
下面操作将输出信息重定向到LCD上显示:

使用以下命令查看可以将输出信息重定向到哪些设备:
coninfo
在这里插入图片描述
可以看到可以将输出信息重定向到串口和LCD,serial就是我们使用的串口一,标志为IO,也就是说可以输入输出,LCD为.O,也就是说只能输出不能输入。

将输出信息同时重定向到LCD和串口一:

setenv stdout 'lcd,serial'

在这里插入图片描述
在这里插入图片描述


ends…

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TQ2440移植u-boot2016.11全过程记录-【4】LCD驱动移植并显示 的相关文章

随机推荐

  • maven中的scope--依赖范围

    初学springboot 在maven配置中了解的 记录下来 在一个maven项目中 如果存在编译需要而发布不需要的jar包 可以用scope标签 值设为provided
  • Aspose转换功能演示:使用C#以编程方式将STL转换为PDF或图像

    STL 立体光刻的缩写 代表3D表面几何形状 这些通常在与CAD有关的应用程序中使用 使用Aspose可以轻松快捷地将STL文件转换为PDF 由于PDF格式的兼容性 这种文件格式转换在需要查看不同操作系统和环境中的信息的情况下很有用 同样
  • 【数据结构--顺序表】移除元素(移除数组中等于val的元素,返回移除后数组新长度)

    题目描述 思路1 定义一个指针str指向首元素 遍历数组nums 如果 str val 则将该元素后面的所有元素前挪一位覆盖该元素 若 str val 则str 然而我们来看看这种写法的时间复杂度 我们可否将时间复杂度优化一下呢 由此想到第
  • PyQty5—第一课:安装及简单的界面设计(附代码)

    在日常办公中我们将经常使用的代码与PyQty5进行配合 从而设计出GUI的小程序 这样不经界面好看而且可以进行打包 发给自己的亲朋好友们进行使用 那么今天我们就来进行PyQty5的第一节课 1 首先我们需要安装PyQty5的库 库名 安装
  • TypeScript 基本类型(一)

    1 boolean 布尔值 true false let isDone boolean false 2 number 数字 和JavaScript 一样 TypeScript 里的所有数字都是浮点数 另外支持二进制 八进制 十进制 十六进制
  • C++ QT连接SQL Server基操

    以下是一个使用C QT连接SQL Server的示例代码 include
  • uniapp登录流程详解uni.login

    uni login OBJECT 登录 H5平台登陆注意事项 微信内嵌浏览器运行H5版时 可通过js sdk实现微信登陆 需要引入一个单独的js 详见普通浏览器上实现微信登陆 并非开放API 需要向微信申请 仅个别开发者有此权限H5平台的其
  • 带你认识一下“京东到家-网关系统”

    京东到家三周年活动已然结束 在这2年里 我们的网关系统经历过了618 1020 双11 双12 415等多个非常有意义的考试 回顾起来依旧让人觉得很刺激 每次考前我们和市场部都做了大量的效果预估 压测 扩容 但是活动当日依旧是惊心动魄 瞬时
  • 2021组队训练赛第11场

    我们的终极目标不是AC 而是获取经验 2021组队训练赛第11场 我们的终极目标不是AC 而是获取经验 问题 A ABB 题意 考点 问题 C Bob in Wonderland 题意 考点 问题 F Zeldain Garden 题意 考
  • Spring框架之注解编程

    代码和配置 代码结构 maven依赖
  • Xshell连接不上虚拟机的问题和解决办法

    第一次用xshell 一直连不上linux 搞了好久 也查了很多办法 但是最后也终于解决了 在这里我分享一下自己的解决办法 再列举网上的办法 希望可以帮助其他人 1 你的linux ip地址没有配置 ip地址没有配置 你需要自己配置 配置的
  • 转行IT:网络工程师VS网络安全工程师,哪个能带你走上人生巅峰?

    记得曾经有人说过这样一个俗语 三百六十行 行行转IT 或许听到这个话的时候会觉得是一句玩笑话 但是浏览到网络上一些关于就业的文章 就能够明白这句话的真正意义所在 随着互联网的发展 越来越多人选择 甚至转行到IT行业 今天就带大家了解 网络工
  • AI实战营第二期 第五节 《目标检测与MMDetection》——笔记6

    文章目录 摘要 主要特性 常用概念 框 边界框 交并比 loU 感受野 有效感受野 置信度 目标检测的基本思路 难点 滑框 在特征图进行密集计算 边界框回归 基于锚框VS无锚框 NMS 非极大值抑制 使周密集预测模型进行推理步骤 如何训练
  • 在Ubuntu里面.AppImage格式安装

    具体而言 直接运行appimage就可以实现 安装 先给软件包可执行权限 chmod u x
  • CS5263芯片 DP转HDMI视频转换芯片 适用于HDMI单转线

    应用 DP转HDMI 视频芯片 分辨率可达到4K 60HZ 产品描述 Capstone CS5263AN是一款高性能DP1 4到HDMI2 0b转换器 设计用于将DP1 4源连接到HDMI2 0b接收器 CS5263AN集成了DP1 4兼容
  • Basic 1047 编程团体赛 (20分)

    题目 编程团体赛的规则为 每个参赛队由若干队员组成 所有队员独立比赛 参赛队的成绩为所有队员的成绩和 成绩最高的队获胜 现给定所有队员的比赛成绩 请你编写程序找出冠军队 输入格式 输入第一行给出一个正整数 N 1 0 4
  • STM32学习笔记—SPI通信

    1 SPI简介 2 函数配置 1 SPI简介 SPI通信是一种高速的 全双工的同步通信总线 通讯时 只占用四条线 MISO MOSI CS SCLK 其中cs为片选线 sclk为时钟线 一般同步通讯带有时钟线 像uart异步通信的就不带 m
  • Python:入门到放弃之基础篇(一)

    文章目录 前言 一 python的标识符 二 python变量类型 1 Number 2 String 3 List 4 Tuple 5 Set 6 Dictionary 三 python流程控制 1 顺序流程控制 2 分支流程控制 3 循
  • EMC电磁兼容测试项目简介

    EMC电磁兼容测试项目简介 一般来说 电气 电力设备产品要做的EMC电磁兼容测试主要包含浪涌 冲击 抗扰度 振铃波浪涌抗扰度 电快速瞬变脉冲群抗扰度 电压暂降 短时中断和电压变化抗扰度 工频电源谐波抗扰度 静电抗扰度 射频电磁场辐射抗扰度
  • TQ2440移植u-boot2016.11全过程记录-【4】LCD驱动移植并显示

    TQ2440移植u boot2016 11 LCD驱动移植并显示 LCD初始化流程分析 u boot的LCD初始化代码是在common lcd c中 我们找到lcd init函数 该函数功能流程为 lcd ctrl init初始化了LCD的