全志T7 Display驱动简介
可先阅读《Sunxi_display2模块使用文档.pdf》、《图形开发用户指南.pdf》DE:Display EngineWrite-Back:capture data between display engine and TCON for Miracast application.下图参考《Allwinner_DE2.0_Spec_V1.0.pdf》:在全志linux代码drivers\vid
可先阅读《Sunxi_display2模块使用文档.pdf》、《图形开发用户指南.pdf》
DE:Display Engine
Write-Back:capture data between display engine and TCON for Miracast application.
下图参考《Allwinner_DE2.0_Spec_V1.0.pdf》:
在全志linux代码drivers\video\sunxi目录下有disp和disp2,在A20、A33、A80采用的是disp的框架,而2013年后A83T、V5、T7采用DISP2的框架,即DE2.0版本。
概述
配置信息:
这样就配置了CONFIG_DISP2_SUNXI=y
全志平台显示驱动架构如下:
注:可参考《全志平台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中配置的:
驱动和设备匹配后,将执行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);与渲染器相关
(7)start_process();实则调用start_work()函数
}
对于系统移植来说,关注的是LCD时序的配置,所以重点分析lcd_init():
sunxi_disp_get_source_ops()函数为g_lcd_drv.src_ops设置一些函数指针,如下图。其中有关于背光使能控制和LCD PWM相关的函数,我们留意一下,后面分析背光调节时来看看这些函数。
lcd_set_panel_funs()函数:
其中panel_array[]的内容:
这是系统预先添加的屏及它的初始化相关代码,在sys_config.fex中,我们选择了一个屏(可以把其他没有用到的屏的代码裁剪了):
屏名字叫“default_lcd”,对应Default_panel.c:
但是这里并没有配置和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:
更多推荐
所有评论(0)