Graphics
From Jollen's Wiki
[編輯]
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);


