linux(第十五期)--Uboot移植(3)-- LCD驱动修改-- Ubuntu20.04

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

前言

LCD驱动修改

总结


前言

上一期说到默认 uboot 中的 LCD 驱动和网络驱动在正点原子的 I.MX6U-ALPHA 开发板上是有问题的, 需要修改。


LCD驱动修改

一般 uboot 中修改驱动基本都是在 xxx.h 和 xxx.c 这两个文件中进行的, xxx 为板子名称,
比如 mx6ull_alientek_emmc.h 和 mx6ull_alientek_emmc.c 这两个文件。
一般修改 LCD 驱动重点注意以下几点:
①、 LCD 所使用的 GPIO ,查看 uboot 中 LCD 的 IO 配置是否正确。
②、 LCD 背光引脚 GPIO 的配置。
③、 LCD 配置参数是否正确。
打开文件 mx6ull_alientek_emmc.c ,找到如下所示内容:

复制代码
struct display_info_t const displays[] = {{
    .bus = MX6UL_LCDIF1_BASE_ADDR,
    .addr = 0,
    .pixfmt = 24,
    .detect = NULL,
    .enable = do_enable_parallel_lcd,
    .mode  = {
        .name           = "TFT43AB",
        .xres           = 480,
        .yres           = 272,
        .pixclock       = 108695,
        .left_margin    = 8,
        .right_margin   = 4,
        .upper_margin   = 2,
        .lower_margin   = 4,
        .hsync_len      = 41,
        .vsync_len      = 10,
        .sync           = 0,
        .vmode          = FB_VMODE_NONINTERLACED
    }
}};

这期中定义了一个变量 displays ,类型为 display_info_t ,这个结构体是 LCD 信息结构体,其中包括了 LCD 的分辨率,像素格式, LCD 的各个参数等。
而display_info_t定义在文件 arch/arm/include/asm/imx-common/video.h 中,定义如下

复制代码
struct display_info_t {
    int bus;
    int addr;
    int pixfmt;
    int (*detect)(struct display_info_t const *dev);
    void (*enable)(struct display_info_t const *dev);
    struct fb_videomode mode;
};

pixfmt 是像素格式,也就是一个像素点是多少位,如果是 RGB565 的话就是 16 位,如果
是 888 的话就是 24 位,一般使用 RGB888 。结构体 display_info_t 还有个 mode 成员变量,此
成员变量也是个结构体,为 fb_videomode ,定义在文件 include/linux/fb.h 中,定义如下:

复制代码
struct fb_videomode {
    const char *name;     /* optional */
    u32 refresh;          /* optional */
    u32 xres;
    u32 yres;
    u32 pixclock;
    u32 left_margin;
    u32 right_margin;
    u32 upper_margin;
    u32 lower_margin;
    u32 hsync_len;
    u32 vsync_len;
    u32 sync;
    u32 vmode;
    u32 flag;
};

结构体 fb_videomode 里面的成员变量为 LCD 的参数,这些成员变量函数如下:

name**:**LCD 名字,要和环境变量中的 panel 相等。

xres**、yres:**LCD X 轴和 Y 轴像素数量。

pixclock:像素时钟,每个像素时钟周期的长度,单位为皮秒。

left_margin**:**HBP,水平同步后肩。

right_margin**:**HFP,水平同步前肩。

upper_margin:VBP,垂直同步后肩。

lower_margin:VFP,垂直同步前肩。

hsync_len**:**HSPW,行同步脉宽。

vsync_len:VSPW,垂直同步脉宽。

vmode**:**大多数使用 FB_VMODE_NONINTERLACED,也就是不使用隔行扫描。
可以看出,这些参数和我们第二十四章讲解 RGB LCD 的时候参数基本一样,唯一不同的
像素时钟 pixclock 的含义不同,以正点原子的 7 寸 1024*600 分辨率的屏幕 (ATK7016) 为例,
屏幕要求的像素时钟为 51.2MHz ,因此:

复制代码
pixclock=(1/51200000)*10^12=19531

在根据其他的屏幕参数,可以得出 ATK7016 屏幕的配置参数如下:

复制代码
struct display_info_t const displays[] = {{
    .bus = MX6UL_LCDIF1_BASE_ADDR,
    .addr = 0,
    .pixfmt = 24,
    .detect = NULL,
    .enable = do_enable_parallel_lcd,
    .mode  = {
        .name           = "TFT7016",
        .xres           = 1024,
        .yres           = 600,
        .pixclock       = 19531,
        .left_margin    = 140,    //HBP
        .right_margin   = 160,    //HFP
        .upper_margin   = 20,     //VBP
        .lower_margin   = 12,     //VFP
        .hsync_len      = 10,     //HSPW
        .vsync_len      = 3,      //VSPW
        .sync           = 0,
        .vmode          = FB_VMODE_NONINTERLACED
    }
}};

使用上述代码 中的屏幕参数替换掉 mx6ull_alientek_emmc.c 中 uboot 默认的屏幕参数。
再打开 mx6ull_alientek_emmc.h ,

找到所有如下语句:

复制代码
panel=TFT43AB

改为:

复制代码
panel=TFT7016

也就是设置 panel 为 TFT7016,panel 的值要和之前代码 中的.name 成员变量的值

一致。修改完成以后重新编译一遍 uboot 并烧写到 SD 中启动。

重启以后 LCD 驱动一般就会工作正常了。


总结

LCD驱动修改

相关推荐
努力努力再努力wz18 分钟前
【内存管理与高并发内存池系列】从 mmap 到 malloc:文件映射、匿名映射与 glibc 内存分配机制详解
linux·c语言·数据结构·数据库·c++·qt·链表
Jurio.1 小时前
开源 Codex Sticky:在终端 Codex CLI 长对话中始终固定底部输入框
linux·rust·github·开源软件·codex·codex cli
无足鸟ICT1 小时前
【RHCA+】撤销和恢复撤销快捷键
linux
质造者1 小时前
LangChain + Ollama + Tavily 实现旅游问答系统
linux·人工智能·python·langchain·rag
mN9B2uk172 小时前
大数据量高并发的数据库优化
服务器·数据库·oracle
starvapour2 小时前
Ubuntu部署gitlab频繁出现502的问题
linux·ubuntu·gitlab
jinglong.zha2 小时前
LScript-从零基础到商业变现的AI自动化学习平台
运维·学习·自动化
土星云SaturnCloud2 小时前
边缘计算赋能智慧工地:从“看得见“到“管得住“的智能化升级
服务器·人工智能·ai·边缘计算
Adorable老犀牛2 小时前
Telegraf:InfluxData 出品的指标采集代理
运维·telegraf
北塔软件2 小时前
北塔软件智能体平台 | 不只监控,更是AI时代的数据资产
运维·人工智能·知识库·北塔软件