Am335x lcd驱动分析

一 文件列表

本文使用的为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_read
    struct 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值