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