高通LCD驱动调试
本文转载自:http://www.itgo.me/a/x6305658852004979994/lcd%20qcom
来自 :http://blog.csdn.net/dacaozuo/article/details/7796476来公司上班现在已经整整一个月了,蔽人不才,能力有限,学习进度缓慢,不过也是有一点点的收获与心得,在这里写出来与大家分享,养成良好的记录习惯也免得后忘记。
不啰嗦了,开入正题。来公司一个月左右的时间,主要接触了高通android4.0和android2.3的LCD驱动,当然在bootloader下LCD的驱动我也调试的。
(1) kernel
先来说一下kernel里LCD的移植,之前从来没有接触过LINUX里LCD的驱动,所以刚一开始我竟然连MIPI接口、LCDC接口这些最基本的都不知道,鄙视一下我自己,呵呵。感觉android2.3和android4.0在kernel里LCD驱动上的区别不是特别大。只是android2.3里多了一个late_display.c这个文件,背光和MDP的开关以及屏的初始化都是在这个文件里调用的。
因为高通给的codebase本身包含有一些LCD芯片的驱动,我在2.3上用的是MIPI接口的,是根据truly的例子来做的。在2.3上我们使用的是MIPI CMD模式,从truly的例子移植的时候代码的大体结构不需要改动,一般只是需要针对要更改的屏的文档作一些参数与配置的修改就可以了。我是照着truly的在/kernel/drivers/video/msm下创建mipi_hx8369a.cMipi_hx8369a_cmd_wvga_pt.c这两个文件,从truly的例子中把内容拷过来,把名字全改成hx8369a,的mipi_hx8369a.c里面,主要就是GPIO_HX8369A_LCD_RESET的宏,根据原理图来定义正确的RESET管脚,然后还有mipi_hx8369a_lcd_reset()里LCD初始化之前reset的时序要根据lcd芯片的spec来,初始化之前的reset对lcd非常重要;最后就是根据FAE给的初始化指令填好初始化数组。
在Mipi_hx8369a_cmd_wvga_pt.c文件里有一些要传到frame_buffer中去的一些参数,这些参数与所选用的显示屏有关,在这里把最主要的一些列出来:
[cpp] view plain copypinfo.xres = 480;
// LCD的x方向宽度
pinfo.yres = 800;
// LCD的y方向高度
pinfo.type = MIPI_CMD_PANEL;
// LCD接口是哪种类型,如MIPI_VIDEO_PANEL,LCDC_PANEL
pinfo.pdest = DISPLAY_1;// 应该是系统中的第几个屏(我自己猜测的)
pinfo.bpp = 24;//每个像素的bit位数,即是多少位色
//下面几个porch值可以从FAE要到
pinfo.lcdc.h_back_porch = 16;
pinfo.lcdc.h_front_porch = 16;
pinfo.lcdc.h_pulse_width = 16;
pinfo.lcdc.v_back_porch = 4;
pinfo.lcdc.v_front_porch = 4;
pinfo.lcdc.v_pulse_width = 4;
pinfo.bl_max = 32;
//背光的最大和最小等级
pinfo.bl_min = 1;
pinfo.fb_num = 2;// 显存的个数
pinfo.clk_rate = 349000000;//LCD的p_clock时种频率,要与Modem里的值对应起来
pinfo.mipi.mode = DSI_CMD_MODE;
//mipi接口的模式
pinfo.mipi.dst_format = DSI_CMD_DST_FORMAT_RGB888;
//RGB的格式
pinfo.mipi.rgb_swap = DSI_RGB_SWAP_RGB; //RGB的排序
pinfo.mipi.data_lane0 = TRUE;
//是否使用MIPI的第一个通道
pinfo.mipi.data_lane1 = TRUE;
//是否使用MIPI的第二个通道
其它的一些参数我还没弄清是什么意思,不明白就照着别的例子抄来吧。
由于android2.3里有一个late_display.c的函数,这个函数用来控制背光、MDP的开关以及打开屏的时候调用mipi_hx8369a.c和Mipi_hx8369a_cmd_wvga_pt.c中的初始化函数mipi_hx8369a_lcd_late_init()和mipi_cmd_hx8369a_wvga_pt_late_init()。所以late_display.c里把变量gpio_backlight_en的值改为当前使用的背光控制管脚。函数mipi_hx8369a_lcd_late_init()和mipi_cmd_hx8369a_wvga_pt_late_init()是在late_display_ioctl()里调用,在上层打开LCD设备的时候会来设用这两个函数来初始化LCD设备。
下面就是要改board文件了,在board文件里会给LCD分配显存,这里会有一个宏MSM_FB_SIZE,通过计算后填一个有余量的值便好。然后就是在board文件里添加设备以及设备相关的一些资源,也可以参考别的芯片的例子来。定义[cpp] view plain copystatic struct msm_panel_common_pdata mipi_pdata = {
.gpio = GPIO_BACKLIGHT_EN,
};
这里定义了控制背光的GPIO管脚,如果背光控制管脚使用的是PMIC的一个GPIO来控制,使用的方法也不一样,在下一篇4.0的LCD移植中会写这种方式。还要定义一个platform_device,[cpp] view plain copystatic struct platform_device mipi_dsi_panel_device = {
.name = "mipi_hx8369a",
.id = 0,
.dev
= {
.platform_data = &mipi_pdata,
}
};
这里name要与mipi_hx8369a.c里的platform_driver里的名字一样,id要选择0,因为mipi_hx8369a.c里还会分配一个platform_device,它的name和这个一样,所以mipi_hx8369a.c里的probe函数会被调用两次,第一次与board里的platform_devices匹配,目的是为了将背光的管脚号传递给驱动(因为我这里使用了late_display.c里的变量,而且背光控制是在late_display.c里,所以这里的管脚号也不重要了)。
最后再把结构体mipi_dsi_panel_device加到board文件里添加设备的数组中,当系统启动时统一向内核中注册设备。
kernel里驱动文件添加和修改就基本完成了,然后就是要在/kernel/driver/video/msm里修改Kconfig和Makefile文件.
在Makefile里,添加[cpp] view plain copyobj-$(CONFIG_FB_MSM_MIPI_DSI_HX8369A) += mipi_hx8369a.o
obj-$(CONFIG_FB_MSM_MIPI_HX8369A_CMD_WVGA_PT) += mipi_hx8369a_cmd_wvga_pt.o
在Kconfig里,添加[cpp] view plain copyconfig FB_MSM_MIPI_HX8369A_CMD_WVGA_PT_PANEL
bool "MIPI Yassy Command WVGA PT Panel"
select FB_MSM_MIPI_HX8369A_CMD_WVGA_PT
config FB_MSM_MIPI_HX8369A_CMD_WVGA_PT
bool
select FB_MSM_MIPI_DSI_HX8369A
default n
但有一点要注意的是,config FB_MSM_MIPI_HX8369A_CMD_WVGA_PT_PANEL这个的位置要放在choice包含的里面,具体可以参考truly的例子的位置。
最后,运行make kernelconfig,在里面选中
相关推荐:[MTK]LCD 调试总结
原文已删除
FB_MSM_MIPI_HX8369A_CMD_WVGA_PT_PANEL和FB_MSM_MIPI_HX8369A_CMD_WVGA_PT,然后在/kernel/arch/arm/configs下找到与工程相关的配置文件,在里面可以找到选中的配置,在编绎的时候,根据这个成.config文件,在out/target/product/$(Projec)/obj/KERNEL_OBJ,在这里也可以查到最后选中的配置。
(2) bootloader
我每次都是先移植kernel里的LCD驱动,因为我觉得kernel里的代码要相对集中一些,而且就算是代码弄的有问题,也不会造成手机找不到端口而下不了程序,而且kernel里的LOG要容易抓一些,bootloader里还得接个串口,太麻烦。然后就是有了kernel里驱动,bootloader里的LCD也要简单一些了,毕竟有了一些经验了。
在bootloader里移植LCD有一点需要特别注意,就是/bootable/bootloader/lk/platform/msm_shared/splash.h这个文件,如果高通的codebase是Lcdc接口的,而你要改为mipi接口的话,这个文件一定要注意更换,否则会造成手机找不到端口而直接挂掉。蔽人不才,由于这个原因烧坏了手机不下十次,鄙视一下在这里,哈哈。更换了splash.h后还要注释掉/vendor/qcom/opensource/qrdplus/QRDExtensions/DynamicComponents/res/Splash_QRD/Android.mk这个文件下的[cpp] view plain copyifeq ($(strip $(QRDExt_Splash)),cu)
$(shell cp $(LOCAL_PATH)/splash_cu.h bootable/bootloader/lk/platform/msm_shared/include/splash.h)
else
$(shell cp $(LOCAL_PATH)/splash_qrd.h bootable/bootloader/lk/platform/msm_shared/include/splash.h)
endif
这几句,否则在你编译的时候,你改过的splash.h会被更改回去。
步入正题吧,该说说bootloader里移植lcd驱动了。高通的bootloader使用的是一个叫lk(little kernel)的bootloader,在lk里也有不少高通提供的示例代码,我一般也是参考truly的来改,同样的,代码的大体结构都不需要更改。首先要在目录/bootable/bootloader/lk/target/$(Projec)下更改lcd的makefile文件rules.mk,由于我们的手机是从nand flash启动,所以要改的都在NDND启下的方式下改。在rules.mk下添加:[cpp] view plain copyDEFINES += DISPLAY_MIPI_CMD_PANEL_HX8369A=1
代码的主要流程基本上可以根着codebase里truly的来照着填,这里简单的列一下:[cpp] view plain copyvoid kmain()(/bootable/bootloader/lk/kernel/main.c)
->
thread_resume (thread_create("bootstrap2", &bootstrap2, NULL, DEFAULT_PRIORITY, DEFAULT_STACK_SIZE));
-> bootstrap2
->
target_init(); (bootable\bootloader\lk\target\$(project)\Init.c)
->/*这里是bootloader里按键的驱动*/
#if (!ENABLE_NANDWRITE)
keys_init();
keypad_init();
#endif
/* 下面的就是与屏相关的函数,下面来一个一个的分析*/
#if DISPLAY_SPLASH_SCREEN
display_init();
dprintf(SPEW, "Diplay initialized\n");
display_image_on_screen();
mdelay(50);
//turn on backlight
gpio_set(I300_PANEL_BACKLIGHT, 1);
/*打开LCD背光*/
#endif
[cpp] view plain copydisplay_init()
(/bootable/bootloader/lk/platform/msm7627a/platform.c)
->panel_dsi_init()/*主要是初始化LCD相关的管脚,如reset和backlight*/
->mipi_init()(/bootable/bootloader/lk/platform/msm_shared/mipi_dsi.c)
->struct mipi_dsi_panel_config *panel_info = get_panel_info()
->
return &hx8369a_cmd_panel_info;/*结构体hx8369a_cmd_panel_info里是一些与LCD相关的参数,可参考kernel里填写,但有一点要注意,就是这里面有lcd芯片的初始化参数,它有特定的格式,第一个是参数个数,接着三是固定值,剩下的才是初始化参数,而且所有这些必须是4的整数倍,若不够则补0xff*/
->mipi_dsi_phy_init() (/bootable/bootloader/lk/target/$(project)/panel.c)/*设置mipi接口相关的一些寄存器*/
->status += mipi_dsi_panel_initialize(panel_info);
->
status = mipi_dsi_cmds_tx(pinfo->panel_cmds, pinfo->num_of_panel_cmds);/*这里对LCD进行初始化,然后屏里写初始化参数*/
-> mipi_fb_cfg.base = MIPI_FB_ADDR;
/*DMA地址*/
-> cmd_mode_status = 1;/*标记为cmd模式*/
[cpp] view plain copydisplay_image_on_screen()
(/bootable/bootloader/lk/dev/fbcon/fbcon.c)
-> for (i = 0; i < SPLASH_IMAGE_WIDTH_HDPI; i++)
/*向DMA地址写数据*/
{
memcpy (config->base + ((image_base_hdpi + (i * (config->width))) * bytes_per_bpp),
imageBuffer_rgb888 + (i * SPLASH_IMAGE_HEIGHT_HDPI * bytes_per_bpp),
SPLASH_IMAGE_HEIGHT_HDPI * bytes_per_bpp);
}
-> fbcon_flush();
-> if(is_cmd_mode_enabled()) /*如果是CMD模式,就启动MDA,往LCD里送显示数据*/
-> mipi_dsi_cmd_mode_trigger();
到这里lk里LCD移植也写完了,如果认为有问题的地方,欢迎提出来。下一篇再写4.0里LCD的移植,4.0里使用的是LCDC的接口。
高通LCD驱动调试的更多相关文章
- 【转】Android LCD(四):LCD驱动调试篇
关键词:android LCD TFTSN75LVDS83B TTL-LVDS LCD电压背光电压 平台信息:内核:linux2.6/linux3.0系统:android/android4.0 平台 ...
- 高通 display 驱动【转】
高通display驱动 0. 关键字 MDSS : 高通平台lcd multimedia Display sub system DSI: Display Serial Interface qcom,m ...
- 高通LCD的pwm背光驱动
发生异常的现象: msm8953 lcd在快速亮灭的情况下背光概率性休眠不灭:测量高通pwm,发现正常的时候pwm的管脚LCM_BL_PWM为低电平,失败的时候为高电平: 根据原理图: mpp是什么? ...
- android系统平台显示驱动开发简要:LCD驱动调试篇『四』
平台信息: 内核:linux3.4.39系统:android4.4 平台:S5P4418(cortex a9) 作者:瘋耔(欢迎转载,请注明作者) 欢迎指正错误,共同学习.共同进步!! 关注博主新浪博 ...
- 高通平台Camera调试(一)【转】
本文转载自:http://www.voidcn.com/blog/Winva/article/p-6044730.html 4.3. Camera 参考文档: 1) 80-NA157-22_PRESE ...
- 高通msm8909耳机调试
http://blog.csdn.net/mike8825/article/details/69489865?locationnum=3&fps=1 1.DTS相应修改: DTS相关代码:ke ...
- Android : 高通平台Camera调试之SetpropKey/camxoverridesettings.txt
高通相关网址:Createpoint: https://createpoint.qti.qualcomm.com(可下载文档,Release Note等)Chipcode: https://chipc ...
- 高通MSM8255 GPS 调试分析&&Android系统之Broadcom GPS 移植【转】
本文转载自:http://blog.csdn.net/gabbzang/article/details/12063031 http://blog.csdn.NET/dwyane_zhang/artic ...
- 高通GPIO驱动(DTS方式)
gpio调试的方式有很多,linux3.0以上ARM架构的处理器基本上都采用了DTS的方式,在linux3.0可以通过获取sysfs的方式来获取gpio状态: sysfs文件系统的建立可以参照下面的博 ...
随机推荐
- POJ 1426 Find The Multiple && 51nod 1109 01组成的N的倍数 (BFS + 同余模定理)
Find The Multiple Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 21436 Accepted: 877 ...
- wtform 表单示例
用户注册 from flask import Flask, render_template, request, redirect from wtforms import Form from wtfor ...
- Redis 在windows中启动
redis-server.exe redis.windows.conf 或 redis-server.exe redis.conf
- 那些可爱的 Linux 命令
环境 root@15b883:~# uname -a ##需要是Ubuntu环境 Linux 15b883 --generic #- :: UTC x86_64 x86_64 x86_64 GNU/L ...
- Nginx模块系列之auth_basic模块
1.1 介绍 ngx_http_auth_basic_module模块实现让访问着,只有输入正确的用户密码才允许访问web内容.web上的一些内容不想被其他人知道,但是又想让部分人看到.nginx的h ...
- odata配置控制器方法路由1
查看edmx:http://localhost:12769/odata/$metadata 1.配置 ODataConventionModelBuilder builder = new ODataCo ...
- 使用jsx语法环境搭建
1.安装nodejs.nodejs安装后会自带npm,可以用 npm -v 进行查看版本.使用 npm install npm -g 更新文档. 2.创建自己项目,在你的项目路径下执行npm init ...
- PHP连接MySQL数据库操作
(原文链接:http://www.cnblogs.com/csensix/archive/2012/05/23/2515494.html) 方法一:普通方法(面向过程) 首先,先做出如下假设(也适用与 ...
- 普通摄像机也能做互联网HLS(m3u8)、RTMP、HTTP-FLV直播?是的,采用基于GBT28181协议的EasyGBS流媒体服务
在之前的一篇博客<EasyNVR和EasyDSS云平台联手都不能解决的事情,只有国标GB28181能解决了>我们介绍了很多应用场景里面,RTSP和RTMP直播协议都无法满足应用需求时,国标 ...
- String、StringBuffer、StringBuiler区别
1.String与StringBuiler的相同点都是线程不安全的.StringBuffer是线程安全的. 2.String长度不可变,StringBuiler长度可变.当String 使用(+)连接 ...