2019独角兽企业重金招聘Python工程师标准>>>

一 文件列表

本文使用的为sdk6.0 kernel版本为3.2 并未使用dts

am335x的lcd驱动相关文件有:

(kernel)/drivers/video/da8xx-fb.c
(kernel)/drivers/video/fbmem.c
(kernel)/arch/arm/mach-davinci/devices-da8xx.c
(kernel)/arch/arm/mach-omap2/board-com335x.c(我的板子是这个板级初始化文件,其他的可能是board-am335xevm.c等)

二 代码流程分析

我们写代码之前一般都要先看下这个模块基本的流程是怎么样的, 熟悉流程之后基本就知道如何写驱动了.

fbmem.c是LCD驱动的核心层, 他向上层提供了open/read/write/ioctl等接口, 并通过fb_info数组连接到下层. fb_info[]数组保存的是通过register_freambuffer注册到系统的fb_info结构体,数组的下标是设备的次设备号. fb_info结构体有个成员为fb_ops, 它就类似于file_operations的作用一样. 如此以来,就可以通过设备的次设备号找到fb_ops进而操作他的fb_read/fb_write等接口了.

次设备号->fb_info[]->fb_info->fb_ops->read/write/ioctl...

应用层: read(“/dev/fb0”, …..)

-------------------------------------------------------------------------------------------

驱动层:

fb_readstruct fb_info *info = file_fb_info(file);//fb_info[次设备号]info->fbops->fb_read(info, buf, count, ppos);//调用fb_info->fops->fb_read

由以上可知, 核心层已经为我们做好了上层的代码,我们只需要实现注册fb_info并且填充它就可以了.具体流程如下

       /* 1. 分配一个fb_info */framebuffer_alloc();/* 2. 设置 *//* 2.1 设置固定的参数     *//* 2.2 设置可变的参数     *//* 2.3 设置操作函数       *//* 2.4 其他的设置         *//* 3. 硬件相关的操作           *//* 3.1 配置GPIO用于LCD     *//* 3.2 根据LCD手册设置LCD控制器, 比如VCLK的频率等 *//* 3.3 分配显存(framebuffer), 并把地址告诉LCD控制器 *//* 4. 注册 */register_framebuffer();

2.1 设置lcd类型

在uboot中设置lcdtype

2.2 初始化am335x的lcd模块硬件

board-com335x.c的板级初始化入口处调用了lcd初始化函数: com335x_lcdc_init()

该函数主要进行1设置GPIO作为lcd引脚 2设置lcd模块工作时钟 3设置电源管理相关内容 4注册lcd设备 5设置GPU

2.2 注册platform_device(board-com335x.c)

在com335x_lcdc_init中注册了名为 “da8xx_lcdc”的平台设备, 并且设置了platform_data

com335x_lcd_pdata[] = {
…[3] = {.manu_name = "LVDS",.controller_data = &lcd_cfg,.type = "LVDS_1024x768",},
…
}

2.3 注册platform_driver(da8xx-fb.c)

Da8xx-fb.c的probe中platform_get_resource是不是获得的device-da8xx.c中的platform_device中的数据?

不是 kernel中的mem resource start为 0x 4830E000而 device-da8xx.c中为0x01e13000

另外device-da8xx.c中全部都是da8xx开头的设备, 这些设备全都是am335x的么?

反正lcd这个不是

1.     申请fb_info
2.     设置fb_info
3.     注册register_framebuffer

总结:两个数据结构共同决定LCD控制寄存器的配置参数:

static struct lcd_ctrl_config lcd_cfg = {&disp_panel,.ac_bias        = 255,.ac_bias_intrpt        = 0,.dma_burst_sz        = 16,.bpp            = 32,.fdd            = 0x80,.tft_alt_mode        = 0,.stn_565_mode        = 0,.mono_8bit_mode        = 0,.invert_line_clock    = 1,.invert_frm_clock    = 1,.sync_edge        = 0,.sync_ctrl        = 1,.raster_order        = 0,
};static struct da8xx_panel known_lcd_panels[] = {[2] = {.name = "TFC_S9700RTWV35TR_01B",.width = 800,.height = 480,.hfp = 39,.hbp = 39,.hsw = 47,.vfp = 13,.vbp = 29,.vsw = 2,.pxl_clk = 30000000,.invert_pxl_clk = 0,},
}

尚未搞明白的问题, 在fb_probe中的platform_resource是从何而来?

参考: http://blog.sina.com.cn/s/blog_944790400101kz8f.html

转载于:https://my.oschina.net/cxh1024/blog/633802

Am335x lcd驱动分析相关推荐

  1. LCD驱动分析(一)

    LCD驱动分析 转载自http://blog.chinaunix.net/uid-26021340-id-3011787.html S3C2440上LCD驱动 (FrameBuffer)实例开发讲解 ...

  2. 《Linux驱动:s3c2440 lcd 驱动分析》

    文章目录 一,前言 二,LCD原理和硬件分析 2.1 LCD原理解析 2.2 硬件电路 2.2.1 LCD背光电路 2.2.2 LCD屏 2.2.3 S3c2440主控 三,LCD应用平台总线-设备- ...

  3. AM335x LCD驱动解析

    文章目录 1. LCD背景 2. LCD驱动 2.1 Device 2.2 Driver 2.2.1 fbmem_init() 2.2.2 register_framebuffer() 2.2.3 / ...

  4. 高通 android平台LCD驱动分析

    目前手机芯片厂家提供的源码里包含整个LCD驱动框架,一般厂家会定义一个xxx_fb.c的源文件,注册一个平台设备和平台驱动,在驱动的probe函数中来调用register_framebuffer(), ...

  5. LCD驱动分析【转】

    转自:http://blog.csdn.net/hanmengaidudu/article/details/21559153 1.S3C2440上LCD驱动 (FrameBuffer)实例开发讲解 其 ...

  6. lcd驱动分析(读书笔记)

    1.S3C2440上LCD驱动 (FrameBuffer)实例开发讲解 其中的代码也可直接参考:drivers/video/s3c2410fb.c 以下为转载文章,文章原地址:http://blog. ...

  7. android 副屏驱动_高通 android平台LCD驱动分析

    目前手机芯片厂家提供的源码里包含整个LCD驱动框架,一般厂家会定义一个xxx_fb.c的源文件,注册一个平台设备和平台驱动,在驱动的probe函数中来调用register_framebuffer(), ...

  8. 高通平台LCD驱动分析

    目前手机芯片厂家提供的源码里包含整个LCD驱动框架,一般厂家会定义一个xxx_fb.c的源文件,注册一个平台设备和平台驱动,在驱动的probe函数中来调用register_framebuffer(), ...

  9. Linux-2.6.38的LCD驱动分析(二)

    二.s3cfb_probe函数分析 2.1 驱动的入口点     摆在面前的第一个问题相信应该是,这个函数是从那里开始运行的.这里就应该从long long ago 开始了,打开linux-2.6.3 ...

最新文章

  1. mysql 学习基础知识汇总
  2. 重磅!OpenMMLab 更新啦!分类/检测/分割/3D等项目全面升级
  3. 我是如何使用python控制迅雷自动下载电影的?
  4. EL之AdaBoost:集成学习之AdaBoost算法的简介、应用、经典案例之详细攻略
  5. 数据结构 【实验7 二叉树基本操作】
  6. [转] 标准化和归一化
  7. 文末有彩蛋 | 第四周课程回顾与总结
  8. html5中3个盒子怎样设置,Web前端开发任务驱动式教程(HTML5+CSS3+JavaScript)任务10 盒子模型及应用.pptx...
  9. delphi idtcpclient 发送十六进制00_25656红单足球预测 中超 20:00 山东鲁能泰山 VS 大连人...
  10. oracle exists替换,oracle 优化or 替换为in、exists、union all的几种写法,测试没有问题!...
  11. kvaser怎么用?Kvaser 汽车CAN通讯协议总线分析仪新手入门常见问题解决方案教程
  12. Wox主题样式基础的自定义
  13. 发票信息批量提取到 excel 软件 2.3
  14. Redis数据库相关指令
  15. 【微软资源站】MSDN
  16. java遍历树(深度遍历和广度遍历)
  17. 开发人员必知的5个CI/CD工具
  18. Android——教你10分钟手敲 Butter Knife(小刀注解)
  19. hypermesh matlab,HyperMesh 到 flac3d 的 MATLAB 程序
  20. 数组模拟实现队列(Java语言描述)

热门文章

  1. 安装centos7后不能联网
  2. Lync和Exchange 2013集成PART4:配置统一存档
  3. 你能否列出与 Elasticsearch 有关的主要可用字段数据类型?
  4. ElasticSearch 介绍及使用方法
  5. 深入理解 nvidia-docker 2.0
  6. 360互联网技术训练营第七期 - “遇见”PIKA
  7. arduino使用oled代码_如何做一个Arduino无线气象站
  8. VUE2.0的浏览器兼容情况汇总
  9. 实战系列-Java中线程安全集合类(二)
  10. 【Mybatis框架】输入映射-pojo包装类型