linux驱动开发 ST7789 Framebuffer驱动移植(I.MX6ULL平台)

linux(全志F1C100S/F1C200S)系列02:移植LCD st7789驱动,LVGL8.3移植 保存退出,然后执行make命令编译内核,然后将镜像拷贝到tf卡第一分区中,此时可以看到屏幕已经可以驱动起来了,并且/dev目录下有fb0设备。fb 挂载成功后,控制台驱动检测到 fb 设备后会自动将 fb0 映射到 tty0 上,这样 tty0 实际上就是 fb0 ttys0则是串口。此时可以看到屏幕刷新了,然后编程了黑色背景,同时出现了光标,从终端的 log 可以看到,当。现在所有的修改都完成了,剩下的就是编译内核了,在内核根目录下执行。将设备树和zimage复制到tf卡中 重启可以看到光标闪烁。 阅读详情
AI摘要

本文详细介绍了在Linux内核中如何移植ST7789 LCD驱动并添加Framebuffer支持。首先,通过dma_alloc_coherent分配内存,并注册framebuffer设备,设置framebuffer信息包括分辨率、颜色格式等。然后,创建内核线程用于LCD屏幕的刷新。由于QT应用使用RGB888,内核线程中进行了RGB888到RGB565的转换以适应硬件。最后,展示了应用程序如何通过mmap接口操作framebuffer进行显示。实验结果显示驱动成功运行。

前言

ST7789的驱动移植成功后,还需要添加Framebuffer的支持,进行硬件接口的抽象化,通过对Framebuffer的读写来直接对显存进行操作

Framebuffer
  • Framebuffer驱动是将图像设备的显示进行抽象化,可以理解为一块内存空间(帧缓冲),该空间为显示内存的映射,会被刷新到LCD上;
  • Framebuffer是一个字符驱动,设备节点 /dev/fbn 有了Framebuffer驱动接口的支持,应用GUI可以友好完成移植
框图
  • 内核自带的驱动中,fb的字符驱动源码路径drivers/video/fbdev/core/fbmem.c
  • LCD驱动中的framebuffer的配置,源码路径/drivers/video/fbdev/mxsfb.c
    在这里插入图片描述
注册framebuffer
  • 在probe函数中进行framebuffer设备的注册,定义配置fb_info

int st7789_fb(struct spi_device *spi)
{
    unsigned char *v_addr = NULL; //映射地址
    unsigned int p_addr = 0; //物理地址
    lcd_data_t *data; //附加数据
    v_addr = dma_alloc_coherent(NULL, X*Y*4, &p_addr, GFP_KERNEL);//申请连续内存(dma方式)
    if(v_addr == NULL)
    {
        printk("dma allpc error!\n");
        return -1;
    }
    fb_info = framebuffer_alloc(sizeof(lcd_data_t), NULL);//额外分配lcd_data_t类型空间,位于framebuffer后面(私有数据)
    if(fb_info == NULL)
    {
        printk("fb_info allow error!\n");
        return -1;
    }
    data = fb_info->par; //data指针指向额外分配的空间
    data->spi = spi;
    fb_info->pseudo_palette = pseudo_palette;
    fb_info->var.activate   = FB_ACTIVATE_NOW;
    fb_info->var.xres = LCD_W;//240
    fb_info->var.yres = LCD_H; //240
    fb_info->var.xres_virtual = LCD_W;
    fb_info->var.yres_virtual = LCD_H;
    fb_info->var.bits_per_pixel = 32; //32bit (采用rgb888 24位图,驱动中需要自行转化)
   
    //rgb888
    fb_info->var.red.offset = 16;
    fb_info->var.red.length = 8;
    fb_info->var.green.offset = 8;
    fb_info->var.green.length = 8;
    fb_info->var.blue.offset = 0;
    fb_info->var.blue.length = 8;
    strcpy(fb_info->fix.id, "st7789_fb");
    fb_info->fix.smem_start = p_addr; //显存的物理地址
    fb_info->fix.smem_len = LCD_W*LCD_H*4;
    fb_info->fix.type = FB_TYPE_PACKED_PIXELS;
    fb_info->fix.visual = FB_VISUAL_TRUECOLOR;
    fb_info->fix.line_length = LCD_W*4;
    fb_info->fbops = &fops;
    fb_info->screen_base = v_addr; //显存虚拟地址
    fb_info->screen_size = LCD_W*LCD_H*4; //显存大小
    printk("register framebuff!\n");
    register_framebuffer(fb_info); 
    data->thread = kthread_run(thread_func, fb_info, spi->modalias);
    return 0;    
}
内核线程
  • 内核自带的驱动通过LCD控制器进行显存的刷新,但是SPI并不支持,这里通过增加内核线程进行刷新
    在这里插入图片描述

  • 通过内核线程将framebuffer的显存发送给ST7789控制器进行显示

//内核线程
int thread_func(void *data)
{
    lcd_data_t *ldata = fb_info->par;
    while (1)
    {  
        if (kthread_should_stop())
            break;
        show_fb(fb_info, ldata->spi);//刷新显存
    }
    return 0;
}
rgb888与rgb565转换

QT采用的是RGB888 24位图32bit数据,在LCD上显示,需要将framebuffer的显存进行转换

  • RGB888
0 0 0 0 0 0 0 0R7 R6 R5 R4 R3 R2 R1 R0G7 G6 G5 G4 G3 G2 G1 G0B7 B6 B5 B4 B3 B2 B1 B0
  • RGB565
R7 R6 R5 R4 R3G7 G6 G5 G4 G3 G2B7 B6 B5 B4 B3
  • 内核线程刷屏中将位图转化,提取单色高位,丢失部分精度
//grb888 to rgb565
for (x = 0; x < fb_info->var.xres; x++)
{
    k = p[y*fb_info->var.xres+x];//取出一个像素点的32位数据
    // rgb888 --> rgb565        
    pdata = (unsigned char *)&k;
    c = pdata[0] >> 3; //蓝色
    c |= (pdata[1]>>2)<<5; //绿色
    c |= (pdata[2]>>3)<<11; //红色
    //发出像素数据的rgb565
    *((unsigned short *)memory+y*fb_info->var.yres+x) = ((c&0xff)<<8)|((c&0xff00)>>8);
}
应用程序
流程

在这里插入图片描述

app用户代码
fd_fb = open(filename, O_RDWR);
if (fd_fb < 0)
{
    printf("can't open file %s\r\n", filename);
    return -1;
}
if (ioctl(fd_fb, FBIOGET_VSCREENINFO, &var))
{
    printf("can't get var\n");
    return -1;
}
screen_size = var.xres * var.yres * var.bits_per_pixel / 8; //230400
fb_base = (unsigned char *)mmap(NULL , screen_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd_fb, 0); //mmap申请一块虚拟内存
if (fb_base == NULL)
{
    printf("can't mmap\n");
    return -1;
}
  
/* 清屏: 全部设为白色 */
memset(fb_base, 0xFF, screen_size);
/* 居中设置两个正方形 */
int *color = (int *)fb_base;
for(i = 80; i < 160; i++)
{
    for(j = 80; j < 160; j++)
    {
        *(color+i*var.xres+j)   = 0x000000;
    }
}
for(i = 100; i < 140; i++)
{
    for(j = 100; j < 140; j++)
    {
        *(color+i*var.xres+j)   = 0x00FF00;
    }
}

munmap(fb_base , screen_size);//释放线程
close(fd_fb);
实验现象

驱动安装后,启动应用程序

./lcd_app /dev/fb0

在这里插入图片描述

后续章节贴完整源码

[linux]全志H3 nanopi 点亮ST7789VW IPS屏 入门linux之全志H3 nanopi 点亮ST7789VW IPS屏NanoPi-NEO-Air 入门Nnaopi的IO设备树(sun8i-h3-nanopi-neo-air.dts)中禁用其他SPI节点和使能ST7789VW节点:修改初始化函数使用1.14(135*240)ips屏幕的注意修改函数set_addr_win把驱动编译进内核编译内核 设备树 下载重启看效果实际效果播放视频运行QT NanoPi-NEO-Air 入门 记录一下第一次尝试用linux点亮spi屏幕的过程,一共尝试了0.96 ST 阅读详情

相关推荐

DRM驱动移植spi显示屏(st7789芯片驱动)

博客主要介绍了spi屏幕的驱动、虚拟DRM驱动、spi屏幕添加到DRM驱动中。

zichuanning520的博客 6281

linux驱动开发 ST7789 LCD驱动移植(I.MX6ULL平台)

买的I.MX6ULL的板子未选配RGB的屏幕,无法在板子上进行GUI的开发调试,不过手头上有块控制器为ST7789V3的LCD屏幕(1.3inch),通过简易接线后可以很方便进行驱动的移植

4825

手把手教你为I.MX6ULL移植ST7789屏的Framebuffer驱动(附完整源码)

本文详细介绍了在I.MX6ULL平台上为ST7789屏幕移植Framebuffer驱动的完整流程,包括环境准备、驱动框架搭建、Framebuffer接口实现和用户空间应用开发。通过SPI接口控制ST7789屏幕,实现高效的图形显示,并提供完整的源码示例,帮助开发者快速掌握嵌入式Linux驱动开发技术。

weixin_33704234的博客 365

嵌入式Linux使用TFT屏幕:使用树莓派4B的MIPI-DSI接口点亮ST7701S屏幕

前言 距上一次写文章有点时间了,今天终于调通了一块MIPI屏幕,还是有些成就感的,特写一篇笔记置于此,希望能帮到也想研究这个MIPI的朋友。 正题 博主使用的开发板为Raspbery Pi 4B ,系统为Raspberry Pi OS 64Bit (full版本)。 屏幕信息 博主使用的屏幕是一块2.8寸的IPS屏幕,MIPI接口,驱动IC是ST7701S。 为避免广告嫌疑,这里就不放链接了。 提取屏幕信息 博主拿到屏幕后,也拿到了商家提供的初始化代码和屏幕信息,我们主要关注这两个个部分: 屏幕接口定义

CNflysky的博客 1万+

告别LCD控制器:手把手教你为I.MX6ULL的SPI屏ST7789移植Framebuffer驱动

本文详细介绍了在I.MX6ULL平台上为ST7789 SPI屏幕移植Framebuffer驱动的实战方案。通过软件模拟硬件刷新机制,解决了无专用LCD控制器时的显示输出问题,涵盖显存管理、内核线程刷新、色彩转换等核心技术,并提供性能优化技巧,帮助开发者实现高效的嵌入式显示解决方案。

weixin_33736048的博客 364

手把手教你为I.MX6ULL移植ST7789 SPI屏的Framebuffer驱动(附RGB888转RGB565避坑指南)

本文详细介绍了在I.MX6ULL平台上移植ST7789 SPI屏Framebuffer驱动的完整过程,包括驱动基础架构、显存管理、刷新机制实现及颜色空间转换优化。特别针对RGB888转RGB565的常见问题提供了高效解决方案,并分享了性能优化技巧与上层应用集成方法,帮助开发者快速实现嵌入式Linux图形界面开发。

weixin_26876073的博客 141

手把手教你为I.MX6ULL移植ST7789屏幕的Framebuffer驱动(附完整源码)

本文详细介绍了如何在I.MX6ULL平台上移植ST7789 LCD屏幕的Framebuffer驱动,包括开发环境搭建、驱动架构解析、关键代码实现及性能优化技巧。通过SPI接口实现高效显示控制,适用于工业控制、智能家居等嵌入式场景,并附完整源码供参考。

weixin_30920513的博客 348

I.MX6ULL驱动ST7789 SPI屏幕:从点亮到GUI开发的完整流程解析

本文详细解析了在I.MX6ULL平台上驱动ST7789 SPI屏幕的完整流程,从硬件连接到驱动移植,再到GUI开发。涵盖了设备树配置、SPI驱动框架搭建、Framebuffer接口实现以及LVGL和Qt集成等关键技术点,为嵌入式开发者提供了一套完整的显示解决方案。

weixin_30613343的博客 362

手把手教你给I.MX6ULL移植ST7789 LCD驱动(SPI接口,附完整源码)

本文详细介绍了如何在I.MX6ULL开发板上移植ST7789 LCD驱动(SPI接口),包含完整的设备树配置、驱动开发实战和性能优化技巧。通过手把手教程和完整源码,帮助开发者快速实现240x240分辨率LCD的驱动移植,适用于嵌入式Linux驱动开发场景。

weixin_30482181的博客 467

LCD技术原理与嵌入式驱动实战:从电光效应到ESP32/STM32/Linux开发

液晶显示(LCD)技术是现代电子设备人机交互的基础,其核心原理基于液晶的电光效应——通过电场精确控制液晶分子的排列,从而调制背光源的透光率,实现像素的明暗与色彩变化。这项技术通过成熟的TFT主动矩阵驱动方案,指挥数百万像素协同工作,形成了稳定可靠的显示画面。在嵌入式开发领域,掌握LCD驱动是连接硬件与视觉界面的关键,涉及SPI、8080并行、RGB等多种接口协议。无论是STM32的FSMC/DMA优化、ESP32-S3的SPI DMA帧缓冲,还是Linux下的Framebuffer驱动框架与设备树配置,其技

weixin_33739523的博客 299

PRIDE PPP-AR软件实战:从ZTD解算到PWV反演的全流程避坑指南

本文详细解析了使用PRIDE PPP-AR软件进行GNSS数据处理的全流程,重点涵盖从ZTD解算到PWV反演的关键步骤与精度评估。文章深入剖析了软件部署、数据准备、参数配置中的常见“坑点”,并提供了与IGS ZTD及ERA5产品进行交叉验证的实用方法,旨在帮助用户高效、准确地获取高精度大气可降水量产品。

p8q9r0的博客 606

手把手教你为I.MX6ULL开发板移植ST7789屏幕驱动(附Framebuffer配置与QT应用测试)

本文详细介绍了在I.MX6ULL开发板上移植ST7789屏幕驱动的完整流程,包括Framebuffer配置与QT应用测试。从硬件连接到内核驱动开发,再到用户空间测试与性能优化,提供了实战指南和常见问题解决方案,帮助开发者快速实现嵌入式Linux显示驱动开发。

weixin_30457551的博客 347

Windows Server安装Intel I219-V网卡驱动完整教程

在Windows Server系统上安装Intel I219-V网卡驱动的方法。

小白成长历程 5180

韦东山IMX6ULL移植SPI TFT ST7789屏幕驱动

韦东山IMX6ULL移植SPI TFT ST7789屏幕驱动

McuDusk的博客 656

ThinkPad X230魔改指南:从博通网卡驱动到1080P屏显全攻略(附Sonoma避坑清单)

本文详细介绍了ThinkPad X230的全面改造方案,包括博通网卡驱动(BCM94352HMB)的安装与调试、1080P屏幕改装技术以及macOS Sonoma系统的适配优化。通过硬件升级和软件调优,使这台经典商务本焕发新生,适合DIY爱好者和技术极客参考实践。

weixin_30379531的博客 586

STM32F407单一定时器输出4路不同频率及占空比的PWM波

STM32F407单一定时器输出4路不同频率及占空比的PWM波

qq_43868701的博客 4920

告别LCD控制器:在I.MX6ULL上用纯SPI驱动ST7789屏的Framebuffer方案

本文详细介绍了在I.MX6ULL处理器上通过纯SPI接口驱动ST7789屏幕的Framebuffer方案。该方案克服了传统LCD控制器依赖硬件模块的限制,实现了Linux标准Framebuffer接口的兼容性,为嵌入式系统提供了灵活的显示解决方案。文章涵盖了硬件架构、驱动实现、性能优化及实际应用中的关键注意事项。

weixin_42532938的博客 430

Windows游戏玩家必看:用Process Lasso优化CPU优先级和核心绑定,告别卡顿

本文为Windows游戏玩家详细介绍了如何使用Process Lasso优化系统性能。通过设置CPU优先级和核心绑定,可以智能管理进程资源,确保游戏获得最高调度权限,有效减少因后台程序干扰或Windows调度机制不完善导致的卡顿与帧数波动,从而提升游戏流畅度与稳定性。

weixin_29299807的博客 2221

LCD显示原理:从Framebuffer到RGB时序的嵌入式底层解析

Framebuffer是Linux嵌入式系统中连接内存与LCD屏幕的核心抽象,其本质是内核提供的可mmap物理显存设备;RGB接口并非简单的红绿蓝数据线,而是一套依赖DCLK、HSYNC、VSYNC和DE严格时序协同的并行协议;理解这两者的耦合关系,是解决黑屏、花屏、偏色、撕裂等显示异常的根本前提。该原理广泛应用于AM335x、STM32、i.MX6ULL等平台的TFT/LVDS屏调试,也是进阶MIPI-DSI、DRM/KMS及Qt底层优化的必备基础。

weixin_33816300的博客 686

T2T基因组组装实战指南:从数据到完整染色体

本文详细介绍了T2T基因组组装技术的实战指南,从测序数据选择到完整染色体组装的全流程。重点解析了ONT ultra-long和PacBio HiFi测序技术的优势,以及如何攻克端粒和着丝粒等重复区域的组装难题。通过具体案例和实用技巧,帮助研究人员实现从数据到完整染色体的高质量组装。

weixin_29292535的博客 846

078、镜头阴影校正:LSC算法原理与标定优化

文章摘要 镜头阴影校正(LSC)是手机影像系统中的关键技术,用于解决镜头渐晕效应导致的画面边缘暗角问题。本文详细分析了LSC算法的核心原理,包括非均匀网格划分、双线性插值等关键技术点,并揭示了标定流程中的常见陷阱(光源均匀性、灰卡反射特性、温度漂移)。文章还深入探讨了增益计算的工程实现细节,以及实际调优中的关键考量因素(色差校正、动态场景适应等)。作者结合15年经验,给出了包括验证方法、网格参数设计、产线标定等实用性建议,强调LSC算法应与光学设计协同优化,才能达到最佳效果。

sundong_81的博客 42

Qt 6.8 LTS深度解析:嵌入式全栈支持与Zephyr深度集成

Qt作为跨平台C++应用开发框架,其LTS版本代表工业级稳定性和长期演进承诺。Qt 6.8 LTS标志着从桌面中心向嵌入式全栈能力的重大转向,核心在于ABI稳定性保障、MCU资源极致优化及对Zephyr RTOS的原生支持。其技术价值体现在统一内核双轨输出(Desktop/MCU)、编译时特征开关驱动的轻量化、以及基于Device Tree的硬件抽象解耦。典型应用场景覆盖工业HMI、医疗监护仪、智能电表等资源受限的实时系统。本文聚焦Qt 6.8 LTS的MCU Profile内存控制、Zephyr深度绑定机

weixin_34056162的博客 675

ST7789 linux4.x驱动

【代码】ST7789 linux4.x驱动。

omnibots的博客 1001

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

嵌入式Linux--驱动ST7789驱动芯片的TFT屏(一)

目录一、步骤二、修改设备树三、编写驱动代码1、编写Makefile文件2、编写驱动四、编写驱动测试代码五、测试 一、步骤 二、修改设备树 三、编写驱动代码 1、编写Makefile文件 Makefile KERNELDIR := /home/liefyuan/linux/project_drivers/kernel CURRENT_PATH := $(shell pwd) obj-m := tft.o build : kernel_modules kernel_modules: $(MAKE)

似水流年 8398

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

上一篇: linux驱动开发 ST7789 LCD驱动移植(I.MX6ULL平台)
下一篇: 蓝牙Mesh物联系统开发一 项目简介
玉怀一捧雪
博客等级 码龄15年 606粉丝 60原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值