15. How do I convert XFree86 mode-lines into framebuffer device timings?

15. How do I convert XFree86 mode-lines into framebuffer device timings?

If you have XFree86 (X11) installed on your machine, and you can use it successfully, it is a simple matter to convert the mode-lines in your XF86Config file to the required timings needed by the framebuffer devices.

The framebuffer device requires the following fields:

  • pixclock - pixel clock in pico seconds

  • left_margin - time between sync to display

  • right_margin - time between display to sync

  • upper_margin - time between sync to display

  • lower_margin - time between display to sync

  • hsync_len - horizontal sync length

  • vsync_len - vertical sync length

An XFree86 mode line has the following fields:

  • Modeline "1280x1024" DCF HR SH1 SH2 HFL VR SV1 SV2 VFL

It is necessary to do some simple calculations to translate the XF86 mode-lines into a set of framebuffer device timings. As an example, we shall examine how to convert a mode-line taken from my XF86Config file:

  • Modeline "1280x1024" 110.0 1280 1328 1512 1712 1024 1025 1028 1054

First, calculate the required pixclock rate. XFree86 uses megahertz whilst framebuffer devices uses picoseconds (Why, I don't know). Divide one million by DCF. For example: 1,000,000 / 110.0 = 9090.9091

Now we need to calculate the horizontal timings:

  • left_margin = HFL - SH2

  • right_margin = SH1 - HR

  • hsync_len = SH2 - SH1

In our example, this would be:

  • left_margin = 1712 - 1512 = 200

  • right_margin = 1328 - 1280 = 48

  • hsync_len = 1512 - 1328 = 184

And now we need to calculate the vertical timings.

  • upper_margin = VFL - SV2

  • lower_margin = SV1 - VR

  • vsync_len = SV2 - SV1

For our example, this would be:

  • upper_margin = 1054 - 1028 = 26

  • lower_margin = 1025 - 1024 = 1

  • vsync_len = 1028 - 1025 = 3

Now we can use this information to set up the framebuffer for the desired mode. For example, for the matroxfb framebuffer driver, it requires the following:

  • video=matrox:xres:<>,yres:<>,depth:<>,left:<>,right:<>,hslen:<>,upper:<>,lower:<>,vslen:<>

I put into my /etc/lilo.conf the following line:

  • append = "video=matroxfb:xres:1280,yres:1024,depth:32,left:200,right:48,hslen:184,upper:26,lower:0,vslen:3"

Note that in this case the pixel clock isn't used. It's only necessary if you don't like the default pixel clock rates. You can supply this as a parameter as well. Setting the pixclock is documented in other parts of this HOWTO.