2011-01-18 21 views
9

पर लिखने के लिए मैं एक आईएच कोर का उपयोग कर रहा हूं जिसमें अंतर्निहित ग्राफिक्स त्वरक जीएमए-एचडी एक आरएचईएल 6.0 ओएस पर चल रहा है। मुझे ग्राफिक्स ड्राइवर की ग्राफिक्स त्वरण क्षमताओं का परीक्षण करने की आवश्यकता है (जो मुझे पता चला कि मेरे पीसी में i915 था)। मैंने फ्रेमबफर को लिखने के लिए निम्न कोड (जिसे मैंने कुछ संशोधनों के साथ इंटरनेट से प्राप्त किया) का उपयोग किया था।फ्रेम बफर

#include <unistd.h> 
#include <stdio.h> 
#include <fcntl.h> 
#include <linux/fb.h> 
#include <sys/mman.h> 

int main() 
{ 
     int fbfd = 0; 
     struct fb_var_screeninfo vinfo; 
     struct fb_fix_screeninfo finfo; 
     long int screensize = 0; 
     char *fbp = 0; 
     int x = 0, y = 0; 
     long int location = 0; 
     int count ; 

     /* Open the file for reading and writing */ 
     fbfd = open("/dev/fb0", O_RDWR); 
     if (!fbfd) { 
       printf("Error: cannot open framebuffer device.\n"); 
       exit(1); 
     } 
     printf("The framebuffer device was opened successfully.\n"); 
    /* Get fixed screen information */ 
     if (ioctl(fbfd, FBIOGET_FSCREENINFO, &finfo)) { 
       printf("Error reading fixed information.\n"); 
       exit(2); 
     } 

     /* Get variable screen information */ 
     if (ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo)) { 
       printf("Error reading variable information.\n"); 
       exit(3); 
     } 

     /* Figure out the size of the screen in bytes */ 
     screensize = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel/8; 
     printf("\nScreen size is %d",screensize); 
     printf("\nVinfo.bpp = %d",vinfo.bits_per_pixel); 

     /* Map the device to memory */ 
     fbp = (char *)mmap(0, screensize, PROT_READ | PROT_WRITE, MAP_SHARED,fbfd, 0); 
     if ((int)fbp == -1) { 
       printf("Error: failed to map framebuffer device to memory.\n"); 
       exit(4); 
     } 
     printf("The framebuffer device was mapped to memory successfully.\n"); 


     x = 100; y = 100; /* Where we are going to put the pixel */ 

     /* Figure out where in memory to put the pixel */ 
     location = (x+vinfo.xoffset) * (vinfo.bits_per_pixel/8) + (y+vinfo.yoffset) * finfo.line_length; 
     for(count = 1 ;count < 100 ;count++) 
     { 
       *(fbp + location) = 255; /* Some blue */ 
       *(fbp + location + count) = 0; /* A little green */ 
       *(fbp + location + count + 1) = 0; /* A lot of red */ 
       *(fbp + location + count + 2) = 0; /* No transparency */ 
     } 
     munmap(fbp, screensize); 
     close(fbfd); 
     return 0; 
} 

उपरोक्त कोड में कोई परिवर्तन नहीं प्रदर्शन लेकिन 'बिल्ली/dev/fb0' पर पाया गया था चलाने के बाद कुछ डेटा से पता चला है। कोई बता सकता है कि स्क्रीन पर कुछ भी क्यों नहीं देखा गया था? ,

नीरज N.T

+0

क्या आप बार बार स्क्रीन फ्लैश देखते थे? (अंधेरे में गोली मारो) – drahnr

+0

मैं जंगली अनुमान लगाऊंगा और कहूंगा कि आपने 255/65535 लाल तीव्रता के साथ एक पिक्सेल लिखा है। Vinfo.bpp printf का आउटपुट क्या है? – ninjalj

उत्तर

9

आप स्थान में वृद्धि नहीं कर रहे हैं (मैं यह भी पाया कि fb0 फ्रेम बफर 'inteldrmfb'। के अनुरूप)

अग्रिम धन्यवाद! तो 255 ही पहला पिक्सेल पर है, और सभी अन्य लोगों को इस बजाय 0. कोशिश कर रहे हैं:

 location = (x+vinfo.xoffset) * (vinfo.bits_per_pixel/8) + (y+vinfo.yoffset) * finfo.line_length; 
     for(count = 1 ;count < 100 ;count++) 
     { 
       *(fbp + location) = 255; /* Some blue */ 
       *(fbp + location + 1) = 0; /* A little green */ 
       *(fbp + location + 2) = 0; /* A lot of red */ 
       *(fbp + location + 3) = 0; /* No transparency */ 
       location += 4; 
     } 

हालांकि, परीक्षण के लिए ऐसा करना सही हो सकता है directfb उपयोग करने के लिए यह कुछ फ्रेमबफर प्रदर्शन परीक्षण के साथ आता है

+1

क्यों -1? क्या मैंने कुछ बदसूरत गलती की? – shodanex

+2

मुझे एप्ला कारक (4 वें बाइट) में कुछ अपर्याप्तता जोड़नी पड़ी। इसके अलावा स्थान को बढ़ाने के लिए आवश्यक स्थान भी है। इन्हें 'fbdump' (fbdump -fb/dev 'का उपयोग करके कैप्चर करके इन्हें' dev/fb0 'से आउटपुट देखा गया था।/fb0> image.ppm)। मेरे screnn पर फ्रेमबफर आउटपुट देखने के लिए मुझे FBIO_PAN_DISPLAY ioctl कॉल को कॉल करना पड़ा। – NRJ

+2

मुझे लगता है कि directfb के लिए सही लिंक अब http://directfb.net/ उत्तर में मौजूद लिंक वर्तमान में एक अलग साइट पर रीडायरेक्ट करता है। –