




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、基于MTK65xx平台lcm和背光驱动的编写一、 与LCD驱动相关的主要文件路径mediatekplatformmt6573ubootmt6573_disp_drv.cmediatekplatformmt6573ubootmt6573_disp_drv_dpi.cmediatekplatformmt6573uboot mt6573_disp_drv_dbi.cmediatekplatformmt6573uboot mt6573_dpi_drv.cmediatekplatformmt6573uboot mt6573_dsi_drv.cmediatekplatformmt6573uboot mt6
2、573_lcd_drv.cmediateksourcekerneldriversvideomtkfb.cmediateksourcekerneldriversvideodisp_drv.cmediateksourcekerneldriversvideodisp_drv_dpi.cmediateksourcekerneldriversvideodisp_drv_dbi.cmediatekplatformmt6573kerneldriversvideolcd_drv.cmediatekplatformmt6573kerneldriversvideodpi_drv.cmediatekplatform
3、mt6573kerneldriversvideodsi_drv.cmediatekcustomcommonkernellcmLCM_NAMELCM_NAME.cmediatekplatformmt6573uboot mt6573_pwm.cmediatekplatformmt6573uboot mt65xx_leds.cmediateksourcekerneldriversledsleds.cmediatekcustomginwave73_gbkernelledsmt65xxcust_leds.c二、 怎样新建一个LCD驱动LCD模组主要包括LCD显示屏和驱动IC。比如LF040DNYB16a
4、模组的驱动IC型号为NT35510。要在MTK6573平台上新建这个lcd的驱动,步骤如下:1、 在mediatekcustomcommonkernellcm目录下新建文件夹nt35510,在此文件夹中新建nt35510.c。这就是LCM硬件层驱动文件。2、 修改mediatekcustomcommonkernellcm mt65xx_lcm_list.c, 在 lcm_driver_list lcm_count 中增加nt35510_lcm_drv。3、 打开mediatekconfigginwave73_gbProjectConfig.mk,修改CUSTOM_UBOOT_LCM = nt3
5、5510, CUSTOM_KERNEL_LCM = nt35510;修改LCM_WIDTH、LCM_HEIGHT、BOOT_LOGO为正确的值。三、 驱动文件(nt35510.c) 主要任务是实现LCM_DRIVER nt35510_lcm_drv = .name = "nt35510",.set_util_funcs = lcm_set_util_funcs,.get_params = lcm_get_params,.init
6、160; = lcm_init,.suspend = lcm_suspend,.resume = lcm_resume,.compare_id = lcm_compare_id, (1)lcm_get_params主要是设置LCM相关的参数,数据结构如下:typedef str
7、uct LCM_TYPE type;LCM_CTRL ctrl; /! how to control LCM registers unsigned int width; unsigned int height;unsigned int io_select_mode;
8、; /DBI or DPI should select IO mode according to chip spec /* particular parameters */ LCM_DBI_PARAMS dbi; LCM_DPI_PARAMS dpi; LCM_DSI_PARAMS dsi; LCM_PARAMS;LCM_TYPE 定义LCM与HOST间的接口,主要分为3种,DBI, DPI, DSI。其中DBI又分为
9、parallel DBI 和serial DBI。parallel DBI(B型DBI)的命令和数据都在数据总线D17:0上传输。CSX为低时数据有效。WRX线控制D17:0为写时序,RDX控制D17:0为读时序。D/CX指示D17:0上传输的是命令还是数据。注:MT6573使用LPA0线作为D/CX线,LPCE线作为CSX线,LWRB线作为WRX线,LRDB线作为RDX线。serial DBI(C型DBI)的命令和数据都在SPI接口上传输。CSX为低时SDA有效。SCL提供时钟,DIN输入,DOUT输出。当SDA_EN=1时,DIN线成为双向的SDA线,即可输入又可输出,DOUT线不用。C型
10、DBI分为3线(没有D/CX线)和4线(有D/CX线)两种。3线的使用一个D/CX bit来区分命令/数据,4线的使用D/CX线来区分命令/数据。注:MT6573使用LSA0线作为D/CX线,LSCE线作为CSX线。LSCK线作为SCL线,LSDA线作为SDA线。DPI的命令在SPI上传输,Pixel data(RGB data)在D17:0上传输。其命令传输方式与serial DBI相同。对于Pixel data(RGB data),需要自己的4条控制线:DPICK_PIN(RGB时钟) 、DPIDE_PIN(RGB数据有效)、 DPIVSYNC(场同步)、 DPIHSYNC(行同步) 。t
11、ypedef enum LCM_CTRL_NONE = 0, LCM_CTRL_SERIAL_DBI, LCM_CTRL_PARALLEL_DBI, LCM_CTRL_GPIO LCM_CTRL定义LCM与HOST之间传递command的方式,有SERIAL_DBI、PARALLEL_DBI、GPIO几种控制方式。如果是DPI接口,其LCM_CTRL可以选择SERIAL_DBI或者GPIO。Width和height定义LCM的宽度和高度。io
12、_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)。根据driver IC 的定义填写。LCM_×××_PARAMS根据不同的LCM_TYPE取值,这是针对DBI/DPI/DSI接口类型的详细参数定义。比如LCM_DPI_PARAMS定义如下:typedef struct unsigned int mipi_pll_clk_ref;
13、 / 0.1 unsigned int mipi_pll_clk_div1; / 0.63 unsigned int mipi_pll_clk_div2; / 0.15 unsigned int dpi_clk_div; / 2.32 unsigned int dpi_clk_duty;
14、 / (dpi_clk_div - 1) . 31 /* polarity parameters */ LCM_POLARITY clk_pol; LCM_POLARITY de_pol; LCM_POLARITY vsync_pol; LCM_POLARITY hsync_pol; /* timing parameters */
15、160; unsigned int hsync_pulse_width; unsigned int hsync_back_porch; unsigned int hsync_front_porch; unsigned int vsync_pulse_width; unsigned int vsync_back_porch; unsigned int vsync_front_porch;
16、0; /* output format parameters */ LCM_DPI_FORMAT format; LCM_COLOR_ORDER rgb_order; unsigned int is_serial_output; /* intermediate buffers parameters */ unsigned int intermediat_bu
17、ffer_num; / 2.3 /* iopad parameters */ LCM_DRIVING_CURRENT io_driving_current; 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个参数设
18、置DPICK_PIN(RGB时钟) 、DPIDE_PIN(RGB数据有效)、 DPIVSYNC(场同步)、 DPIHSYNC(行同步)线是上升沿还是下降沿有效。行同步脉冲开始前和开始后的几个时钟周期,是行信号消隐期;场同步开始前和开始后的几个行周期,是场信号消隐期。消隐期不传递图像信号。消隐期特性由第三段六个参数定义:hsync_pulse_width; hsync_back_porch; hsync_front_porch; vsync_pulse_width; vsync_back_porch; vsync_front
19、_porch;LCM_DPI_FORMAT指定每个像素中RGB各占几个bit.LCM_COLOR_ORDER指定RGB的顺序。上述参数的值,均依照LCM spec及驱动IC datasheet中的定义。这里要说说一个特别之处。NT35510使用DPI接口,SERIAL_DBI ctrl 方式时,没有D/CX线,datasheet上定义的传输方式是9 bits,即在数据byte前加个D/CX bit。但使用了NT35510的LCMLF040DNYB16a,其spec中却另外定义了其串口使用16 bits 模式传输。Byte1 是标志byte, 前3位分别为 R/W bit, D/CX bit,
20、High/Low bit;Byte2 则是命令或数据。NT35510的每个command长度为2byte,还可能带有若干bytes的参数,比如命令F001,参数AA,应该这样传输:0x20 0xF0 0x00 0x01 0x40 0xAA。(2)lcm_init主要实现LCM的初始化,包括如下步骤:config_gpio配置GPIO。发送reset信号。RESET pin low和RESET pin high需要持续的时间一般为若干ms, 以datasheet 为准。init_lcm_registers初始化LCM的寄存器。具体可以厂家提供的初始代码为参考。一般在此函数末尾,都会使用唤醒命令组
21、(见后文),使LCM进入工作状态。(3)lcm_suspend 使LCM休眠,使用特定的命令,并遵守datasheet定义的时间特性。常用命令组如下:0X2800 (or 0X28) set display off 0X1000 (or 0X10) enter sleep mode对nt35510而言,还有一种更深睡眠的状态deep standby mode,使用如下命令进入:0X4F00 0X01(4)lcm_resume使LCM苏醒,使用特定的命令,并遵守datasheet定义的时间特性。唤醒命令组:0X1100 (or 0X11) exit
22、sleep mode0X2900 (or 0X29) set display on对nt35510而言,如果在lcm_suspend中使LCM enter deep standby mode,则不能使用唤醒命令组,需要使用reset信号并要重新init_lcm_registers。四、 驱动 nt35510_lcm_drv怎样被上层使用Mtkfb.c中实现了LCM的platform driver:static struct platform_driver mtkfb_driver = .driver =
23、60; .name = “mtk-fb”, .bus = &platform_bus_type, .probe = mtkfb_probe, .remove =
24、 mtkfb_remove, .suspend = mtkfb_suspend, .resume = mtkfb_resume, , mtkfb_probe会调用函数mtkfb_find_lcm_driver来发现LCM的硬件层驱动。mtkfb_find_lcm_driverDISP_Se
25、lectDevicedisp_drv_get_lcm_driver,检查lcm_driver_list, 得到当前使用的LCM及其驱动名称。Mt6573_devs.c中,定义了framebuffer型的platform device,这个设备在mt6573_board_init()调用时被注册。它所对应的驱动就是上文提到的mtkfb_driverstatic struct platform_device mt6573_device_fb = .name = "mtkfb", .
26、id = 0, .num_resources = ARRAY_SIZE(resource_fb), .resource = resource_fb, .dev = .dma_mask = &mtkfb_dmamask, .cohe
27、rent_dma_mask = 0xffffffff, ,;在linux 内核中lcd 设备驱动所使用的是framebuffer设备类型,framebuffer设备驱动程序的核心数据结构是fb_ops;用户空间就是通过此结构体,调用其中的函数来对LCD实现控制。Mtkfb.c中定义并实现了fb_ops类型的mtkfb_ops。一个使用mtkfb_ops的例子见mediateksourcekerneldriversgpupvrservices43rdpartymtklfb mtklfb_displayclass.c。static struct fb
28、_ops mtkfb_ops = .owner = THIS_MODULE, .fb_open = mtkfb_open, .fb_release = mtkfb_release, .fb_setcol
29、reg = mtkfb_setcolreg, /批量配置颜色参数 .fb_pan_display = mtkfb_pan_display_proxy, /虚拟屏幕内容显示 .fb_fillrect = cfb_fillrect, /填充区域显示 .fb_copyarea = cfb_copyarea, /复制区域显示 .fb_imageblit &
30、#160; = cfb_imageblit, /显示图象 .fb_cursor = mtkfb_soft_cursor, /光标显示 .fb_check_var = mtkfb_check_var, /检查并配置fb_var_screeninfo参数 .fb_set_par = mtkfb_set_par, /change display mode and
31、set parameter .fb_ioctl = mtkfb_ioctl, /特定ioctl配置LCD屏幕特性;五、 Frame Buffer 设备驱动mtkfb_driver中的各个函数会调用到DISP_xxx函数(DISP_drv.c),而DISP_xxx会调用到LCD_xxx函数(lcd_drv.c)以及LCM硬件层驱动。mtkfb_probe的主要工作如下:* find lcm driver* Register interrupt handler (call back func
32、tion), Init screen update wait queue, create screen update kThread* Allocate and initialize frame buffer device (fb_info , mtkfb_device), select panel type according to machine type* Initialize Display Driver PDD Layer (DISP_init)* Initialize fb_info struct (mtkfb_fbinfo_init)* Reg
33、ister mtkfb_device fs to system (mtkfb_register_sysfs)* Register fb_info to system (register_framebuffer)fb_info结构定义如下:struct fb_info int node;int flags;struct mutex lock; /* Lock for open/release/ioctl funcs */struct mutex mm_lock; /* Lock for fb_mmap and smem_* fields */struct fb
34、_var_screeninfo var; /* Current var */struct fb_fix_screeninfo fix; /* Current fix */struct fb_monspecs monspecs; /* Current Monitor specs */struct work_struct queue; /* Framebuffer event queue */struct fb_pixmap pixmap; /* Image hardware mapper */struct fb_pixmap sprite; /* Cursor
35、 hardware mapper */struct fb_cmap cmap; /* Current cmap */struct list_head modelist; /* mode list */struct fb_videomode *mode; /* current mode */#ifdef CONFIG_FB_BACKLIGHT struct backlight_device *bl_dev;struct mutex bl_curve_mutex; u8 bl_curveFB_BACKLIGHT_LEV
36、ELS;#endif#ifdef CONFIG_FB_DEFERRED_IOstruct delayed_work deferred_work;struct fb_deferred_io *fbdefio;#endifstruct fb_ops *fbops;struct device *device; /* This is the parent */struct device *dev; /* This is this fb device */int class_flag;
37、 /* private sysfs flags */#ifdef CONFIG_FB_TILEBLITTINGstruct fb_tile_ops *tileops; /* Tile Blitting */#endifchar _iomem *screen_base; /* Virtual address */unsigned long screen_size; /* Amount of ioremapped VRAM or 0 */ voi
38、d *pseudo_palette; /* Fake palette of 16 colors */ #define FBINFO_STATE_RUNNING 0#define FBINFO_STATE_SUSPENDED 1u32 state; /* Hardware state i.e suspend */void *fbcon_par; /* fbcon use-only private
39、area */* From here on everything is device dependent */void *par; struct apertures_struct unsigned int count;struct aperture resource_size_t base;resource_size_t size; ranges0; *apertures;1)fb_var_screeninfo 这个结构描述了显示卡的特性: NOTE: _u32 是表示 unsigned 不带符号的 32 bits 的数据类型,其余类推。这是 Linu
40、x 内核中所用到的数据类型,如果是开发用户空间(user-space)的程序,可以根据具体计算机平台的情况,用 unsigned long 等等来代替 struct fb_var_screeninfo _u32 xres; /* visible resolution */ /可视区域 _u32 yres; _u32 xres_virtual; /* virtual resolution */ /可视区域 _u32 yres_virtual; _u32 xoffset; /* offset from virtual to v
41、isible resolution */ /可视区域的偏移 _u32 yoffset; _u32 bits_per_pixel; /* guess what */ /每一象素的bit数 _u32 grayscale; /* != 0 Gray levels instead of colors */等于零就成黑白 struct fb_bitfield red; /* bitfield in fb mem if true color, */真彩的bit机构 struct fb_bitfield green; /* else only length
42、is significant */ struct fb_bitfield blue; struct fb_bitfield transp; /* transparency */ 透明 _u32 nonstd; /* != 0 Non standard pixel format */ 不是标准格式 _u32 activate; /* see FB_ACTIVATE_* */ _u32 height; /* height of picture in mm */ 内存中的图像高度 _u32 width; /* width of pictur
43、e in mm */ 内存中的图像宽度 _u32 accel_flags; /* acceleration flags (hints) */ 加速标志 /* Timing: All values in pixclocks, except pixclock (of course) */ 时序-_-这些部分就是显示器的显示方法了,可以找相关的资料看看 _u32 pixclock; /* pixel clock in ps (pico seconds) */ _u32 left_margin; /* time from sync to picture
44、 */ _u32 right_margin; /* time from picture to sync */ _u32 upper_margin; /* time from sync to picture */ _u32 lower_margin; _u32 hsync_len; /* length of horizontal sync */ 水平可视区域 _u32 vsync_len; /* length of vertical sync */ 垂直可视区域 _u32 sync; /* see FB_SYNC_* */ _
45、u32 vmode; /* see FB_VMODE_* */ _u32 reserved6; /* Reserved for future compatibility */ 备用以后开发 2) fb_fix_screeninfon 这个结构在显卡被设定模式后创建,它描述显示卡的属性,并且系统运行时不能被修改;比如FrameBuffer内存的起始地址。它依赖于被设定的模式,当一个模式被设定后,内存信息由显示卡硬件给出,内存的位置等信息就不可以修改。 struct fb_fix_screeninfo char id16; /* id
46、entification string eg "TT Builtin" */ID unsigned long smem_start; /* Start of frame buffer mem */ 内存起始 /* (physical address) */ 物理地址 _u32 smem_len; /* Length of frame buffer mem */ 内存大小 _u32 type; /* see FB_TYPE_* */ _u32 type_aux; /* Interleave for interleaved Pl
47、anes */插入区域? _u32 visual; /* see FB_VISUAL_* */ _u16 xpanstep; /* zero if no hardware panning */没有硬件设备就为零 _u16 ypanstep; /* zero if no hardware panning */ _u16 ywrapstep; /* zero if no hardware ywrap */ _u32 line_length; /* length of a line in bytes */ 一行的字节表示 unsigned
48、long mmio_start; /* Start of Memory Mapped I/O */内存映射的I/O起始 /* (physical address) */ _u32 mmio_len; /* Length of Memory Mapped I/O */ I/O的大小 _u32 accel; /* Type of acceleration available */ 可用的加速类型 _u16 reserved3; /* Reserved for future compatibility */ Mtkfb_device结构定
49、义如下:struct mtkfb_device int state; void *fb_va_base; /* MPU
50、 virtual address */ dma_addr_t fb_pa_base; /* Bus physical address */ unsigned long fb_size_in_byte; unsigned long layer
51、_enable; MTK_FB_FORMAT layer_formatHW_OVERLAY_COUNT; unsigned int layer_config_dirty; int xscale, yscale, mirror; /* transform
52、ations. rotate is stored in fb_info->var */ u32 pseudo_palette17; struct fb_info *fb_info; /*
53、 Linux fbdev framework data */ struct device *dev;六、 uBoot阶段Mt6573_board.c中,board_init函数执行硬件先期初始化工作,它调用mt65xx_disp_init函数(Mt6573_disp_drv.c)。board_initmt65xx_disp_initDISP_Initdisp_drv_init_contextDISP_DetectDevicedisp_drv_get_lcm_driverlcm_driver_list disp_drv_init_con
54、textDISP_GetDriverDPI / DISP_GetDriverDBI / DISP_GetDriverDSIDISP_GetDriverDPI (mt6573_disp_drv_dpi.c)DPI_DISP_DRV. dpi_initinit_dpiDPI_Init (Mt6573_dpi_drv.c)DISP_GetDriverDBI (mt6573_disp_drv_dbi.c)DBI_DISP_DRV. dbi_initinit_lcdLCD_xxx(Mt6573_lcd_drv.c)DISP_GetDriverDSI (mt6573_disp_dr
55、v_dsi.c)DSI_DISP_DRV. dsi_initinit_lcd,init_dsiDSI_Init(Mt6573_dsi_drv.c)DISP_InitLCD_Init (Mt6573_lcd_drv.c) DISP_UpdateScreenLCD_StartTransfer (Mt6573_lcd_drv.c)七、 背光控制Cust_leds.c中定义了cust_mt65xx_led类型的数组cust_led_list,列出了平台的所有led设备,包括不同颜色的led灯,轨迹球、键盘、按键、LCD等的背光灯。不同led设备可以有各自不同的背光控制
56、方式,比如PWM(脉冲宽度调制)方式,GPIO方式,PMIC方式,用户自定义方式等。如下所示:static struct cust_mt65xx_led cust_led_listMT65XX_LED_TYPE_TOTAL = "red", MT65XX_LED_MODE_PWM, PWM3,"green", MT65XX_LED_MODE_PWM, PWM2,"blue", MT65XX_LED_MODE_PWM, PWM1,"jogball-backlight&
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 关于扶持政策的潜在风险研究试题及答案
- 商务信息传播的英语试题及答案
- 器乐乐理考试考点试题及答案
- 家具设计中的装置艺术与商业价值研究试题及答案
- 团队协作面试题及答案
- 广州高一试题及答案
- 创业扶持政策的历史发展与未来展望试题及答案
- 智能驾驶的技术实现路径考核试题及答案
- 新能源汽车产品生命周期管理试题及答案
- 如何利用新媒体提高农产品市场渗透率试题及答案
- 新版院感培训课件
- 2024-2025学年上海市浦东新区初三一模语文试卷(含答案)
- 企业创新韧性的驱动路径研究
- 2025年江苏泰州市第四人民医院招聘高层次人才15人历年高频重点提升(共500题)附带答案详解
- 二零二五年度跨境电商合伙人合作协议书3篇
- 知宪明法与宪同行课件-高一上学期宪法宣传周主题班会
- 《高速公路电动汽车清障救援作业规范》
- UL489标准中文版-2019断路器UL标准中文版
- 【MOOC】建筑结构概论-河南理工大学 中国大学慕课MOOC答案
- DB21-T 1642-2024 镁质耐火原料及制品单位产品能源消耗限额
- 维修电工二实操评分表讲解
评论
0/150
提交评论