安卓屏幕驱动移植



android屏幕启动流程

点亮一个新屏幕,下面以8909-x26的屏幕为例。

 

启动引导部分:

一、添加对应的.h文件

 首先添加一个.h头文件,命名为panel_ili9806e_fwvga_hsd_helitai_x26_video.h,该文件放在路径/bootable/bootloader/lk/dev/gcdb/include/下面。因为这里包含了各种型号的屏幕的头文件,也就是初始化代码,并且放在了启动引导目录。根据命名,知道该屏幕的IC(芯片)是ili9806e,屏幕分辨率是fwvga,玻璃是HSD,模组厂是helitai(合力泰)。

屏幕工作的关键是芯片、玻璃、模组厂!

在头文件里面会对屏幕进行初始化,如backlight(背光),lane(通道),color(颜色),timing_information(定时)等。

/*---------------------------------------------------------------------------*/

/* Backlight setting                                                         */

/*---------------------------------------------------------------------------*/

static struct backlight ili9806e_fwvga_hsd_helitai_x26_video_backlight = {

1, 1, 4095, 100, 1, "PMIC_8941"

};

/*---------------------------------------------------------------------------*/

/* Lane configuration                                                        */

/*---------------------------------------------------------------------------*/

static struct lane_configuration ili9806e_fwvga_hsd_helitai_x26_video_lane_config = {

2, 1, 1, 1, 0, 0, 0

};

/*---------------------------------------------------------------------------*/

/* Panel color information                                                   */

/*---------------------------------------------------------------------------*/

static struct color_info ili9806e_fwvga_hsd_helitai_x26_video_color = {

24, 0, 0xff, 0, 0, 0

};

 

static char ili9806e_fwvga_hsd_helitai_x26_video_on_cmd0[] = {

0x06, 0x00, 0x39, 0xC0,

0xFF, 0xFF, 0x98, 0x06,

0x04, 0x01, 0xFF, 0xFF,

};

......

二、oem_penel.c文件添加自己的新屏幕(路径:bootable/bootloader/lk/target/msm8909_x26_q1/)

(1).首先添加屏幕初始化的头文件”panel_ili9806e_fwvga_hsd_helitai_x26_video.h“,即:

#include “include/panel_ili9806e_fwvga_hsd_helitai_x26_video.h”.

(2).在枚举类型中添加自己的新屏幕:

其中该枚举类型在文件mipi_panel_reg_id.h中(路径:./bootable/bootloader/lk/platform/msm_shared/include/)

enum {

......

ILI9806E_FWVGA_HSD_HELITAI_x26_VIDEO_PANEL,//add your panel.

UNKNOWN_PANEL

};

(3).在函数init_panel_data()中,添加自己的板子的case语句,即新屏幕的数据初始化。

case ILI9806E_FWVGA_HSD_HELITAI_x26_VIDEO_PANEL:

panelstruct->paneldata          = &ili9806e_fwvga_hsd_helitai_x26_video_panel_data;

panelstruct->panelres           = &ili9806e_fwvga_hsd_helitai_x26_video_panel_res;

panelstruct->color              = &ili9806e_fwvga_hsd_helitai_x26_video_color;

panelstruct->videopanel         = &ili9806e_fwvga_hsd_helitai_x26_video_video_panel;

panelstruct->commandpanel       = &ili9806e_fwvga_hsd_helitai_x26_video_command_panel;

panelstruct->state              = &ili9806e_fwvga_hsd_helitai_x26_video_state;

panelstruct->laneconfig         = &ili9806e_fwvga_hsd_helitai_x26_video_lane_config;

panelstruct->paneltiminginfo    = &ili9806e_fwvga_hsd_helitai_x26_video_timing_info;

panelstruct->panelresetseq      = &ili9806e_fwvga_hsd_helitai_x26_video_reset_seq;

panelstruct->backlightinfo      = &ili9806e_fwvga_hsd_helitai_x26_video_backlight;

pinfo->mipi.panel_cmds          = ili9806e_fwvga_hsd_helitai_x26_video_on_command;

pinfo->mipi.num_of_panel_cmds   = ARRAY_SIZE(ili9806e_fwvga_hsd_helitai_x26_video_on_command);

 

memcpy(phy_db->timing,ili9806e_fwvga_hsd_helitai_x26_video_timings, TIMING_SIZE);

pinfo->mipi.signature = ILI9806E_FWVGA_HSD_HELITAI_x26_VIDEO_SIGNATURE;

break;

(4).在函数oem_panel_select()中,必须让控制板的id选择自己新添加的,否则,开机屏幕不亮。

case HW_PLATFORM_QRD:

if (lcm_gpio_id == 1) {

panel_id = ILI9806E_FWVGA_HSD_HUASHI_VIDEO_PANEL;

} else {

panel_id = ILI9806E_FWVGA_HSD_HELITAI_x26_VIDEO_PANEL;//add your panel

}

break;

 

到此,lk(little kernel)部分,屏幕相关的工作就完成了!

 

程序执行流程:

(1)当按下开机键,程序自然就是从main函数开始执行,不过main是C 语言的叫法。(具体可以参见BIOS过程)。

 

2)程序运行到APP_START(aboot)

.init = aboot_init,

APP_END

就会调用aboot_init()函数。aboot意为“引导”。

 

2)引导的时候自然有屏幕的启动和初始化,aboot_init()函数调用target_display_init()函数,条件是DISPLAY_SPLASH_SCREEN为1。

 

3)在函数target_display_init()最后,ret = gcdb_display_init();程序自然跳转到函数gcdb_display_init()

 

4)在gcdb_display_init中首先调用oem_panel_select()函数,然后又跳转到oem_panel_select函数。

hw_id的值由board_hardware_id()返回,返回了11,然后进入qrd路线。107行知lcm_gpio_id=0,所以在else分支(lcm_gpio_id =0)下添加自己的屏幕,即将panel_id设置为ILI9806E_FWVGA_HSD_HELITAI_x26

_VIDEO_PANEL.(panel_id = ILI9806E_FWVGA_HSD_HELITAI_x26_VIDEO_PANEL)。

 

5)oem_panel_select()函数最后return init_panel_data(),程序进入init_panel_data(),

 

6)在init_panel_data()中已经添加了自己的case语句,根据第109行,Func:oem_panel_select    panel_id = 17 ,说明,已经选择了添加的新屏幕来初始化,因为枚举变量中自己新添加的屏幕(ILI9806E_FWVGA_HSD_HELITAI_x26_VIDEO_PANEL)刚好是第17个。这样panel_ili9806e_fwvga_hsd_helitai_x26_video.h文件参数全部用到。最后返回pan_type.

 

7)程序继续在oem_panel_select()中,也返回pan_type,然后退出oem_panel_select()函数。回到gcdb_display_init()中,接收了pan_type,所以日志117行打印出pan_type是PANEL_TYPE_DSI。

 

8)在gcdb_display_init中自然初始化DSI下的项目,如:

panel.fb.width,

panel.fb.height,

panel.fb.stride,

panel.fb.bpp

...

 

 

9)第117行,display_enable = 1,ret = 0;gcdb_display_init()返回,说明屏幕bootloader部分完成,新屏幕可用,成功返回0.然后回到函数target_display_init()。

 

10)第118行, in function:target_display_init,line:350,ret = 0.说明 target_display_init函数也成功结束。

 

11)到此开机中屏幕的点亮结束了。

 

编译bootloader:make aboot -j6

烧写bootloader:fastboot flash aboot emmc_appsboot.mbn

 

log:

......

106 [1450][1450]#mipi_get_lcm_pin_id().pin[8]_status = 0

107 ------ Func:oem_panel_select lcm_gpio_id = 0 ----------

108 hw_id = 11

109 -Func:oem_panel_select    panel_id = 17 -------

110 in function:gcdb_display_init,line:379,panel_type is PANEL_TYPE_DSI

111 in function:gcdb_display_init,line:386,panel init successfully!

112 [1540][1540] Config MIPI_VIDEO_PANEL.

113 [1690][1690] Panic Lut0 la90000 Lut1 ff Robest 0

114 [1700][1700] Turn on MIPI_VIDEO_PANEL.

115 [1720][1720] Video lane tested successfully

116 in function:gcdb_display_init,line:419,panel_type is PANEL_TYPE_DSI

117 display_enable = 1,ret = 0

118 in function:target_display_init,line:350,ret = 0

......

 

 

 

 

内核部分:

三、(1)在路径kernel/arch/arm/boot/dts/msm8909_x26_q1下添加内核配置文件: dsi-panel-ili9806e-fwvga-hsd-helitai-x26-video.dtsi.

该文件是屏幕的配置文件,屏幕休眠唤醒时会走此文件。配置项目包括:

mdss-dsi-h-back-porch、mdss-dsi-h-front-porch、mdss-dsi-h-pulse-width、mdss-dsi-h-sync-skew等。

 

具体可参考文件:kernel/Documentation/devicetree/bindings/fb

其中在文件开头有一变量dsi_ili9806e_fwvga_hsd_hlt_x26_vid,其值必须和启动引导部分的结构体ili9806e_fwvga_hsd_helitai_x26_video_panel_data的第一个成员相同。

引导部分和内核相关联就是这个panel_node_id,这样屏幕待机之后唤醒就会找到引导时候的初始化屏幕路线。引导部分和内核部分的桥梁就是panel_node_id(变量dsi_ili9806e_fwvga_hsd_hlt_x26_vid),他写进cmd-line,最后传给内核。

 

 

2)在文件msm8909-mdss-panels.dtsi添加头文件:

即添加一行代码:#include "dsi-panel-ili9806e-fwvga-hsd-helitai-x26-video.dtsi"

其中该文件是屏幕的配置文件

 

3)添加自己的屏幕(注意语法,不要漏掉分号):

&dsi_ili9806e_fwvga_hsd_hlt_x26_vid {

       qcom,cont-splash-enabled;

};

(4)将id设置为自己的id,这一步很重要,否则,开机屏幕正常,但是一旦休眠,再次唤醒手机,手机就是白屏,因为,唤醒虽然走的是开机的初始化路线,但是在这里却进入了另一种型号的屏幕了!

&mdss_dsi0 {

/*qcom,dsi-pref-prim-pan = <&dsi_ili9806e_fwvga_video>;*/

qcom,dsi-pref-prim-pan = <&dsi_ili9806e_fwvga_hsd_hlt_x26_vid>;//在这一行改为自己的屏幕

pinctrl-names = "mdss_default", "mdss_sleep";

  ......

};

 

到此,内核部分修改完成!

编译:make bootimage -j6

烧写:sudo fastboot flash boot boot.img

 

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: Android内核驱动移植是将特定硬件设备的驱动程序适配到Android操作系统上的过程。在移植过程中需要考虑硬件设备与操作系统之间的兼容性,确保硬件设备能够在Android系统上正常工作。 首先,进行Android内核驱动移植的前提是要了解硬件设备的驱动程序。开发人员需要对设备硬件结构有一定了解,并获取硬件设备的相关驱动程序源代码和文档。 然后,开发人员需要将硬件设备的驱动程序源代码与Android内核进行集成,确保代码的兼容性。这可能涉及到对驱动程序的修改、添加和删除,以适应Android内核的要求。同时,需要进行相应的配置工作,将硬件设备与Android内核进行绑定。 接下来,需要编译和构建移植后的Android内核。开发人员需要使用交叉编译工具链,将修改后的驱动程序源代码编译为与目标平台兼容的二进制文件。构建过程中还需要确保相关的编译选项和依赖库的设置是正确的。 最后,将编译完成的Android内核镜像烧录到目标硬件设备上,进行测试和调试。通过测试和调试,开发人员可以验证驱动程序的正确性和稳定性,确保硬件设备在Android系统上的正常工作。 总之,Android内核驱动移植需要开发人员对硬件设备驱动编程有一定的了解,同时具备一定的编译和调试技能。通过适配和修改驱动程序,将硬件设备与Android内核进行集成,最终实现硬件设备在Android系统上的正常工作。 ### 回答2: Android内核驱动移植是指将一个已存在的硬件设备驱动程序移植到Android系统上,以便在该系统上能够对该设备进行控制和使用。移植步骤大致包括对硬件设备的硬件接口进行理解、准备移植环境、修改设备驱动源代码、编译并生成可以在Android系统上运行的设备驱动模块。下面对Android内核驱动移植的过程进行详细说明。 首先,进行移植前需要对目标硬件设备的硬件接口进行全面理解,并获得相关的文档和驱动源代码,以便后续修改和适配。 其次,需要准备一个适合的开发环境,包括正确的Android内核版本,相应的编译工具链和必要的库文件。 然后,根据目标硬件设备的特点和Android系统的要求,修改设备驱动源代码。这一步需要根据硬件设备的数据结构、寄存器配置和控制寄存器等,对驱动程序进行相应的修改和适配。 接下来,进行编译工作。根据移植好的设备驱动源代码,在准备的开发环境中使用正确的编译工具链进行编译,生成可以在目标Android系统上运行的设备驱动模块。 最后,将生成的设备驱动模块移植到Android系统中。通过adb等工具将驱动模块传输到Android设备上,并将其加载到内核中,使得系统能够识别并正确控制硬件设备。 需要注意的是,Android内核驱动移植过程中可能会遇到各种问题,例如硬件兼容性、驱动与内核版本不匹配等。因此,在移植过程中需要仔细分析和解决这些问题,确保驱动移植成功并能够正常工作。 综上所述,Android内核驱动移植是一项复杂的工作,需要对目标设备的硬件接口有深入理解,并进行相关的修改和适配,最终使得设备能够在Android系统中正常运行。 ### 回答3: Android内核驱动移植是指将一个设备的硬件驱动程序从一个硬件平台(如手机、板卡)移植到另一个硬件平台上,以使设备能够在新的硬件平台上正常工作。 移植Android内核驱动的过程包括以下几个步骤: 1. 硬件分析:首先,需要对目标硬件进行详细的分析,包括内部的组件、接口等。根据硬件的特点,了解所需移植驱动程序。 2. 源代码准备:在移植过程中,需要准备源代码,包括Android内核和相关的驱动程序。确保源代码的版本与目标硬件的兼容性。 3. 驱动程序移植:根据目标硬件的需求,对原有的驱动程序进行修改。这可能包括修改硬件接口、端口或中断处理程序,以适配新的硬件平台。 4. 编译和测试:完成驱动程序的移植后,需要进行编译和测试。确保驱动程序在新的硬件平台上能够正确运行,与其他系统组件相互协调。 5. 修复问题和优化:在测试过程中可能会出现问题,需要进行修复和优化。这可能包括调整配置参数、修复驱动程序中的错误或与其他组件的兼容性问题。 移植Android内核驱动可以使不同型号的设备在使用相同版本的Android系统时,能够充分发挥其硬件的功能。同时,也可以支持新的硬件平台加入到Android生态系统中,为用户提供更多的选择。 需要注意的是,Android内核驱动移植是一个复杂的过程,需要掌握相关的技术和知识。对于一些特殊的设备,可能需要进行更多的工作和定制。因此,在进行移植之前,要充分了解目标硬件的特性和要求,保证移植的成功和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值