SH7760/SH7763 集成 LCDC 帧缓冲驱动程序¶
0. 概述¶
SH7760/SH7763 具有集成的 LCD 显示控制器 (LCDC),它(理论上)支持从 1x1 到 1024x1024 的分辨率,以及从 1 到 16 位的颜色深度,适用于 STN、DSTN 和 TFT 面板。
注意事项
帧缓冲内存必须是在 Area3 顶部分配的大块内存(硬件要求)。由于此要求,您不应将驱动程序设为模块,因为在运行时可能无法获得足够大的连续内存块。
驱动程序不支持在加载时更改分辨率(无论如何,显示器不是热插拔的)
如果 a) 您在 >= 640x480 像素分辨率下使用 15/16 位颜色模式,b) 在 PCMCIA(或任何其他慢速总线)活动期间,可能会观察到严重的闪烁。
旋转仅按顺时针 90 度工作,并且仅当水平分辨率 <= 320 像素时才工作。
- 文件
drivers/video/sh7760fb.c
include/asm-sh/sh7760fb.h
1. 平台设置¶
- SH7760
视频数据通过 DMABRG DMA 引擎获取,因此您必须将 SH DMAC 配置为 DMABRG 模式(在启动时将 0x94808080 写入 DMARSRA 寄存器)。
PFC 寄存器 PCCR 和 PCDR 必须设置为外围模式。(将零写入两者)。
驱动程序不会为您执行上述操作,因为板设置是板设置代码的工作。
2. 面板定义¶
必须显式告知 LCDC 所连接的 LCD 面板类型。数据必须包装在 “struct sh7760fb_platdata” 中,并作为 platform_data 传递给驱动程序。
建议您仔细查看 SH7760 手册第 30 节。(http://documentation.renesas.com/eng/products/mpumcu/e602291_sh7760.pdf)
以下代码说明了如何使帧缓冲在 640x480 TFT 上工作
#include <linux/fb.h>
#include <asm/sh7760fb.h>
/*
* NEC NL6440bc26-01 640x480 TFT
* dotclock 25175 kHz
* Xres 640 Yres 480
* Htotal 800 Vtotal 525
* HsynStart 656 VsynStart 490
* HsynLenn 30 VsynLenn 2
*
* The linux framebuffer layer does not use the syncstart/synclen
* values but right/left/upper/lower margin values. The comments
* for the x_margin explain how to calculate those from given
* panel sync timings.
*/
static struct fb_videomode nl6448bc26 = {
.name = "NL6448BC26",
.refresh = 60,
.xres = 640,
.yres = 480,
.pixclock = 39683, /* in picoseconds! */
.hsync_len = 30,
.vsync_len = 2,
.left_margin = 114, /* HTOT - (HSYNSLEN + HSYNSTART) */
.right_margin = 16, /* HSYNSTART - XRES */
.upper_margin = 33, /* VTOT - (VSYNLEN + VSYNSTART) */
.lower_margin = 10, /* VSYNSTART - YRES */
.sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
.vmode = FB_VMODE_NONINTERLACED,
.flag = 0,
};
static struct sh7760fb_platdata sh7760fb_nl6448 = {
.def_mode = &nl6448bc26,
.ldmtr = LDMTR_TFT_COLOR_16, /* 16bit TFT panel */
.lddfr = LDDFR_8BPP, /* we want 8bit output */
.ldpmmr = 0x0070,
.ldpspr = 0x0500,
.ldaclnr = 0,
.ldickr = LDICKR_CLKSRC(LCDC_CLKSRC_EXTERNAL) |
LDICKR_CLKDIV(1),
.rotate = 0,
.novsync = 1,
.blank = NULL,
};
/* SH7760:
* 0xFE300800: 256 * 4byte xRGB palette ram
* 0xFE300C00: 42 bytes ctrl registers
*/
static struct resource sh7760_lcdc_res[] = {
[0] = {
.start = 0xFE300800,
.end = 0xFE300CFF,
.flags = IORESOURCE_MEM,
},
[1] = {
.start = 65,
.end = 65,
.flags = IORESOURCE_IRQ,
},
};
static struct platform_device sh7760_lcdc_dev = {
.dev = {
.platform_data = &sh7760fb_nl6448,
},
.name = "sh7760-lcdc",
.id = -1,
.resource = sh7760_lcdc_res,
.num_resources = ARRAY_SIZE(sh7760_lcdc_res),
};