全志T7 Display驱动简介

可先阅读《Sunxi_display2模块使用文档.pdf》、《图形开发用户指南.pdf》
全志T7 Display驱动简介_第1张图片
DE:Display Engine
Write-Back:capture data between display engine and TCON for Miracast application.
下图参考《Allwinner_DE2.0_Spec_V1.0.pdf》:
全志T7 Display驱动简介_第2张图片
在全志linux代码drivers\video\sunxi目录下有disp和disp2,在A20、A33、A80采用的是disp的框架,而2013年后A83T、V5、T7采用DISP2的框架,即DE2.0版本。

概述

配置信息:
全志T7 Display驱动简介_第3张图片
这样就配置了CONFIG_DISP2_SUNXI=y

全志平台显示驱动架构如下:
全志T7 Display驱动简介_第4张图片
注:可参考《全志平台LCD调试说明文档V1.0_图文_百度文库》
即有两个驱动,一个Framebuffer,另一个是Display,在代码t7linux-auto\linux-3.10\drivers\video\sunxi\disp2\disp中。这里主要分析Display驱动。

源码结构介绍

video:.
│fbmem.c framebuffer core
├─sunxi
│ ├─disp2/ disp2的目录
│ │ ├─disp
│ │ │ ├─dev_disp.c display driver层
│ │ │ ├─dev_fb.c framebuffer driver层
│ │ │ ├─disp_sys_intf.c
│ │ │ ├─dev_disp_debugfs.c
│ │ │ ├─dev_composer.c
│ │ │ ├─dev_composer2.c
│ │ │ ├─de bsp层
│ │ │ │ ├─disp_manager.c Manager抽象层
│ │ │ │ ├─disp_edp.c edp显示设备驱动
│ │ │ │ ├─disp_hdmi.c hdmi显示设备驱动
│ │ │ │ ├─disp_lcd.c lcd显示设备驱动
│ │ │ │ ├─disp_tv.c tv显示设备驱动
│ │ │ │ ├─disp_vga.c vga显示设备驱动
│ │ │ │ ├─disp_capture.c Capture驱动
│ │ │ │ ├─disp_enhance.c enhance驱动
│ │ │ │ ├─disp_smart_backlight.c smbl背光驱动
│ │ │ │ ├─disp_features.c lowlevel层的de_feat.c的封装
│ │ │ │ ├─disp_device.c
│ │ │ │ ├─disp_display.c
│ │ │ │ ├─disp_eink_manager.c
│ │ │ │ ├─disp_format_convert.c
│ │ │ │ ├─disp_private.c
│ │ │ │ ├─disp_vdevice.c
│ │ │ │ ├─eink_buffer_manager.c
│ │ │ │ ├─eink_pipeline_manager.c
│ │ │ │ ├─lowlevel_v2x lowlevel层
│ │ │ │ │ ├─delcd.c dertmx.c
│ │ │ │ │ ├─de_feat.c de_feat.h DE模块的特性(或配置信息)
│ │ │ │ ├─disp_sys_int. OSAL层,与操作系统相关层
│ │ │ ├─lcd/ lcd driver
│ │ │ │ ├─lcd_source.c 与display驱动的接口
│ │ │ │ ├─default_panel.c 平台已经支持的屏驱动

Display驱动分析

驱动的入口文件是dev_disp.c,入口函数disp_module_init():

static int __init disp_module_init(void)
{
	int ret = 0, err;

	alloc_chrdev_region(&devid, 0, 1, "disp");//动态分配设备编号
	my_cdev = cdev_alloc();//分配字符设备
	cdev_init(my_cdev, &disp_fops);//字符设备的初始化
	my_cdev->owner = THIS_MODULE;
	err = cdev_add(my_cdev, devid, 1);

	disp_class = class_create(THIS_MODULE, "disp");//将在sys目录下创建disp目录
	display_dev = device_create(disp_class, NULL, devid, NULL, "disp");

		ret = platform_driver_register(&disp_driver);//注册Display驱动

	dispdbg_init();//创建一些用于调试的目录文件

	return ret;
}

上面最主要的是注册Display驱动。与驱动对应的Device是在DST中配置的:
全志T7 Display驱动简介_第5张图片
驱动和设备匹配后,将执行probe函数——disp_probe(),该函数主要完成以下:

  • 从DST中获取LCD、DSI、中断等相关的信息
  • 调用disp_init()进一步初始化Display设备
  • 电源管理相关的代码

最主要的是disp_init():

static s32 disp_init(struct platform_device *pdev)
{1)初始化多个工作队列
	(2)解析"sunxi-disp"的DST信息
	(3)调用bsp_disp_init(para);平台上Display相关的初始化。
	(4)调用lcd_init();LCD屏时序相关的初始化
	(5)调用fb_init(pdev);初始化Framebuffer
	(6)调用composer_init(&g_disp_drv);与渲染器相关
	(7start_process();实则调用start_work()函数
}

对于系统移植来说,关注的是LCD时序的配置,所以重点分析lcd_init():
全志T7 Display驱动简介_第6张图片
sunxi_disp_get_source_ops()函数为g_lcd_drv.src_ops设置一些函数指针,如下图。其中有关于背光使能控制和LCD PWM相关的函数,我们留意一下,后面分析背光调节时来看看这些函数。
全志T7 Display驱动简介_第7张图片
lcd_set_panel_funs()函数:
全志T7 Display驱动简介_第8张图片
其中panel_array[]的内容:
全志T7 Display驱动简介_第9张图片
这是系统预先添加的屏及它的初始化相关代码,在sys_config.fex中,我们选择了一个屏(可以把其他没有用到的屏的代码裁剪了):
全志T7 Display驱动简介_第10张图片
屏名字叫“default_lcd”,对应Default_panel.c:
全志T7 Display驱动简介_第11张图片
但是这里并没有配置和LCD时序相关的代码,sys_config.fex中关于“default_lcd”这个屏的时序是有配置的,那在哪里被使用了呢?在lcd_parse_panel_para()获取这里的时序参数:

bsp_disp_init(para)
-->disp_init_lcd()
	-->lcd->init() //即disp_lcd_init()
		-->lcd_parse_panel_para() //获得LCD时序

背光也是在bsp_disp_init()配置的

sys_config.fex关于LCD的配置

配置18-bits RGB接口输出
硬件电路使用18跟数据线+DE+HSYNC+VSYNC,供21根引脚,背光PWM使用PWM0:
全志T7 Display驱动简介_第12张图片
全志T7 Display驱动简介_第13张图片
全志T7 Display驱动简介_第14张图片
全志T7 Display驱动简介_第15张图片
全志T7 Display驱动简介_第16张图片

你可能感兴趣的:(全志T7,linux)