| ================================ | |
| 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. |