2011-02-03 4 views
2

J'ai une plarform intégrée qui a 2 couches graphiques (/ dev/fb0 et/dev/fb1).LinuxFB + DirectFB en même temps?

Je veux utiliser 2 processus distincts: On utilise directement/dev/fb0 (mode brut, pas de librairies vidéo). L'autre utilisant/dev/fb1 via directfb.

Je peux démarrer le premier et il fonctionne bien (j'utilise la fonction open linux pour ouvrir/dev/fb0 et écrire directement).

Lorsque j'essaie de démarrer le second, il se bloque dans l'initialisation directfb.

Je ne comprends pas pourquoi directFb se verrouille sur/dev/fb0 si j'essaie d'utiliser/dev/fb1.

Comme demandé par @shodanex, voici la sortie de strace pour le second processus:

[pid 1483] open("/etc/directfbrc", O_RDONLY) = 7 
[pid 1483] fstat64(7, {st_mode=S_IFREG|0755, st_size=472, ...}) = 0 
[pid 1483] old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2f375000 
[pid 1483] read(7, "system=fbdev\n#no-vt\n#no-vt-switc"..., 4096) = 472 
[pid 1483] write(2, "(!) DirectFB/Config \'depth\': OK!"..., 39(!) DirectFB/Config 'depth': OK!!!! 32 
) = 39 
[pid 1483] read(7, "", 4096)   = 0 
[pid 1483] close(7)     = 0 
[pid 1483] munmap(0x2f375000, 4096) = 0 
[pid 1483] open("/root/.directfbrc", O_RDONLY) = -1 ENOENT (No such file or directory) 
[pid 1483] write(2, "\n  =======================| "..., 270 
=======================| DirectFB 1.0.1 |======================= 
     (c) 2001-2007 The DirectFB Organization (directfb.org) 
     (c) 2000-2004 Convergence (integrated media) GmbH 
    ------------------------------------------------------------ 

) = 270 
[pid 1483] gettid()     = 1483 
[pid 1483] rt_sigaction(SIGHUP, {0x2a323fc0, [], SA_NOMASK|SA_SIGINFO}, {SIG_DFL}, 8) = 0 
[pid 1483] rt_sigaction(SIGINT, {0x2a323fc0, [], SA_NOMASK|SA_SIGINFO}, {SIG_DFL}, 8) = 0 
[pid 1483] rt_sigaction(SIGTERM, {0x2a323fc0, [], SA_NOMASK|SA_SIGINFO}, {SIG_DFL}, 8) = 0 
[pid 1483] rt_sigaction(SIGABRT, {0x2a323fc0, [], SA_NOMASK|SA_SIGINFO}, {SIG_DFL}, 8) = 0 
[pid 1483] rt_sigaction(SIGFPE, {0x2a323fc0, [], SA_NOMASK|SA_SIGINFO}, {0x29d6f860, [], 0}, 8) = 0 
[pid 1483] rt_sigaction(SIGILL, {0x2a323fc0, [], SA_NOMASK|SA_SIGINFO}, {0x29d6f860, [], 0}, 8) = 0 
[pid 1483] rt_sigaction(SIGQUIT, {0x2a323fc0, [], SA_NOMASK|SA_SIGINFO}, {SIG_DFL}, 8) = 0 
[pid 1483] rt_sigaction(SIGSEGV, {0x2a323fc0, [], SA_SIGINFO}, {0x29d6f860, [], 0}, 8) = 0 
[pid 1483] rt_sigaction(SIGTRAP, {0x2a323fc0, [], SA_NOMASK|SA_SIGINFO}, {SIG_DFL}, 8) = 0 
[pid 1483] rt_sigaction(SIGBUS, {0x2a323fc0, [], SA_NOMASK|SA_SIGINFO}, {0x29d6f860, [], 0}, 8) = 0 
[pid 1483] rt_sigaction(SIGXCPU, {0x2a323fc0, [], SA_NOMASK|SA_SIGINFO}, {SIG_DFL}, 8) = 0 
[pid 1483] rt_sigaction(SIGXFSZ, {0x2a323fc0, [], SA_NOMASK|SA_SIGINFO}, {SIG_DFL}, 8) = 0 
[pid 1483] write(2, "(*) DirectFB/Core: Single Applic"..., 64(*) DirectFB/Core: Single Application Core. (2010-03-25 20:40) 
) = 64 
[pid 1483] open("/usr/lib/libdirectfb-1.0.so.1", O_RDONLY) = -1 ENOENT (No such file or directory) 
[pid 1483] open("/usr/lib/directfb-1.0-0/systems", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY) = 7 
[pid 1483] fstat64(7, {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 
[pid 1483] fcntl64(7, F_SETFD, FD_CLOEXEC) = 0 
[pid 1483] getdents(7, /* 10 entries */, 4096) = 288 
[pid 1483] open("/usr/lib/directfb-1.0-0/systems/libdirectfb_fbdev.so", O_RDONLY) = 8 
[pid 1483] read(8, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0*\0\1\0\0\0\200&\0\0004\0\0\0"..., 512) = 512 
[pid 1483] fstat64(8, {st_mode=S_IFREG|0755, st_size=59543, ...}) = 0 
[pid 1483] old_mmap(NULL, 115640, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 8, 0) = 0x2f378000 
[pid 1483] mprotect(0x2f384000, 65536, PROT_NONE) = 0 
[pid 1483] old_mmap(0x2f394000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 8, 0xc000) = 0x2f394000 
[pid 1483] close(8)     = 0 
[pid 1483] open("/usr/lib/directfb-1.0-0/systems/libdirectfb_x11.so", O_RDONLY) = 8 
[pid 1483] read(8, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0*\0\1\0\0\0\200\35\0\0004\0\0\0"..., 512) = 512 
[pid 1483] fstat64(8, {st_mode=S_IFREG|0755, st_size=25273, ...}) = 0 
[pid 1483] old_mmap(NULL, 83288, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 8, 0) = 0x2f398000 
[pid 1483] mprotect(0x2f39d000, 61440, PROT_NONE) = 0 
[pid 1483] old_mmap(0x2f3ac000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 8, 0x4000) = 0x2f3ac000 
[pid 1483] close(8)     = 0 
[pid 1483] open("/usr/local/lib/mylibs/libX11.so.6", O_RDONLY) = -1 ENOENT (No such file or directory) 
[pid 1483] open("/usr/local/lib/libX11.so.6", O_RDONLY) = -1 ENOENT (No such file or directory) 
[pid 1483] open("/usr/lib/libX11.so.6", O_RDONLY) = 8 
[pid 1483] read(8, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0*\0\1\0\0\0\340\205\1\0004\0\0\0"..., 512) = 512 
[pid 1483] fstat64(8, {st_mode=S_IFREG|0755, st_size=953468, ...}) = 0 
[pid 1483] old_mmap(NULL, 895116, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 8, 0) = 0x2f3b0000 
[pid 1483] mprotect(0x2f477000, 65536, PROT_NONE) = 0 
[pid 1483] old_mmap(0x2f487000, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 8, 0xc7000) = 0x2f487000 
[pid 1483] close(8)     = 0 
[pid 1483] open("/usr/local/lib/mylibs/libXext.so.6", O_RDONLY) = -1 ENOENT (No such file or directory) 
[pid 1483] open("/usr/local/lib/libXext.so.6", O_RDONLY) = -1 ENOENT (No such file or directory) 
[pid 1483] open("/usr/lib/libXext.so.6", O_RDONLY) = 8 
[pid 1483] read(8, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0*\0\1\0\0\0\340)\0\0004\0\0\0"..., 512) = 512 
[pid 1483] fstat64(8, {st_mode=S_IFREG|0755, st_size=61440, ...}) = 0 
[pid 1483] old_mmap(NULL, 114084, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 8, 0) = 0x2f48c000 
[pid 1483] mprotect(0x2f498000, 61440, PROT_NONE) = 0 
[pid 1483] old_mmap(0x2f4a7000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 8, 0xb000) = 0x2f4a7000 
[pid 1483] close(8)     = 0 
[pid 1483] open("/usr/local/lib/mylibs/libxcb-xlib.so.0", O_RDONLY) = -1 ENOENT (No such file or directory) 
[pid 1483] open("/usr/local/lib/libxcb-xlib.so.0", O_RDONLY) = -1 ENOENT (No such file or directory) 
[pid 1483] open("/usr/lib/libxcb-xlib.so.0", O_RDONLY) = 8 
[pid 1483] read(8, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0*\0\1\0\0\0\300\5\0\0004\0\0\0"..., 512) = 512 
[pid 1483] fstat64(8, {st_mode=S_IFREG|0755, st_size=5786, ...}) = 0 
[pid 1483] old_mmap(NULL, 68112, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 8, 0) = 0x2f4a8000 
[pid 1483] mprotect(0x2f4a9000, 61440, PROT_NONE) = 0 
[pid 1483] old_mmap(0x2f4b8000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 8, 0) = 0x2f4b8000 
[pid 1483] close(8)     = 0 
[pid 1483] open("/usr/local/lib/mylibs/libxcb.so.1", O_RDONLY) = -1 ENOENT (No such file or directory) 
[pid 1483] open("/usr/local/lib/libxcb.so.1", O_RDONLY) = -1 ENOENT (No such file or directory) 
[pid 1483] open("/usr/lib/libxcb.so.1", O_RDONLY) = 8 
[pid 1483] read(8, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0*\0\1\0\0\0\300u\0\0004\0\0\0"..., 512) = 512 
[pid 1483] fstat64(8, {st_mode=S_IFREG|0755, st_size=112671, ...}) = 0 
[pid 1483] old_mmap(NULL, 144212, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 8, 0) = 0x2f4bc000 
[pid 1483] mprotect(0x2f4cf000, 65536, PROT_NONE) = 0 
[pid 1483] old_mmap(0x2f4df000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 8, 0x13000) = 0x2f4df000 
[pid 1483] close(8)     = 0 
[pid 1483] open("/usr/lib/libXau.so.6", O_RDONLY) = 8 
[pid 1483] read(8, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0*\0\1\0\0\0\240\n\0\0004\0\0\0"..., 512) = 512 
[pid 1483] fstat64(8, {st_mode=S_IFREG|0755, st_size=10880, ...}) = 0 
[pid 1483] old_mmap(NULL, 71644, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 8, 0) = 0x2f4e0000 
[pid 1483] mprotect(0x2f4e2000, 61440, PROT_NONE) = 0 
[pid 1483] old_mmap(0x2f4f1000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 8, 0x1000) = 0x2f4f1000 
[pid 1483] close(8)     = 0 
[pid 1483] open("/usr/lib/libXdmcp.so.6", O_RDONLY) = 8 
[pid 1483] read(8, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0*\0\1\0\0\0\0\20\0\0004\0\0\0"..., 512) = 512 
[pid 1483] fstat64(8, {st_mode=S_IFREG|0755, st_size=23841, ...}) = 0 
[pid 1483] old_mmap(NULL, 80376, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 8, 0) = 0x2f4f4000 
[pid 1483] mprotect(0x2f4f8000, 61440, PROT_NONE) = 0 
[pid 1483] old_mmap(0x2f507000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 8, 0x3000) = 0x2f507000 
[pid 1483] close(8)     = 0 
[pid 1483] getdents(7, /* 0 entries */, 4096) = 0 
[pid 1483] close(7)     = 0 
[pid 1483] munmap(0x2f398000, 83288) = 0 
[pid 1483] munmap(0x2f48c000, 114084) = 0 
[pid 1483] munmap(0x2f3b0000, 895116) = 0 
[pid 1483] munmap(0x2f4a8000, 68112) = 0 
[pid 1483] munmap(0x2f4bc000, 144212) = 0 
[pid 1483] munmap(0x2f4e0000, 71644) = 0 
[pid 1483] munmap(0x2f4f4000, 80376) = 0 
[pid 1483] open("/dev/fb1", O_RDWR) = 7 
[pid 1483] fcntl64(7, F_SETFD, FD_CLOEXEC) = 0 
[pid 1483] setsid()     = 1483 
[pid 1483] open("/dev/tty0", O_RDONLY|O_NOCTTY) = 8 
[pid 1483] ioctl(8, 0x5603, 0x7bbc1d2a) = 0 
[pid 1483] ioctl(8, 0x5600, 0x497658) = 0 
[pid 1483] ioctl(7, 0x460f, 0x7bbc1d18) = 0 
[pid 1483] fstat64(7, {st_mode=S_IFCHR|0600, st_rdev=makedev(29, 1), ...}) = 0 
[pid 1483] ioctl(7, 0x4610, 0x7bbc1c28) = 0 
[pid 1483] ioctl(8, 0x5606, 0x2)  = 0 

Notez que le directfb lit le fichier/etc/directfbrc (vérifier son contenu avant). Rien ne sera imprimé après cela.

system=fbdev 
fbdev=/dev/fb1 
primary-layer=1 
no-cursor 
bg-color=00000000 
disable-module=lirc 
disable-module=keyboard 
disable-module=ps2mouse 
mode=1280x720-60 
pixelformat=ARGB 
depth=32 
hardware 
desktop-buffer-mode=backvideo 

Vous avez des idées? Thaks beaucoup encore.

Répondre

1

Pouvez-vous fournir plus d'informations:

  • ne fonctionne directement FB lorsque le premier processus ne se lance pas?
  • Comment savez-vous que directfb se verrouille sur/dev/fb0?

Linux FB est un pilote du noyau, vous pouvez utiliser un programme de l'espace utilisateur que vous souhaitez utiliser /dev/fb<x> tels que directfb

DirectFB est une bibliothèque de l'espace utilisateur, il fonctionne avec le cadre Linux tampon.

Donc la réponse est définitivement oui, vous pouvez utiliser votre propre programme sur /dev/fb0, et un programme DirectFB sur /dev/fb1. Peut-être que vous devriez strace votre programme directfb pour comprendre pourquoi il est bloqué.

+0

Oui, le deuxième processus fonctionne parfaitement lorsque le premier ne fonctionne pas. J'utilisais directFB pour les deux processus. J'essaie de me débarrasser de dfb dans le premier parce que le second peut tomber en panne (c'est un interpréteur de script) et quand cela arrive, le directfb plante aussi le premier. Je ne suis pas sûr que directfb se verrouille sur/dev/fb0, cependant, la seule chose que fait le premier processus est d'ouvrir/dev/fb0 et d'écrire dessus ...qu'il fait une pause, gardant le descripteur/dev/fb0 encore ouvert. Vérifiez la sortie strace pour le second dans la réponse suivante. Merci beaucoup. – Marcus

0

J'ai découvert qu'il est nécessaire de demander à l'application de ne pas changer de mode graphique. J'ai réussi à faire fonctionner les deux applications en même temps. Aucune situation de verrouillage plus.

Maintenant j'essaye d'exécuter mon programme actuel, mais QT me tue parce qu'il ignore l'argument de nographicsmodeswitch. Je travaille là-dessus et je suis sûr que ça marchera tôt ou tard.

Si quelqu'un ici est un expert en QT, j'apprécierais toute aide.

Merci shodanex, vos conseils de strace étaient très utiles.