LCD显示移植(LVDS接口)

Platform: IMX6QP

OS: Android Lollipop 5.1

Freescale Branch: l5.1.1_2.1.0-ga

Kernel Branch: 3.14.52



此例LCD用的是LVDS接口,LDB模块。
 移植分两部分:
HW:电源以及GPIO部分。
SW: LCD timing,BPP,分辨率。

HW部分:
LCD有DVDD和AVDD两个电源,原理图如下:

LCD显示移植(LVDS接口)_第1张图片
LCD显示移植(LVDS接口)_第2张图片


LCD_AVDD受LCD_VDD控制,LCD_VDD受LCD_PWR_EN pin控制。
本来要考虑各个电源以及reset pin的上电时序,本例中LCD硬件模块已经帮我们做好了,
所以只要控制LCD_PWR_EN,那么上电时序就能正常完成。
LCD_PWR_EN对应的GPIO为GPIO_3_0,开机时只要拉高即可。

LCD_VDD的供电来自SYS_5V,它的最终源头是从PMIC MMPF0100的VGEN2,所以
需要设置其电压,其中要注意的是MMPF0100是通过I2C控制的,驱动加载顺序可能
会在LCD模块后面,所以需要调换下驱动加载顺序,让LCD模块晚于PMIC,这样才
能使用regulator 函数接口。
LCD显示移植(LVDS接口)_第3张图片


SW部分:
这部分主要根据LCD spec来确定,有分辨率,bpp, timing,如下:
LCD显示移植(LVDS接口)_第4张图片

LCD显示移植(LVDS接口)_第5张图片


代码实现:
arch/arm/boot/dts/eco/imx6qdl-sabresd.dtsi:
[plain]  view plain  copy
  1. /*Kris,20160406, Porting lcd driver.*/  
  2. &ldb {  
  3.     status = "okay";  
  4.   
  5.     lvds-channel@0 {  
  6.         fsl,data-mapping = "spwg";  
  7.         fsl,data-width = <24>;  
  8.         primary;  
  9.         status = "okay";  
  10.   
  11.         display-timings {  
  12.             native-mode = <&timing0>;  
  13.             timing0: cog_t700mixn {  
  14.                 clock-frequency = <50000000>;  
  15.                 hactive = <1024>;  
  16.                 vactive = <600>;  
  17.                 hback-porch = <220>;  
  18.                 hfront-porch = <40>;  
  19.                 vback-porch = <21>;  
  20.                 vfront-porch = <7>;  
  21.                 hsync-len = <60>;  
  22.                 vsync-len = <10>;  
  23.             };  
  24.         };  
  25.     };  
  26. };  
[plain]  view plain  copy
  1. / {  
  2.     /*Kris,20160406, Porting lcd driver.*/  
  3.     cog_t700mixn {  
  4.         compatible = "cog_t700mixn";  
  5.         bl_power_gpio = <&gpio4 14 1>;  
  6.         lcd_power_gpio = <&gpio3 0 1>;  
  7.         DVDD-supply = <&vgen2_reg>;  
  8.     };  
  9. };  
[plain]  view plain  copy
  1.   imx6qdl-sabresd {  
  2.         pinctrl_hog: hoggrp {  
  3.             fsl,pins = <  
  4.             ......  
  5.                 MX6QDL_PAD_EIM_DA0__GPIO3_IO00  0x80000000  
  6.             >;  
  7.         };  
[plain]  view plain  copy
  1.   mxcfb1: fb@0 {  
  2.         compatible = "fsl,mxc_sdc_fb";  
  3.         disp_dev = "ldb";  
  4.         interface_pix_fmt = "RGB24";  
  5.         default_bpp = <32>;  
  6.         int_clk = <0>;  
  7.         late_init = <0>;  
  8.         status = "disabled";  
  9.     };  
  10.   

arch/arm/configs/imx_v7_android_defconfig:
[plain]  view plain  copy
  1. #Kris,20160406, Porting lcd driver.  
  2. CONFIG_COG_T700MIXN=y  

drivers/Makefile:
[plain]  view plain  copy
  1. # regulators early, since some subsystems rely on them to initialize  
  2. obj-$(CONFIG_REGULATOR)     += regulator/  
  3.   
  4. #Kris,20160406, Porting lcd driver.  
  5. #Load lcd driver after regulator module to wait it to be ready.  
  6. obj-y               += video/  

drivers/video/mxc/Kconfig:
[plain]  view plain  copy
  1. #Kris,20160406, Porting lcd driver.  
  2. config COG_T700MIXN  
  3.     bool "COG T700MIXN lcd driver."  
  4.     default n  

drivers/video/mxc/Makefile:
[plain]  view plain  copy
  1. #Kris,20160406, Porting lcd driver.  
  2. obj-$(CONFIG_COG_T700MIXN) += cog_t700mixn.o  

drivers/video/mxc/cog_t700mixn.c:
[cpp]  view plain  copy
  1. "font-size:14px;">#include   
  2. #include   
  3. #include   
  4. #include   
  5. #include   
  6. #include   
  7. #include   
  8. #include   
  9. #include   
  10.   
  11. #define DRIVER_NAME "cog-t700mixn"  
  12.   
  13. static const struct of_device_id t700mixn_dt_ids[] = {  
  14.     { .compatible = "cog_t700mixn", },  
  15.     { /* sentinel */ }  
  16. };  
  17. MODULE_DEVICE_TABLE(of, t700mixn_dt_ids);  
  18.   
  19. static int t700mixn_probe(struct platform_device *pdev)  
  20. {  
  21.     static struct regulator *dvdd_regulator;  
  22.     struct device_node *lcd = NULL;  
  23.     int ret, bl_power_gpio, lcd_power_gpio;  
  24.   
  25.     printk("%s\n", __func__);  
  26.   
  27.     lcd = pdev->dev.of_node;  
  28.   
  29.     //enable backlight power.  
  30.     bl_power_gpio = of_get_named_gpio(lcd, "bl_power_gpio", 0);  
  31.     if (gpio_is_valid(bl_power_gpio)) {  
  32.         ret = gpio_request_one(bl_power_gpio, GPIOF_OUT_INIT_HIGH,  
  33.             "bl_power_gpio");  
  34.         pr_info("request bl_power_gpio\n");  
  35.         if (ret)  
  36.             pr_warn("failed to request bl_power_gpio\n");  
  37.     }  
  38.   
  39.     //Set VGEN2 of pmic.  
  40.     dvdd_regulator = devm_regulator_get(&pdev->dev, "DVDD");  
  41.     if (!IS_ERR(dvdd_regulator)) {  
  42.         regulator_set_voltage(dvdd_regulator,1500000,1500000);  
  43.         ret = regulator_enable(dvdd_regulator);  
  44.         if (ret) {  
  45.             pr_err("%s:DVDD set voltage error\n", __func__);  
  46.             return ret;  
  47.         } else {  
  48.             dev_info(&pdev->dev,"%s:DVDD set voltage ok\n", __func__);  
  49.         }  
  50.     } else {  
  51.         dvdd_regulator = NULL;  
  52.         pr_err("%s: cannot get DVDD voltage error\n", __func__);  
  53.     }  
  54.   
  55.     //this gpio control DVDD and AVDD together.  
  56.     lcd_power_gpio = of_get_named_gpio(lcd, "lcd_power_gpio", 0);  
  57.     if (gpio_is_valid(lcd_power_gpio)) {  
  58.         ret = gpio_request_one(lcd_power_gpio, GPIOF_OUT_INIT_HIGH,  
  59.             "bl_power_gpio");  
  60.         pr_info("request lcd_power_gpio\n");  
  61.         if (ret)  
  62.             pr_warn("failed to request lcd_power_gpio\n");  
  63.     }  
  64.   
  65.     return ret;  
  66. }  
  67.   
  68. static struct platform_driver t700mixn_driver = {  
  69.     .probe  = t700mixn_probe,  
  70.     .driver = {  
  71.         .of_match_table = t700mixn_dt_ids,  
  72.         .name   = DRIVER_NAME,  
  73.         .owner  = THIS_MODULE,  
  74.     },  
  75. };  
  76. module_platform_driver(t700mixn_driver);  
  77.   
  78. MODULE_AUTHOR("Kris.Fei");  
  79. MODULE_DESCRIPTION("COG T700MIXN lcd driver");  
  80. MODULE_LICENSE("GPL");  
  81. MODULE_ALIAS("platform:" DRIVER_NAME);  
  82.   

参考:
kernel/Documentation/devicetree/bindings/staging/imx-drm/ldb.txt
kernel/Documentation/devicetree/bindings/fb/fsl_ipuv3_fb.txt
http://blog.chinaunix.net/uid-20680966-id-3623224.html

你可能感兴趣的:(Android,i.MX6)