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

Simulink中Simscape—Fluids模块(原Simhydraulics)学习记录

学习来源:http://cn.mathworks.com/help/physmod/hydro/getting-started-with-simhydraulics.html 主要学习内容如下图: 详细内容: 1、组件来源 SIMULINK浏览器中的模块:Simscape_Foundation 和 Simscape_Fluids。 2、Simscape下包括多个子

1万+

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

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

weixin_30457551的博客 347

树莓派5使用CSI摄像头 | 树莓派5接上CSI摄像头后命令行操作显示检测无设备

此系列用于记录树莓派5的一些操作,这篇文章讲述树莓派5如何使用CSI摄像头。

beyourself_he的博客 8796

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

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

McuDusk的博客 656

uds协议之can总线程序升级

uds协议简介 如何利用uds协议升级 升级流程 uds服务类型介绍

fangye945a的博客 1万+

用WorkBuddy搭建漫剧AI自动化制作流水线全攻略

在内容创作领域,AI智能体正逐渐从单一工具辅助走向全流程自动化调度。其核心原理是将剧本、分镜、绘图、配音、剪辑等环节拆解为可独立执行的任务单元,由总控系统统一协调,从而大幅降低人力与时间成本。这种模式尤其适用于动态漫画(漫剧)这类环节多、专业度要求高的视频形态。传统制作流程中,角色一致性、配音周期和剪辑返工是公认的效率瓶颈,而借助AI智能体工作台,创作者只需输入故事创意,即可驱动多个数字分身协同完成内容生产。本文以WorkBuddy为例,详细展示如何配置模型、安装技能包并串联五段式流水线,将单集制作成本从万

weixin_28224217的博客 254

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

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

weixin_42532938的博客 430

上海计算机学会2020年5月月赛C++乙组T2经济普查

中国正在以前所未有的力度推进脱贫攻坚,国家计划在2020年使得在现行标准下的贫困人口实现全面脱贫,为此,需要对居民的经济状况进行普查。 题目描述 给定一个正整数n,表示人口数量。一开始,每个居民拥有的财产记为a1​,a2​,⋯,an​,财产可能发生两种变化: 一种来源于个体,由某个居民的经济活动而产生。在某个时刻,某个居民的财产会直接变成某个数值,可能升高也可能降低。 一种来源于政策,在某个时刻,国家会对财产低于某个标准线全部的居民,实施政策支持,使得他们的财产全部正好到达标准线。 给定这些变

长春高老师编程 911

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

项目介绍 MATLAB实现基于LSTM-XGBoost长短期记忆网络(LSTM)结合极端梯度提升(XGBoost)进行多变量时序预测的详细项目实例(含模型描述及部分示例代码)

本项目基于MATLAB平台,实现LSTM-XGBoost混合模型进行多变量时序预测。通过LSTM网络自动提取时序特征,结合XGBoost强大的回归能力,有效解决多变量时序数据的高维复杂性、长短期依赖捕捉等难题。项目包含完整的数据预处理流程、模型构建与训练方法,以及性能评估指标。提供的GUI界面支持参数调整、训练监控和结果可视化,适用于能源、金融、气象等多领域预测任务。配套代码详细注释,便于理解模型实现细节,为时序预测研究提供实用参考框架。

优质创作者: 人工智能技术领域 对于有一定基础的 MATLAB和Python带具体需求都可以详谈 MATLAB和Python可以提供代码调试服务加油 谢谢 你的鼓励是我前行的动力 谢谢支持 加油 谢谢 103

Kafka 性能优化与常见问题排查

Kafka 的高性能依赖于合理的集群设计、参数优化与高效的监控体系。生产环境中,应重点关注I/O 瓶颈、分区规划、Producer/Consumer 参数调优,并通过监控与排查手段快速定位问题,从而保障 Kafka 在实时场景下的稳定运行。

X2829352498的博客 235

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

069、自动曝光(AE)测光策略:全局/中心/点测光与曝光时间增益分配

本文深入探讨了自动曝光(AE)测光策略的技术细节与实际应用。作者通过多个真实案例(手机前置摄像头、车载ADAS、安防监控等)分析了全局测光、中心测光和点测光的优缺点,指出不同场景应采用不同策略。重点剖析了曝光时间与增益分配的"跷跷板效应",提出要根据传感器特性选择最优分配方案。文章强调测光策略应动态调整,并给出5条实用建议:结合场景切换测光模式、关注传感器增益拐点、点测光需防抖处理、全局测光不宜迷信、调试要观察亮度直方图。最后指出AE调试需要结合具体硬件特性进行实测优化,没有通用解决方案。

zzfmlxs的博客 103

ST7789 linux4.x驱动

【代码】ST7789 linux4.x驱动。

omnibots的博客 1001

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

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

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

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

余额充值