Frame buffer / mmap() weirdness
Geert Uytterhoeven
geert at linux-m68k.org
Wed Dec 1 08:19:11 EST 1999
On Tue, 30 Nov 1999, Stephen Edie wrote:
> I have been noticing some strange behavior while working with Linux frame
> buffer devices on PPC. Perhaps I am just doing something stupid. I open
> the frame buffer using:
>
> fbdev_handle = open("/dev/fb0", O_RDWR);
>
> I can draw to the frame buffer using:
>
> lseek(fbdev_handle, 0, SEEK_SET);
> write(fbdev_handle, pixmap, size);
>
> This part works fine. What causes problems is attempting to memory map
> the frame buffer using:
>
> address = mmap(0, screen.height * screen.stride * screen.bpp / 8,
> PROT_READ | PROT_WRITE, MAP_SHARED, fbdev_handle, 0);
>
> When doing this, address[0] points outside of the video memory and
> strangely enough, address[512] points to the first pixel in memory! So if
> I do the following, everything works as expected:
>
> address = (char *)(mmap(0, screen.height * screen.stride * screen.bpp / 8
> + 512, PROT_READ | PROT_WRITE, MAP_SHARED,
> fbdev_handle, 0)) + 512;
>
> I don't think this is right! Is this a kernel bug in the frame buffer
> driver code? (This is being tested using OFFB by the way) Is there
> something weird going on here with page alignment or something?
Perhaps the frame buffer memory is not aligned on a page boundary? What does
`fbset --info' say about the address?
If it's not aligned to a page boundary, the application has to mmap()
(address & 0xfffff000) and add (address & 0x00000fff) to the start address of
the returned region. Make sure to increase the size you pass to mmap(), so the
whole frame buffer memory is covered and size is a multiple of the page size.
Gr{oetje,eeting}s,
--
Geert Uytterhoeven -- Linux/{m68k~Amiga,PPC~CHRP} -- geert at linux-m68k.org
In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds
** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/
More information about the Linuxppc-dev
mailing list