本文使用的为sdk6.0 kernel版本为3.2 并未使用dtshtml
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等接口了. ide
次设备号->fb_info[]->fb_info->fb_ops->read/write/ioctl...函数
应用层: read(“/dev/fb0”, …..)spa
-------------------------------------------------------------------------------------------code
驱动层:orm
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而且填充它就能够了.具体流程以下htm
/* 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();
在uboot中设置lcdtypeblog
board-com335x.c的板级初始化入口处调用了lcd初始化函数: com335x_lcdc_init()
该函数主要进行1设置GPIO做为lcd引脚 2设置lcd模块工做时钟 3设置电源管理相关内容 4注册lcd设备 5设置GPU
在com335x_lcdc_init中注册了名为 “da8xx_lcdc”的平台设备, 而且设置了platform_data
com335x_lcd_pdata[] = { … [3] = { .manu_name = "LVDS", .controller_data = &lcd_cfg, .type = "LVDS_1024x768", }, … }
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