Забыл добавить исходник
My source of module static struct fb_ops vfb_ops = { owner: THIS_MODULE, fb_get_fix: vfb_get_fix, fb_get_var: vfb_get_var, fb_set_var: vfb_set_var, fb_get_cmap: vfb_get_cmap, fb_set_cmap: vfb_set_cmap, fb_pan_display: vfb_pan_display, //procrutka displaya fb_ioctl: vfb_ioctl, fb_mmap: fb_mmap12864, }; static int fb_mmap12864(struct fb_info *info, struct file *file, struct vm_area_struct *vma) { unsigned long off, start; unsigned long len; printk(KERN_EMERG "Begin fb_mmap12864(struct fb_info *info, struct file *file, struct vm_area_struct *vma) \n"); off = vma->vm_pgoff << PAGE_SHIFT; /*PAGE_SHIFT = 0xc*/ printk("off = %p\n", (void*)off); printk("vma->vm_pgoff = %p\n", (void*)vma->vm_pgoff); printk("PAGE_SHIFT = %p\n", (void*)PAGE_SHIFT); start = videomemory; printk("start = %p\n", (void*)start); len = PAGE_ALIGN(start & ~PAGE_MASK) + videomemorysize; printk("len = %p\n", (void*)len); printk("PAGE_MASK = %p\n", (void*)PAGE_MASK); /*PAGE_MASK = 0xfffff000*/ start &= PAGE_MASK; printk("start = %p\n", (void*)start); if ((vma->vm_end - vma->vm_start + off) > len) return -EINVAL; off += start; printk("off = %p\n", (void*)off); vma->vm_pgoff = off >> PAGE_SHIFT; printk("vma->vm_pgoff = %p\n", (void*)vma->vm_pgoff); printk("vma->vm_start = %p\n", (void*)vma->vm_start); printk("off = %p\n", (void*)off); printk("vma->vm_end - vma->vm_start = %p\n", (void*)(vma->vm_end - vma->vm_start)); printk("vma->vm_page_prot = %d\n", vma->vm_page_prot); #ifdef CONFIG_CPU_32 pgprot_val(vma->vm_page_prot) &= ~L_PTE_CACHEABLE; //pgprot_val(vma->vm_page_prot) &= ~_CACHE_MASK; #endif /* * Don't alter the page protection flags; we want to keep the area * cached for better performance. Thisdoes mean that we may miss * some updates to the screen occasionally, but process switches * should cause the caches and buffers to be flushed often enough. */ if (io_remap_page_range(vma->vm_start, off, vma->vm_end - vma->vm_start, vma->vm_page_prot)) return -EAGAIN; printk("\n"); printk("vma->vm_start = %p\n", (void*)vma->vm_start); printk("off = %p\n", (void*)off); printk("vma->vm_end - vma->vm_start = %p\n", (void*)(vma->vm_end - vma->vm_start)); printk("vma->vm_page_prot = %d\n", vma->vm_page_prot); *((char*)(vma->vm_start + 0)) = 1; uint8 old = *((char*)(videomemory + 0)); printk("mem[%d]=%d \n", 0, old); // *((char*)(videomemory + 0)) = 1; return 0; } function fb_mmap12864()printed on console The Begin fb_mmap12864(struct fb_info *info, struct file *file, struct vm_area_struct *vma) off = 00000000 vma->vm_pgoff = 00000000 PAGE_SHIFT = 0000000c start = c1070000 len = 00002800 PAGE_MASK = fffff000 start = c1070000 off = c1070000 vma->vm_pgoff = 000c1070 vma->vm_start = 40018000 off = c1070000 vma->vm_end - vma->vm_start = 00002000 vma->vm_page_prot = 63 vma->vm_start = 40018000 off = c1070000 vma->vm_end - vma->vm_start = 00002000 vma->vm_page_prot = 63 mem[0]=0 int __init vfb_init(void) { . . . if (!(videomemory = (u_long)kmalloc(videomemorysize, GFP_KERNEL))) return -ENOMEM; printk("if (!(videomemory adress = %p\n", (void*)videomemory); . . . } function fb_mmap12864()printed on console if (!(videomemory adress = c1070000 my source of test program unsigned int i, j; uint8 old = 0;; cFb::fd = open ("/dev/fb/1", O_RDWR); if(!cFb::fd) { printf("Error: cannot open timer16bit device.\n"); } else { printf("The timer16bit device was opened sucesfully. timerfd = %p\n", (void*)cFb::fd); } cFb::fbp = (char*)mmap(0, 1024*8, PROT_READ|PROT_WRITE, MAP_SHARED, cFb::fd, 0); sleep(1); printf("Map framebuffer1 device to memory. fbp = %p, errno = %s\n", (void*)fbp, strerror(errno)); //sleep(1); // ioctl(cFb::fd, TESTFB, NULL); // sleep(1); printf( "\n"); for (j = 0; j < 10; j++) { for (i = 0; i < 8; i++) { old = cFb::fbp[i + j * 8]; //old = cFb::fbp[0]; printf("me[%d]=%d ", i + j * 8, old); } printf("\n"); } //memset(cFb::fbp, 1, 10); sleep(1); // ioctl(cFb::fd, TESTFB, NULL); } test program printed on console The timer16bit device was opened sucesfully. timerfd = 0x3 Map framebuffer1 device to memory. fbp = 0x40018000, errno = Success me[0]=0 me[1]=0 me[2]=0 me[3]=0 me[4]=0 me[5]=0 me[6]=0 me[7]=0 me[8]=0 me[9]=0 me[10]=0 me[11]=0 me[12]=0 me[13]=0 me[14]=0 me[15]=0 me[16]=0 me[17]=0 me[18]=0 me[19]=0 me[20]=0 me[21]=0 me[22]=0 me[23]=0 me[24]=0 me[25]=0 me[26]=0 me[27]=0 me[28]=0 me[29]=0 me[30]=0 me[31]=0 me[32]=0 me[33]=0 me[34]=0 me[35]=0 me[36]=0 me[37]=0 me[38]=0 me[39]=0 me[40]=0 me[41]=0 me[42]=0 me[43]=0 me[44]=0 me[45]=0 me[46]=0 me[47]=0 me[48]=0 me[49]=0 me[50]=0 me[51]=0 me[52]=0 me[53]=0 me[54]=0 me[55]=0 me[56]=0 me[57]=0 me[58]=0 me[59]=0 me[60]=0 me[61]=0 me[62]=0 me[63]=0 me[64]=0 me[65]=0 me[66]=0 me[67]=0 me[68]=0 me[69]=0 me[70]=0 me[71]=0 me[72]=0 me[73]=0 me[74]=0 me[75]=0 me[76]=0 me[77]=0 me[78]=0 me[79]=0
|