реклама на сайте
подробности

 
 
> Проблема с frame buffer. at91rm9220 linux, at91rm9220 linux
jenya_m
сообщение Jun 9 2005, 07:39
Сообщение #1





Группа: Новичок
Сообщений: 2
Регистрация: 9-06-05
Пользователь №: 5 858



Пытаюсь драйверок написать для маленького LCD. (Версия ядра 2.4.27) У экрана нет своей памяти, по этому память приходится выделять программно. Сам драйвер работает. Но юзер приложение никак не может получить доступ к памяти драйвера. Ошибок нет. Просто после перемапливания памяти(буфера), реальной связи не происходит. Как это выглядит: Меняю значение полученого буфер в пользовательском приложении, а в буфере драйвера frame buffera ничего не меняется и наоборот. Может кто подскажет хотябы в какую сторону копать или может у кого есть рабочий вариант подобного драйвера и пример пользовательского приложения к нему. Мой адресс. jenya_mсобакаmalva.ua
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 1)
jenya_m
сообщение Jun 9 2005, 09:36
Сообщение #2





Группа: Новичок
Сообщений: 2
Регистрация: 9-06-05
Пользователь №: 5 858



Забыл добавить исходник


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
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th July 2025 - 01:52
Рейтинг@Mail.ru


Страница сгенерированна за 0.02467 секунд с 7
ELECTRONIX ©2004-2016