LCM分析及移植流程
来源:互联网 发布:淘宝怎么用erp转订单 编辑:程序博客网 时间:2024/05/17 04:21
文章来自:http://www.verydemo.com/demo_c131_i13092.html
一、
\mediatek\platform\mt6573\uboot\mt6573_disp_drv.c
\mediatek\platform\mt6573\uboot\mt6573_disp_drv_dpi.c
\mediatek\platform\mt6573\uboot \mt6573_disp_drv_dbi.c
\mediatek\platform\mt6573\uboot \mt6573_dpi_drv.c
\mediatek\platform\mt6573\uboot \mt6573_dsi_drv.c
\mediatek\platform\mt6573\uboot \mt6573_lcd_drv.c
\mediatek\source\kernel\drivers\video\mtkfb.c
\mediatek\source\kernel\drivers\video\disp_drv.c
\mediatek\source\kernel\drivers\video\disp_drv_dpi.c
\mediatek\source\kernel\drivers\video\disp_drv_dbi.c
\mediatek\platform\mt6573\kernel\drivers\video\lcd_drv.c
\mediatek\platform\mt6573\kernel\drivers\video\dpi_drv.c
\mediatek\platform\mt6573\kernel\drivers\video\dsi_drv.c
\mediatek\custom\common\kernel\lcm\LCM_NAME\LCM_NAME.c
\mediatek\platform\mt6573\uboot \mt6573_pwm.c
\mediatek\platform\mt6573\uboot \mt65xx_leds.c
\mediatek\source\kernel\drivers\leds\leds.c
\mediatek\custom\ginwave73_gb\kernel\leds\mt65xx\cust_leds.c
二、
LCD模组主要包括LCD显示屏和驱动IC。比如LF040DNYB16a模组的驱动IC型号为NT35510。要在MTK6573平台上新建这个lcd的驱动,步骤如下:
1、
2、
3、
三、
LCM_DRIVER
{
};
(1)lcm_get_params主要是设置LCM相关的参数,数据结构如下:
typedef struct
{
LCM_CTRL ctrl;
} LCM_PARAMS;
LCM_TYPE
parallelDBI(B型DBI)的命令和数据都在数据总线D[17:0]上传输。CSX为低时数据有效。WRX线控制D[17:0]为写时序,RDX控制D[17:0]为读时序。D/CX指示D[17:0]上传输的是命令还是数据。注:MT6573使用LPA0线作为D/CX线,LPCE线作为CSX线,LWRB线作为WRX线,LRDB线作为RDX线。
serialDBI(C型DBI)的命令和数据都在SPI接口上传输。CSX为低时SDA有效。SCL提供时钟,DIN输入,DOUT输出。当SDA_EN=1时,DIN线成为双向的SDA线,即可输入又可输出,DOUT线不用。C型DBI分为3线(没有D/CX线)和4线(有D/CX线)两种。3线的使用一个D/CXbit来区分命令/数据,4线的使用D/CX线来区分命令/数据。注:MT6573使用LSA0线作为D/CX线,LSCE线作为CSX线。LSCK线作为SCL线,LSDA线作为SDA线。
DPI的命令在SPI上传输,Pixel data(RGB data)在D[17:0]上传输。其命令传输方式与serialDBI相同。对于Pixel data(RGBdata),需要自己的4条控制线:DPICK_PIN(RGB时钟)
typedef enum
{
}
LCM_CTRL定义LCM与HOST之间传递command的方式,有SERIAL_DBI、PARALLEL_DBI、GPIO几种控制方式。如果是DPI接口,其LCM_CTRL可以选择SERIAL_DBI或者GPIO。
Width和height定义LCM的宽度和高度。
io_select_mode有这些选项:0(LCD_IO_SEL_16CPU_24RGB),1(LCD_IO_SEL_18CPU_18RGB),2(LCD_IO_SEL_24CPU_8RGB),3(LCD_IO_SEL_24CPU_ONLY)。根据driverIC
LCM_×××_PARAMS根据不同的LCM_TYPE取值,这是针对DBI/DPI/DSI接口类型的详细参数定义。比如LCM_DPI_PARAMS定义如下:
typedef struct
{
} LCM_DPI_PARAMS;
其中,第一段前4项用于控制DPI时钟,计算公式如下:
Pixel Clock Frequency = 26MHz * mipi_pll_clk_div1 /(mipi_pll_clk_ref + 1)/ (2 * mipi_pll_clk_div2)/ dpi_clk_div
第二段4个参数设置DPICK_PIN(RGB时钟)
行同步脉冲开始前和开始后的几个时钟周期,是行信号消隐期;场同步开始前和开始后的几个行周期,是场信号消隐期。消隐期不传递图像信号。消隐期特性由第三段六个参数定义:hsync_pulse_width;
LCM_DPI_FORMAT指定每个像素中RGB各占几个bit.
LCM_COLOR_ORDER指定RGB的顺序。
上述参数的值,均依照LCM spec及驱动IC datasheet中的定义。
这里要说说一个特别之处。NT35510使用DPI接口,SERIAL_DBIctrl
(2)lcm_init主要实现LCM的初始化,包括如下步骤:
(3)lcm_suspend
0X2800 (or
0X1000 (or
对nt35510而言,还有一种更深睡眠的状态——deep standby mode,使用如下命令进入:
0X4F00
(4)lcm_resume使LCM苏醒,使用特定的命令,并遵守datasheet定义的时间特性。
唤醒命令组:
0X1100(or
0X2900(or
对nt35510而言,如果在lcm_suspend中使LCM enter deep standbymode,则不能使用唤醒命令组,需要使用reset信号并要重新init_lcm_registers。
四、
Mtkfb.c中实现了LCM的platform driver:
static struct platform_driver
{
};
mtkfb_probe会调用函数mtkfb_find_lcm_driver来发现LCM的硬件层驱动。mtkfb_find_lcm_driver——DISP_SelectDevice——disp_drv_get_lcm_driver,检查lcm_driver_list[],得到当前使用的LCM及其驱动名称。
Mt6573_devs.c中,定义了framebuffer型的platformdevice,这个设备在mt6573_board_init()调用时被注册。它所对应的驱动就是上文提到的mtkfb_driver
static struct platform_device
};
在linux
static struct
};
五、
mtkfb_driver中的各个函数会调用到DISP_xxx函数(DISP_drv.c),而DISP_xxx会调用到LCD_xxx函数(lcd_drv.c)以及LCM硬件层驱动。
mtkfb_probe的主要工作如下:
*
*
*
struct fb_info {
#ifdefCONFIG_FB_BACKLIGHT
#endif
#ifdef CONFIG_FB_DEFERRED_IO
#endif
#ifdef CONFIG_FB_TILEBLITTING
#endif
#define FBINFO_STATE_RUNNING
#defineFBINFO_STATE_SUSPENDED
};
1)fb_var_screeninfo
这个结构描述了显示卡的特性:
NOTE:
struct fb_var_screeninfo
{
__u32 xres; //可视区域
__u32 yres;
__u32 xres_virtual; //可视区域
__u32 yres_virtual;
__u32 xoffset; //可视区域的偏移
__u32 yoffset;
__u32 bits_per_pixel; //每一象素的bit数
__u32 grayscale; //等于零就成黑白
struct fb_bitfield red; 真彩的bit机构
struct fb_bitfield green;
struct fb_bitfield blue;
struct fb_bitfield transp;
__u32 nonstd;
__u32 activate;
__u32 height;
__u32 width;
__u32 accel_flags;
时序-_-这些部分就是显示器的显示方法了,可以找相关的资料看看
__u32 pixclock;
__u32 left_margin;
__u32 right_margin;
__u32 upper_margin;
__u32 lower_margin;
__u32 hsync_len;
__u32 vsync_len;
__u32 sync;
__u32 vmode;
__u32 reserved[6];
};
2) fb_fix_screeninfon
这个结构在显卡被设定模式后创建,它描述显示卡的属性,并且系统运行时不能被修改;比如FrameBuffer内存的起始地址。它依赖于被设定的模式,当一个模式被设定后,内存信息由显示卡硬件给出,内存的位置等信息就不可以修改。
struct fb_fix_screeninfo {
char id[16]; ID
unsigned long smem_start;
__u32 smem_len;
__u32 type;
__u32 type_aux; 插入区域?
__u32 visual;
__u16 xpanstep; 没有硬件设备就为零
__u16 ypanstep;
__u16 ywrapstep;
__u32 line_length;
unsigned long mmio_start; 内存映射的I/O起始
__u32 mmio_len; I/O的大小
__u32 accel;
__u16 reserved[3];
};
Mtkfb_device结构定义如下:
struct mtkfb_device {
};
六、
Mt6573_board.c中,board_init函数执行硬件先期初始化工作,它调用mt65xx_disp_init函数(Mt6573_disp_drv.c)。
七、
Cust_leds.c中定义了cust_mt65xx_led类型的数组cust_led_list[],列出了平台的所有led设备,包括不同颜色的led灯,轨迹球、键盘、按键、LCD等的背光灯。不同led设备可以有各自不同的背光控制方式,比如PWM(脉冲宽度调制)方式,GPIO方式,PMIC方式,用户自定义方式等。如下所示:
static struct
};
这个数组通过get_cust_led_list函数被mt65xx_leds_probe调用,传递给mt65xx_leds_driver,并且mt65xx_leds_probe
static struct platform_driver mt65xx_leds_driver = {
};
static struct platform_device mt65xx_leds_device = {
};
以lcd-backlight为例,其控制方式为自定义,背光控制IC为SN3228B,控制函数为Cust_SetBacklight。MT6573的GPIO49作为控制脚,连接到SN3228B的EN/SET脚。该引脚对收到的上升沿脉冲计数(1~14个),调整自己的输出电流,从而控制Leds的亮度。所以Cust_SetBacklight根据要达到的亮度level,在GPIO49上输出对应数量的上升沿脉冲,时间特性需满足SN3228的定义。
如果采用PWM控制方式,则需要使用MT6573的PWMcontroller。函数led_set_pwm实现了用PWM控制led灯的亮、灭、闪烁时对PWMcontroller
mt65xx_led_set_cust根据不同的控制方式,调用相应的配置函数,如下:
MT65XX_LED_MODE_PWM:
MT65XX_LED_MODE_CUST:
MT65XX_LED_MODE_GPIO:
MT65XX_LED_MODE_PMIC:
mt65xx_leds_probe
Uboot阶段,其函数调用及led和backlight控制方式与启动后基本相同。增加了各种充电状态下对红、绿、蓝led的控制。如下是backlight的调用关系:
(mt65xx_leds.c)mt65xx_backlight_on——mt65xx_leds_brightness_set(MT65XX_LED_TYPE_LCD,LED_FULL)——mt65xx_led_set_cust——brightness_set_pwm /Cust_SetBacklight
来自:http://blog.csdn.net/cbk861110/article/details/17438835
1.1怎样新建一个LCD驱动
LCD模组主要包括LCD显示屏和驱动IC。比如LF040DNYB16a模组的驱动IC型号为NT35510。要在MTK6577平台上新建这个lcd的驱动,步骤如下:
A.
\mediatek\custom\common\kernel\lcm\ nt35510
\mediatek\custom\common\lk\lcm\ nt35510//\mediatek\custom\common\uboot\lcm\nt35510
B.修改\mediatek\custom\common\kernel\lcm\ mt65xx_lcm_list.c,在lcm_driver_list [ lcm_count ] 中增加nt35510_lcm_drv。
C.打开mediatek\config\prj\ProjectConfig.mk:
BUILD_LK=yes //BUILD_UBOOT=yes
BOOT_LOGO=wsvganl
CUSTOM_KERNEL_LCM = nt35510
CUSTOM_LK_LCM= nt35510 // CUSTOM_UBOOT_LCM =nt35510
LCM_WIDTH=600
LCM_HEIGHT=1024
驱动文件移植原则:
根据具体平台,填充对应的函数,不能直接复制整个文件,避免不必要编译和接口错误。
1.3 LCD显示旋转(横竖屏旋转,关联到很多界面,需要统一修改)
方式一:横竖屏分辨率修改(还需要修改TP驱动):
LCM_WIDTH=1024
LCM_HEIGHT=600
方式二:lcm显示旋转,只需要修改:(还需要旋转camera驱动)
MTK_LCM_PHYSICAL_ROTATION=90
MTK_TOUCH_PHYSICAL_ROTATION_RELATIVE_TO_LCM=90
camera 旋转
\alps\mediatek\custom\prj\hal\imgsensor\src\cfg_setting_imgsensor.cpp
1.4 lcm参数修改
\mediatek\custom\common\kernel\lcm\rgb_mt8193
staticvoid lcm_get_params(LCM_PARAMS*params){}
lcd rgb频率:
//params->dpi.mipi_pll_clk_ref
params->dpi.mipi_pll_clk_ref=(33.3*(16777216*8*2))/26;
//params->dpi.mipi_pll_clk_ref= 536870912;
colorformat
params->dpi.format
1.5
1.5.1配置修改:
打开mediatek\config\prj\ProjectConfig.mk:
LCM_WIDTH=600
LCM_HEIGHT=1024
Lk_logo= wsvganl
15.2 lcm驱动分辨率修改(注意横竖数值对应)
对应的lcm:\mediatek\custom\common\kernel\lcm\rgb_mt8193
#defineFRAME_WIDTH
#defineFRAME_HEIGHT (600)
15.3 tpsensor driver修改,对应分辨率(sensorfae提供修改方式)。
- LCM分析及移植流程
- MTK平台lcm移植流程
- MTK LCM驱动移植
- MTK LCM驱动移植
- uboot分析及移植
- uboot 分析及移植
- lcm驱动流程
- mtk lcm驱动流程
- MTK lcm 背光流程
- 深圳远峰YFDVK-255-I开发板之bootloader移植及分析--Blob(二)引导流程分析
- uboot源码分析及移植
- UBOOT1.2.0分析及移植
- uboot源代码分析及移植
- uboot源代码分析及移植
- uboot源代码分析及移植
- U-BOOT的启动流程及移植
- U-BOOT的启动流程及移植
- U-BOOT的启动流程及移植
- mapper-reducer word count 实例
- CUDA安装
- Android 4.2原生支持从右到左的文字排列格式
- openwrt使用sdk编译应用程序
- ThreadLoca源码解析
- LCM分析及移植流程
- 使用Stanford CoreNLP工具包处理中文
- java读取文件读取工具类-将文件到byte数组的几种方式
- Java之获取表字段名
- Linux 常用命令
- 使用深度优先搜索对有向无环图进行拓扑排序
- 简单使用gitHub客户端
- 简单的数据发送给其他应用程序
- AFNetworking如何post一个json数据到服务器