1. 从零开始:认识MTK平台的LCD驱动框架
大家好,我是老张,一个在MTK平台摸爬滚打了快十年的底层驱动工程师。今天咱们不聊那些虚的,就聊聊怎么把一个全新的LCD屏幕,在MTK的Android设备上给点亮。这活儿,说难不难,说简单也不简单,尤其是对于刚入行的兄弟,面对LK、Kernel、DSI、初始化序列这些名词,头都大了。别慌,我当年也是这么过来的,踩过的坑比走过的路都多。这篇文章,我就用最直白的话,带你走一遍完整的流程,保证你看完就能上手操作。
首先,咱们得搞清楚MTK平台显示驱动的“双核”架构。简单来说,点亮一块屏幕,需要两套代码协同工作,就像一场接力赛。第一棒是LK,也就是Little Kernel,它是MTK平台Bootloader的一部分,负责最早期、最底层的硬件初始化。你可以把它想象成舞台的搭建工,在Android系统这个大戏开演前,它得先把屏幕这个“大荧幕”给立起来,通电,并且显示出最基本的画面(比如开机Logo)。第二棒是Kernel,也就是Linux内核,在LK把屏幕点亮、系统启动后,它就接过了控制权,负责系统运行时的显示刷新、休眠唤醒、色彩管理这些更复杂的任务。
所以,当你拿到一块新屏幕,你的驱动代码需要分别在LK和Kernel两个地方各写一份。它们俩的代码结构非常像,核心都是一个叫 LCM_DRIVER 的结构体,但绝对不能直接把LK的代码拷贝到Kernel里,或者反过来。因为两者所处的运行环境、依赖的数据类型、甚至内存管理方式都有差异,直接拷贝大概率会导致编译不过,或者开机直接黑屏重启。我见过不少新手在这第一步就栽了跟头,切记。
那么,驱动文件都放在哪呢?我给大家画个地图:
- LK的LCM驱动路径:
vendor/mediatek/proprietary/bootable/bootloader/lk/dev/lcm/ - Kernel的LCM驱动路径:
kernel-4.9/drivers/misc/mediatek/lcm/(以Kernel 4.9为例)
你的任务,就是在这两个目录下,为你的新屏幕创建一个专属的文件夹,比如 hx8394_dsi_hd_4line,然后把驱动文件放进去。这个文件夹的名字,最好能清晰体现屏幕型号和基本参数,方便以后维护。接下来,咱们就深入这个文件夹,看看里面的核心文件到底该怎么写。
2. 驱动文件修改实战:手把手教你写代码
理论说再多,不如一行代码来得实在。这一部分,咱们就钻进驱动文件的细节里,看看每一个关键结构体和函数该怎么填充。我会用一个假设的屏幕型号 demo_fhd_dsi_vdo 来举例,你可以跟着我的步骤,替换成你自己的屏幕参数。
2.1 驱动结构体:屏幕的“身份证”和“技能表”
每个LCM驱动文件的核心,都是一个 LCM_DRIVER 类型的全局结构体变量。它定义了这块屏幕的所有属性和能力,是系统识别和控制它的唯一依据。结构体大概长这样:
LCM_DRIVER demo_fhd_lcm_drv = {
.name = "demo_fhd_lcm_drv",
.set_util_funcs = lcm_set_util_funcs,
.get_params = lcm_get_params,
.init = lcm_init,
.suspend = lcm_suspend,
.resume = lcm_resume,
.compare_id = lcm_compare_id,
};
这里有几个坑需要提前避开。第一个就是 .name 字段。这个字符串是这块屏幕驱动的“型号名”。最关键的一点是:LK驱动和Kernel驱动里的这个 .name 必须一字不差地保持一致! 我遇到过好几次,同事在拷贝代


230

被折叠的 条评论
为什么被折叠?



