Ник:
Пароль:

Контакты

E-mail: info@starterkit.ru
тел.: +7 922 680-21-73
тел.: +7 922 680-21-74
Телеграм: t.me/starterkit_ru

Способы оплаты

User Info


Добро пожаловать,
Guest

Регистрация или входРегистрация или вход
Потеряли пароль?Потеряли пароль?

Ник:
Пароль:

ПользователейПользователей:0
Поисковых ботовПоисковых ботов:3
ГостейГостей:1

ОбновитьПодробнееВсегоВсего:4
Форум » starterkit.ru » Embedded Linux
mmap framebuffer
sekil
Добавлено 04.12.2012 22:29 Редактировалось 04.12.2012 22:30
0
Сообщение: 1
sekil
0

Пункты: 2027
Регистрация: 30.08.2012
Не понимаю почему так -
Вот исходник -
Код
fbp = (char *)mmap(0, screensize, PROT_READ | PROT_WRITE, MAP_PRIVATE, fbfd, 0);
if ((int)fbp == -1) {
perror("Error: failed to map framebuffer device to memory");
exit(4);
}


После записи в указатель fbp - на экране ничего не меняется.
Хотя mmap нормально срабатывает и выдает адрес памяти. И даже если сделать echo tt > /dev/fb0 и после этого считать данные с указателя fbp - получу теже tt.
После долгих ковыряний добился результата только после того как объявил указатель на явный адрес framebuffer - smem_start.
Код
char* fbsm = (char *)finfo.smem_start;

И вот этим циклом все работает -

Код
while (1)
{
for (i=0;i<screensize;i++)
{
*((unsigned short int*)(fbp + i)) = t;
}
memcpy(fbsm,fbp,screensize);
}


Самое, что интересное - адрес переменной fbsm не равен адресу smem_start, хотя был явно указан при объявлении.

А вот если объявить указатель через #define , то адрес его будет таким же как и в smem_start и вывод на дисплей тоже работает.

Мож кто в курсе в чем может быть проблема?
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 04.12.2012 22:53 Сообщение: 2
sasamy
4.71

Пункты: 83560
Регистрация: 14.08.2009
Цитата

fbp = (char *)mmap(0, screensize, PROT_READ | PROT_WRITE, MAP_PRIVATE, fbfd, 0);


Посмотрите man 2 mmap и попробуйте MAP_SHARED
Спуститься к концу Подняться к началу
Персональная информация
sekil
Добавлено 04.12.2012 23:24 Сообщение: 3
sekil
0

Пункты: 2027
Регистрация: 30.08.2012
uclinux без MMU не умеет MAP_SHARED на драйверах - возвращает -ENODEV
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 04.12.2012 23:34 Редактировалось 04.12.2012 23:39 Сообщение: 4
sasamy
4.71

Пункты: 83560
Регистрация: 14.08.2009
Цитата

uclinux


Надо было с этого начинать :) там свои особенности - лучше в гугле смотреть. Вот например
http://docs.blackfin.uclinux.org/doku.php?id=mmap

там надо в ядре mmap в драйвере специфичный реализовать, впрочем он еще проще чем с MMU
Спуститься к концу Подняться к началу
Персональная информация
sekil
Добавлено 04.12.2012 23:40 Редактировалось 04.12.2012 23:55 Сообщение: 5
sekil
0

Пункты: 2027
Регистрация: 30.08.2012
Я видел по этой ссылке..
Только не понял что надо реализовывать. Мне показалось, что там рассказывают, что в каждом драйвере (в том же Framebuffer для моего проца) нужно реализовывать свой mmap.... И приводят пример драйвера и работы с ним через mmap...
Спуститься к концу Подняться к началу
Персональная информация
sekil
Добавлено 05.12.2012 18:56 Сообщение: 6
sekil
0

Пункты: 2027
Регистрация: 30.08.2012
а как мне в мой драйвер FB сделать свой mmap? Я думаю сделать
чтоб mmap возвращал просто адрес FB - smem_start.
Спуститься к концу Подняться к началу
Персональная информация
Форум » starterkit.ru » Embedded Linux