不啰嗦了,开入正题。来公司一个月左右的时间,主要接触了高通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 copy
- pinfo.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 copy
- static struct msm_panel_common_pdata mipi_pdata = {
- .gpio = GPIO_BACKLIGHT_EN,
- };
这里定义了控制背光的GPIO管脚,如果背光控制管脚使用的是PMIC的一个GPIO来控制,使用的方法也不一样,在下一篇4.0的LCD移植中会写这种方式。还要定义一个platform_device,
[cpp] view plain copy
- static struct platform_device mipi_dsi_panel_device = {
- .name = “mipi_hx8369a”,
- .id = 0,
- .dev = {
- &n
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!