136 lines
4.2 KiB
Plaintext
136 lines
4.2 KiB
Plaintext
|
================================
|
||
|
Driver for EP93xx LCD controller
|
||
|
================================
|
||
|
|
||
|
The EP93xx LCD controller can drive both standard desktop monitors and
|
||
|
embedded LCD displays. If you have a standard desktop monitor then you
|
||
|
can use the standard Linux video mode database. In your board file:
|
||
|
|
||
|
static struct ep93xxfb_mach_info some_board_fb_info = {
|
||
|
.num_modes = EP93XXFB_USE_MODEDB,
|
||
|
.bpp = 16,
|
||
|
};
|
||
|
|
||
|
If you have an embedded LCD display then you need to define a video
|
||
|
mode for it as follows:
|
||
|
|
||
|
static struct fb_videomode some_board_video_modes[] = {
|
||
|
{
|
||
|
.name = "some_lcd_name",
|
||
|
/* Pixel clock, porches, etc */
|
||
|
},
|
||
|
};
|
||
|
|
||
|
Note that the pixel clock value is in pico-seconds. You can use the
|
||
|
KHZ2PICOS macro to convert the pixel clock value. Most other values
|
||
|
are in pixel clocks. See Documentation/fb/framebuffer.txt for further
|
||
|
details.
|
||
|
|
||
|
The ep93xxfb_mach_info structure for your board should look like the
|
||
|
following:
|
||
|
|
||
|
static struct ep93xxfb_mach_info some_board_fb_info = {
|
||
|
.num_modes = ARRAY_SIZE(some_board_video_modes),
|
||
|
.modes = some_board_video_modes,
|
||
|
.default_mode = &some_board_video_modes[0],
|
||
|
.bpp = 16,
|
||
|
};
|
||
|
|
||
|
The framebuffer device can be registered by adding the following to
|
||
|
your board initialisation function:
|
||
|
|
||
|
ep93xx_register_fb(&some_board_fb_info);
|
||
|
|
||
|
=====================
|
||
|
Video Attribute Flags
|
||
|
=====================
|
||
|
|
||
|
The ep93xxfb_mach_info structure has a flags field which can be used
|
||
|
to configure the controller. The video attributes flags are fully
|
||
|
documented in section 7 of the EP93xx users' guide. The following
|
||
|
flags are available:
|
||
|
|
||
|
EP93XXFB_PCLK_FALLING Clock data on the falling edge of the
|
||
|
pixel clock. The default is to clock
|
||
|
data on the rising edge.
|
||
|
|
||
|
EP93XXFB_SYNC_BLANK_HIGH Blank signal is active high. By
|
||
|
default the blank signal is active low.
|
||
|
|
||
|
EP93XXFB_SYNC_HORIZ_HIGH Horizontal sync is active high. By
|
||
|
default the horizontal sync is active low.
|
||
|
|
||
|
EP93XXFB_SYNC_VERT_HIGH Vertical sync is active high. By
|
||
|
default the vertical sync is active high.
|
||
|
|
||
|
The physical address of the framebuffer can be controlled using the
|
||
|
following flags:
|
||
|
|
||
|
EP93XXFB_USE_SDCSN0 Use SDCSn[0] for the framebuffer. This
|
||
|
is the default setting.
|
||
|
|
||
|
EP93XXFB_USE_SDCSN1 Use SDCSn[1] for the framebuffer.
|
||
|
|
||
|
EP93XXFB_USE_SDCSN2 Use SDCSn[2] for the framebuffer.
|
||
|
|
||
|
EP93XXFB_USE_SDCSN3 Use SDCSn[3] for the framebuffer.
|
||
|
|
||
|
==================
|
||
|
Platform callbacks
|
||
|
==================
|
||
|
|
||
|
The EP93xx framebuffer driver supports three optional platform
|
||
|
callbacks: setup, teardown and blank. The setup and teardown functions
|
||
|
are called when the framebuffer driver is installed and removed
|
||
|
respectively. The blank function is called whenever the display is
|
||
|
blanked or unblanked.
|
||
|
|
||
|
The setup and teardown devices pass the platform_device structure as
|
||
|
an argument. The fb_info and ep93xxfb_mach_info structures can be
|
||
|
obtained as follows:
|
||
|
|
||
|
static int some_board_fb_setup(struct platform_device *pdev)
|
||
|
{
|
||
|
struct ep93xxfb_mach_info *mach_info = pdev->dev.platform_data;
|
||
|
struct fb_info *fb_info = platform_get_drvdata(pdev);
|
||
|
|
||
|
/* Board specific framebuffer setup */
|
||
|
}
|
||
|
|
||
|
======================
|
||
|
Setting the video mode
|
||
|
======================
|
||
|
|
||
|
The video mode is set using the following syntax:
|
||
|
|
||
|
video=XRESxYRES[-BPP][@REFRESH]
|
||
|
|
||
|
If the EP93xx video driver is built-in then the video mode is set on
|
||
|
the Linux kernel command line, for example:
|
||
|
|
||
|
video=ep93xx-fb:800x600-16@60
|
||
|
|
||
|
If the EP93xx video driver is built as a module then the video mode is
|
||
|
set when the module is installed:
|
||
|
|
||
|
modprobe ep93xx-fb video=320x240
|
||
|
|
||
|
==============
|
||
|
Screenpage bug
|
||
|
==============
|
||
|
|
||
|
At least on the EP9315 there is a silicon bug which causes bit 27 of
|
||
|
the VIDSCRNPAGE (framebuffer physical offset) to be tied low. There is
|
||
|
an unofficial errata for this bug at:
|
||
|
http://marc.info/?l=linux-arm-kernel&m=110061245502000&w=2
|
||
|
|
||
|
By default the EP93xx framebuffer driver checks if the allocated physical
|
||
|
address has bit 27 set. If it does, then the memory is freed and an
|
||
|
error is returned. The check can be disabled by adding the following
|
||
|
option when loading the driver:
|
||
|
|
||
|
ep93xx-fb.check_screenpage_bug=0
|
||
|
|
||
|
In some cases it may be possible to reconfigure your SDRAM layout to
|
||
|
avoid this bug. See section 13 of the EP93xx users' guide for details.
|