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

个人信息保护合规审计人员(中级)能力测试试卷

本文是关于个人信息保护合规考试的试题解析,内容涵盖《个人信息保护法》相关规定。试卷包含单选题、多选题、判断题、简答题和案例分析题五种题型,总分100分,考试时间120分钟。试题重点考察个人信息处理的基本原则、敏感个人信息处理要求、合规审计流程、个人信息保护影响评估等内容。通过案例分析题详细解析了人脸识别登录、数据共享、跨境传输等场景下的合规要求。参考答案均严格依据《个人信息保护法》等法律法规,为个人信息处理活动提供了明确的合规指引。

qq_41525079的博客 854

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

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

weixin_30457551的博客 347

MaaS 商业模式全面分析报告:从技术赋能到商业变现的全链条探索

MaaS(模型即服务)商业模式正成为AI产业主流,2024年上半年中国市场规模达2.5亿元,预计2027年占比将提升至47%。该模式通过云服务提供预训练AI模型,大幅降低企业应用AI的技术门槛和成本。核心盈利方式包括按使用量计费、订阅制、定制化服务等,其中混合模式因灵活性成为趋势。MaaS产业链包含模型提供商、云平台、应用开发商和最终用户,重塑了AI产业格局。随着《数据法案》等监管加强,数据增值服务面临更严格合规要求。未来五年,中国MaaS市场增速预计超50%,用户规模将从2025年2.1亿增至2030年5

芯片行业20年 · 参与定义实现千万级量产出货 · AI芯片PM 2893

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

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

McuDusk的博客 656

2021秋招IC验证面经-ARM中国/中科芯/飞腾/地平线/中兴

中科芯 (央企福利待遇好,但是百分百不解决户口,适合当地人进去躺平。) 现场面试,三个面试官,时间大约40min 首先介绍一下自己,介绍一下项目。所做项目用到了FIFO吗,深度是多少,位宽是多少,仲裁算法是什么? 验证环境中的reference model是自己写的还是本身就有的,仲裁怎么在参考模型中实现,参考模型怎么获取寄存器的值? 怎么配置RTL寄存器,通过平台的寄存器模型进行寄存器配置,寄存器模型里边的方法,写一个寄存器或读一个寄存器怎么实现? 寄存器如何实现前门访问和后门访问,后门访问时

weixin_48014653的博客 6319

DIY天文摄影:如何用NMP溶剂安全去除佳能CMOS传感器的拜耳滤镜(附详细步骤)

本文为天文摄影爱好者提供了一份详尽的DIY指南,介绍如何使用NMP溶剂安全去除佳能CMOS传感器的拜耳滤镜,将其改造为高灵敏度单色相机。文章深入剖析了NMP溶剂的作用原理与关键风险,并系统性地拆解了从材料准备、分步操作到后期验证的完整实践流程,旨在帮助具备动手能力的爱好者实现深空天体摄影的进阶目标。

w3x4y的博客 308

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

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

weixin_42532938的博客 430

opencv读取海康威视摄像头相关配置

1、开发环境 海康威视的网络摄像头使用: 开发工具:vs2015 C++ 海康SDK 2、相关操作 下载海康威视SDK:网址:http://www.hikvision.com/cn/download_61.html • 1:对照自己的开发平台可以下载设备网络SDK_Win32设备网络SDK_Win64,解压到本地文件下: • 2:VS配置 、Opencv配置。参考址 http://blog.csdn.net/poem_qianmo/article/details/19809337 (建议自己创

HMJ115的博客 985

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

ROS2 Jazzy 学习路线图(2026最新)

摘要: ROS2 Jazzy(LTS版)是2026年长期支持版本,仅适配Ubuntu 24.04。本文提供WSL环境下的学习路线图: 环境搭建(1-2天):配置WSL2+Ubuntu 24.04,安装ROS2 Jazzy及图形工具(VcXsrv、VS Code)。 核心概念(3-5天):掌握节点、话题、服务等通信机制,使用turtlesim和小海龟仿真实践。 开发实战(7-10天):Python/C++节点开发,结合RViz2、Gazebo等工具完成多节点通信和避障项目。 进阶应用(10-15天):导航(N

zheng_ruiguo的专栏 640

在工作台 LS-DYNA 中检索和变换反作用力分量

在结构仿真中,通常需要由施加的位移或速度边界条件产生的反作用力。此外,通常需要根据用户定义的坐标系解析反作用力分量。在本文中,详细介绍了在Workbench (WB) LS-DYNA 中,相对于用户定义的坐标系检索和变换反作用力分量的过程。

jkh920184196的博客 885

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

Java 大视界 -- 基于 Java+Flink 构建实时电商交易风控系统实战(436)

本文介绍基于Java+Flink构建实时电商交易风控系统的实战经验。系统采用分层架构设计,包含数据采集层、实时计算层、规则引擎层、数据存储层和应用服务层,实现毫秒级风险识别与拦截。核心组件包括Flink 1.17处理交易数据流、Drools规则引擎动态匹配风险规则、Redis缓存热点数据等。文章详细提供了开发环境配置清单和Maven依赖说明,确保系统具备低延迟(≤200ms)、高吞吐(10万TPS)和高可用性(99.99%)特性。该方案已通过生产环境验证,可有效应对恶意刷单、盗刷支付等电商交易风险。

【青云交】华为云云享专家 | 阿里云开发者社区专家博主 技术圈个人影响力前 9 | 博客之星 TOP12 优快云 首位四榜(原力榜 / 作者周榜 / 领军人物 / 综合热榜)榜首,破平台纪录! 苏州地区全榜霸榜,感恩全网十多万粉丝同行! 3943

ST7789 linux4.x驱动

【代码】ST7789 linux4.x驱动。

omnibots的博客 1001

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

嵌入式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

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

上一篇: 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、付费专栏及课程。

余额充值