Graphics

From Jollen's Wiki

Jump to: navigation, search

Direct framebuffer: kernel-space 基本觀念

static int do_lcd_mmap(struct jk2410_lcd_data *cdata, char *adr, unsigned long size)
{
        unsigned long start = (unsigned long)adr;
        unsigned long page, pos;

        pos = (unsigned long)cdata->lcd_mem;
        page = 0x33f00000;
        while (size > 0) {
                //page = virt_to_phys(pos);
                printk(KERN_ALERT "Mapping %08X to %08X, rest size = %d(KB).\n",
                                start, page, size/1024);
                if (remap_page_range(start, page, PAGE_SIZE, PAGE_SHARED))
                        return -EINVAL;
                start += PAGE_SIZE;
                pos += PAGE_SIZE;
                page += PAGE_SIZE;
                size -= PAGE_SIZE;
        }
        return 0;
}

int jk2410_lcd_mmap(struct file *filp, struct vm_area_struct *vma)
{
        struct jk2410_lcd_data *cdata = (struct jk2410_lcd_data *)filp->private_data;
        char *vm_start;
        unsigned long vm_size;

        /* mapping user-space address space */
        vm_start = vma->vm_start;
        vm_size = vma->vm_end - vma->vm_start;

        do_lcd_mmap(cdata, vm_start, vm_size);
}

mmap: user-space memory mapping

使用 mmap() system call

mmap(0, 240*320*4, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); // <sys/mman.h>

程式片斷:

unsigned char *map;
int fd; 

fd = open ("/dev/fb/0", O_RDWR);
map = (unsigned char *)mmap(0, 240*320*4, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
close (fd);
Views
個人工具
導航
工具