mirror of
https://github.com/Dasharo/linux.git
synced 2026-03-06 15:25:10 -08:00
video: sh7760fb: SH7760/SH7763 LCDC framebuffer driver
Framebuffer driver for the SH7760/SH7763 integrated LCD controller. Signed-off-by: Manuel Lauss <mano@roarinelk.homelinux.net> Signed-off-by: Nobuhiro Iwamatsu <iwamatsu.nobuhiro@renesas.com> Reviewed-by: Paul Mundt <lethal@linux-sh.org> Cc: Krzysztof Helt <krzysztof.h1@poczta.fm> Cc: "Antonino A. Daplas" <adaplas@pol.net> Cc: Siegfried Schaefer <s.schaefer@schaefer-edv.de> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
committed by
Linus Torvalds
parent
c6b044d6ba
commit
4a25e41831
131
Documentation/fb/sh7760fb.txt
Normal file
131
Documentation/fb/sh7760fb.txt
Normal file
@@ -0,0 +1,131 @@
|
||||
SH7760/SH7763 integrated LCDC Framebuffer driver
|
||||
================================================
|
||||
|
||||
0. Overwiew
|
||||
-----------
|
||||
The SH7760/SH7763 have an integrated LCD Display controller (LCDC) which
|
||||
supports (in theory) resolutions ranging from 1x1 to 1024x1024,
|
||||
with color depths ranging from 1 to 16 bits, on STN, DSTN and TFT Panels.
|
||||
|
||||
Caveats:
|
||||
* Framebuffer memory must be a large chunk allocated at the top
|
||||
of Area3 (HW requirement). Because of this requirement you should NOT
|
||||
make the driver a module since at runtime it may become impossible to
|
||||
get a large enough contiguous chunk of memory.
|
||||
|
||||
* The driver does not support changing resolution while loaded
|
||||
(displays aren't hotpluggable anyway)
|
||||
|
||||
* Heavy flickering may be observed
|
||||
a) if you're using 15/16bit color modes at >= 640x480 px resolutions,
|
||||
b) during PCMCIA (or any other slow bus) activity.
|
||||
|
||||
* Rotation works only 90degress clockwise, and only if horizontal
|
||||
resolution is <= 320 pixels.
|
||||
|
||||
files: drivers/video/sh7760fb.c
|
||||
include/asm-sh/sh7760fb.h
|
||||
Documentation/fb/sh7760fb.txt
|
||||
|
||||
1. Platform setup
|
||||
-----------------
|
||||
SH7760:
|
||||
Video data is fetched via the DMABRG DMA engine, so you have to
|
||||
configure the SH DMAC for DMABRG mode (write 0x94808080 to the
|
||||
DMARSRA register somewhere at boot).
|
||||
|
||||
PFC registers PCCR and PCDR must be set to peripheral mode.
|
||||
(write zeros to both).
|
||||
|
||||
The driver does NOT do the above for you since board setup is, well, job
|
||||
of the board setup code.
|
||||
|
||||
2. Panel definitions
|
||||
--------------------
|
||||
The LCDC must explicitly be told about the type of LCD panel
|
||||
attached. Data must be wrapped in a "struct sh7760fb_platdata" and
|
||||
passed to the driver as platform_data.
|
||||
|
||||
Suggest you take a closer look at the SH7760 Manual, Section 30.
|
||||
(http://documentation.renesas.com/eng/products/mpumcu/e602291_sh7760.pdf)
|
||||
|
||||
The following code illustrates what needs to be done to
|
||||
get the framebuffer working on a 640x480 TFT:
|
||||
|
||||
====================== cut here ======================================
|
||||
|
||||
#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),
|
||||
};
|
||||
|
||||
====================== cut here ======================================
|
||||
@@ -1991,6 +1991,19 @@ config FB_COBALT
|
||||
tristate "Cobalt server LCD frame buffer support"
|
||||
depends on FB && MIPS_COBALT
|
||||
|
||||
config FB_SH7760
|
||||
bool "SH7760/SH7763 LCDC support"
|
||||
depends on FB && (CPU_SUBTYPE_SH7760 || CPU_SUBTYPE_SH7763)
|
||||
select FB_CFB_FILLRECT
|
||||
select FB_CFB_COPYAREA
|
||||
select FB_CFB_IMAGEBLIT
|
||||
help
|
||||
Support for the SH7760/SH7763 integrated (D)STN/TFT LCD Controller.
|
||||
Supports display resolutions up to 1024x1024 pixel, grayscale and
|
||||
color operation, with depths ranging from 1 bpp to 8 bpp monochrome
|
||||
and 8, 15 or 16 bpp color; 90 degrees clockwise display rotation for
|
||||
panels <= 320 pixel horizontal resolution.
|
||||
|
||||
config FB_VIRTUAL
|
||||
tristate "Virtual Frame Buffer support (ONLY FOR TESTING!)"
|
||||
depends on FB
|
||||
|
||||
@@ -106,6 +106,7 @@ obj-$(CONFIG_FB_PMAGB_B) += pmagb-b-fb.o
|
||||
obj-$(CONFIG_FB_MAXINE) += maxinefb.o
|
||||
obj-$(CONFIG_FB_METRONOME) += metronomefb.o
|
||||
obj-$(CONFIG_FB_S1D13XXX) += s1d13xxxfb.o
|
||||
obj-$(CONFIG_FB_SH7760) += sh7760fb.o
|
||||
obj-$(CONFIG_FB_IMX) += imxfb.o
|
||||
obj-$(CONFIG_FB_S3C2410) += s3c2410fb.o
|
||||
obj-$(CONFIG_FB_FSL_DIU) += fsl-diu-fb.o
|
||||
|
||||
658
drivers/video/sh7760fb.c
Normal file
658
drivers/video/sh7760fb.c
Normal file
File diff suppressed because it is too large
Load Diff
197
include/asm-sh/sh7760fb.h
Normal file
197
include/asm-sh/sh7760fb.h
Normal file
@@ -0,0 +1,197 @@
|
||||
/*
|
||||
* sh7760fb.h -- platform data for SH7760/SH7763 LCDC framebuffer driver.
|
||||
*
|
||||
* (c) 2006-2008 MSC Vertriebsges.m.b.H.,
|
||||
* Manuel Lauss <mano@roarinelk.homelinux.net>
|
||||
* (c) 2008 Nobuhiro Iwamatsu <iwamatsu.nobuhiro@renesas.com>
|
||||
*/
|
||||
|
||||
#ifndef _ASM_SH_SH7760FB_H
|
||||
#define _ASM_SH_SH7760FB_H
|
||||
|
||||
/*
|
||||
* some bits of the colormap registers should be written as zero.
|
||||
* create a mask for that.
|
||||
*/
|
||||
#define SH7760FB_PALETTE_MASK 0x00f8fcf8
|
||||
|
||||
/* The LCDC dma engine always sets bits 27-26 to 1: this is Area3 */
|
||||
#define SH7760FB_DMA_MASK 0x0C000000
|
||||
|
||||
/* palette */
|
||||
#define LDPR(x) (((x) << 2))
|
||||
|
||||
/* framebuffer registers and bits */
|
||||
#define LDICKR 0x400
|
||||
#define LDMTR 0x402
|
||||
/* see sh7760fb.h for LDMTR bits */
|
||||
#define LDDFR 0x404
|
||||
#define LDDFR_PABD (1 << 8)
|
||||
#define LDDFR_COLOR_MASK 0x7F
|
||||
#define LDSMR 0x406
|
||||
#define LDSMR_ROT (1 << 13)
|
||||
#define LDSARU 0x408
|
||||
#define LDSARL 0x40c
|
||||
#define LDLAOR 0x410
|
||||
#define LDPALCR 0x412
|
||||
#define LDPALCR_PALS (1 << 4)
|
||||
#define LDPALCR_PALEN (1 << 0)
|
||||
#define LDHCNR 0x414
|
||||
#define LDHSYNR 0x416
|
||||
#define LDVDLNR 0x418
|
||||
#define LDVTLNR 0x41a
|
||||
#define LDVSYNR 0x41c
|
||||
#define LDACLNR 0x41e
|
||||
#define LDINTR 0x420
|
||||
#define LDPMMR 0x424
|
||||
#define LDPSPR 0x426
|
||||
#define LDCNTR 0x428
|
||||
#define LDCNTR_DON (1 << 0)
|
||||
#define LDCNTR_DON2 (1 << 4)
|
||||
|
||||
#ifdef CONFIG_CPU_SUBTYPE_SH7763
|
||||
# define LDLIRNR 0x440
|
||||
/* LDINTR bit */
|
||||
# define LDINTR_MINTEN (1 << 15)
|
||||
# define LDINTR_FINTEN (1 << 14)
|
||||
# define LDINTR_VSINTEN (1 << 13)
|
||||
# define LDINTR_VEINTEN (1 << 12)
|
||||
# define LDINTR_MINTS (1 << 11)
|
||||
# define LDINTR_FINTS (1 << 10)
|
||||
# define LDINTR_VSINTS (1 << 9)
|
||||
# define LDINTR_VEINTS (1 << 8)
|
||||
# define VINT_START (LDINTR_VSINTEN)
|
||||
# define VINT_CHECK (LDINTR_VSINTS)
|
||||
#else
|
||||
/* LDINTR bit */
|
||||
# define LDINTR_VINTSEL (1 << 12)
|
||||
# define LDINTR_VINTE (1 << 8)
|
||||
# define LDINTR_VINTS (1 << 0)
|
||||
# define VINT_START (LDINTR_VINTSEL)
|
||||
# define VINT_CHECK (LDINTR_VINTS)
|
||||
#endif
|
||||
|
||||
/* HSYNC polarity inversion */
|
||||
#define LDMTR_FLMPOL (1 << 15)
|
||||
|
||||
/* VSYNC polarity inversion */
|
||||
#define LDMTR_CL1POL (1 << 14)
|
||||
|
||||
/* DISPLAY-ENABLE polarity inversion */
|
||||
#define LDMTR_DISPEN_LOWACT (1 << 13)
|
||||
|
||||
/* DISPLAY DATA BUS polarity inversion */
|
||||
#define LDMTR_DPOL_LOWACT (1 << 12)
|
||||
|
||||
/* AC modulation signal enable */
|
||||
#define LDMTR_MCNT (1 << 10)
|
||||
|
||||
/* Disable output of HSYNC during VSYNC period */
|
||||
#define LDMTR_CL1CNT (1 << 9)
|
||||
|
||||
/* Disable output of VSYNC during VSYNC period */
|
||||
#define LDMTR_CL2CNT (1 << 8)
|
||||
|
||||
/* Display types supported by the LCDC */
|
||||
#define LDMTR_STN_MONO_4 0x00
|
||||
#define LDMTR_STN_MONO_8 0x01
|
||||
#define LDMTR_STN_COLOR_4 0x08
|
||||
#define LDMTR_STN_COLOR_8 0x09
|
||||
#define LDMTR_STN_COLOR_12 0x0A
|
||||
#define LDMTR_STN_COLOR_16 0x0B
|
||||
#define LDMTR_DSTN_MONO_8 0x11
|
||||
#define LDMTR_DSTN_MONO_16 0x13
|
||||
#define LDMTR_DSTN_COLOR_8 0x19
|
||||
#define LDMTR_DSTN_COLOR_12 0x1A
|
||||
#define LDMTR_DSTN_COLOR_16 0x1B
|
||||
#define LDMTR_TFT_COLOR_16 0x2B
|
||||
|
||||
/* framebuffer color layout */
|
||||
#define LDDFR_1BPP_MONO 0x00
|
||||
#define LDDFR_2BPP_MONO 0x01
|
||||
#define LDDFR_4BPP_MONO 0x02
|
||||
#define LDDFR_6BPP_MONO 0x04
|
||||
#define LDDFR_4BPP 0x0A
|
||||
#define LDDFR_8BPP 0x0C
|
||||
#define LDDFR_16BPP_RGB555 0x1D
|
||||
#define LDDFR_16BPP_RGB565 0x2D
|
||||
|
||||
/* LCDC Pixclock sources */
|
||||
#define LCDC_CLKSRC_BUSCLOCK 0
|
||||
#define LCDC_CLKSRC_PERIPHERAL 1
|
||||
#define LCDC_CLKSRC_EXTERNAL 2
|
||||
|
||||
#define LDICKR_CLKSRC(x) \
|
||||
(((x) & 3) << 12)
|
||||
|
||||
/* LCDC pixclock input divider. Set to 1 at a minimum! */
|
||||
#define LDICKR_CLKDIV(x) \
|
||||
((x) & 0x1f)
|
||||
|
||||
struct sh7760fb_platdata {
|
||||
|
||||
/* Set this member to a valid fb_videmode for the display you
|
||||
* wish to use. The following members must be initialized:
|
||||
* xres, yres, hsync_len, vsync_len, sync,
|
||||
* {left,right,upper,lower}_margin.
|
||||
* The driver uses the above members to calculate register values
|
||||
* and memory requirements. Other members are ignored but may
|
||||
* be used by other framebuffer layer components.
|
||||
*/
|
||||
struct fb_videomode *def_mode;
|
||||
|
||||
/* LDMTR includes display type and signal polarity. The
|
||||
* HSYNC/VSYNC polarities are derived from the fb_var_screeninfo
|
||||
* data above; however the polarities of the following signals
|
||||
* must be encoded in the ldmtr member:
|
||||
* Display Enable signal (default high-active) DISPEN_LOWACT
|
||||
* Display Data signals (default high-active) DPOL_LOWACT
|
||||
* AC Modulation signal (default off) MCNT
|
||||
* Hsync-During-Vsync suppression (default off) CL1CNT
|
||||
* Vsync-during-vsync suppression (default off) CL2CNT
|
||||
* NOTE: also set a display type!
|
||||
* (one of LDMTR_{STN,DSTN,TFT}_{MONO,COLOR}_{4,8,12,16})
|
||||
*/
|
||||
u16 ldmtr;
|
||||
|
||||
/* LDDFR controls framebuffer image format (depth, organization)
|
||||
* Use ONE of the LDDFR_?BPP_* macros!
|
||||
*/
|
||||
u16 lddfr;
|
||||
|
||||
/* LDPMMR and LDPSPR control the timing of the power signals
|
||||
* for the display. Please read the SH7760 Hardware Manual,
|
||||
* Chapters 30.3.17, 30.3.18 and 30.4.6!
|
||||
*/
|
||||
u16 ldpmmr;
|
||||
u16 ldpspr;
|
||||
|
||||
/* LDACLNR contains the line numbers after which the AC modulation
|
||||
* signal is to toggle. Set to ZERO for TFTs or displays which
|
||||
* do not need it. (Chapter 30.3.15 in SH7760 Hardware Manual).
|
||||
*/
|
||||
u16 ldaclnr;
|
||||
|
||||
/* LDICKR contains information on pixelclock source and config.
|
||||
* Please use the LDICKR_CLKSRC() and LDICKR_CLKDIV() macros.
|
||||
* minimal value for CLKDIV() must be 1!.
|
||||
*/
|
||||
u16 ldickr;
|
||||
|
||||
/* set this member to 1 if you wish to use the LCDC's hardware
|
||||
* rotation function. This is limited to displays <= 320x200
|
||||
* pixels resolution!
|
||||
*/
|
||||
int rotate; /* set to 1 to rotate 90 CCW */
|
||||
|
||||
/* set this to 1 to suppress vsync irq use. */
|
||||
int novsync;
|
||||
|
||||
/* blanking hook for platform. Set this if your platform can do
|
||||
* more than the LCDC in terms of blanking (e.g. disable clock
|
||||
* generator / backlight power supply / etc.
|
||||
*/
|
||||
void (*blank) (int);
|
||||
};
|
||||
|
||||
#endif /* _ASM_SH_SH7760FB_H */
|
||||
Reference in New Issue
Block a user