source: titan/titan/fb.h @ 45014

Last change on this file since 45014 was 45014, checked in by obi, 2 years ago

add getfbxres getfbyres and use this on hbbtv start

File size: 17.2 KB
Line 
1#ifndef FB_H
2#define FB_H
3
4#ifdef CONFIG_ION
5#define ION_HEAP_TYPE_BMEM      (ION_HEAP_TYPE_CUSTOM + 1)
6#define ION_HEAP_ID_MASK        (1 << ION_HEAP_TYPE_BMEM)
7#define ACCEL_MEM_SIZE          (32*1024*1024)
8int m_accel_fd;
9#endif
10
11
12
13
14struct fb* getfb(char *name)
15{
16        struct fb *node = fb;
17
18        while(node != NULL)
19        {
20                if(ostrstr(node->name, name) != NULL)
21                        return node;
22
23                node = node->next;
24        }
25        debug(444, "framebuffer not found (%s)", name);
26        return NULL;
27}
28
29long getfbsize(int dev)
30{
31        struct fb* node = fb;
32        unsigned long fbmemcount = 0;
33        struct fb_fix_screeninfo fix_screeninfo;
34
35        if(fb == NULL)
36        {
37                err("NULL dedect");
38                return 0;
39        }
40
41#ifndef NOFB
42        if(ioctl(fb->fd, FBIOGET_FSCREENINFO, &fix_screeninfo) == -1)
43        {
44                perr("ioctl FBIOGET_FSCREENINFO failed");
45                return 0;
46        }
47#else
48        fix_screeninfo.smem_len = 16*1024*1024;
49#endif
50
51        while(node != NULL)
52        {
53                if(node->dev == dev)
54                        fbmemcount = fbmemcount + node->varfbsize;
55                node = node->next;
56        }
57       
58        return fix_screeninfo.smem_len - fbmemcount;
59}
60
61int getfbxres()
62{
63        struct fb_var_screeninfo var_screeninfo;
64        int fd = -1;
65        char *fbdev = getconfig("fbdev", NULL);
66       
67        if(fbdev == NULL)
68        {
69                err("failed to find fbdev in config file");
70                return -1;
71        }
72
73        fd = open(fbdev, O_RDWR);
74        if(fd == -1)
75        {
76                perr("failed to open %s", fbdev);
77                return -1;
78        }
79       
80        if(ioctl(fd, FBIOGET_VSCREENINFO, &var_screeninfo) < 0)
81        {
82                err("failed to read VSCREENINFO");
83                close(fd);
84                return -1;
85        }
86
87        close(fd);
88        return var_screeninfo.xres;
89}
90
91int getfbyres()
92{
93        struct fb_var_screeninfo var_screeninfo;
94        int fd = -1;
95        char *fbdev = getconfig("fbdev", NULL);
96       
97        if(fbdev == NULL)
98        {
99                err("failed to find fbdev in config file");
100                return -1;
101        }
102
103        fd = open(fbdev, O_RDWR);
104        if(fd == -1)
105        {
106                perr("failed to open %s", fbdev);
107                return -1;
108        }
109       
110        if(ioctl(fd, FBIOGET_VSCREENINFO, &var_screeninfo) < 0)
111        {
112                err("failed to read VSCREENINFO");
113                close(fd);
114                return -1;
115        }
116
117        close(fd);
118        return var_screeninfo.yres;
119}
120
121struct fb* addfb(char *fbname, int dev, int width, int height, int colbytes, int fd, unsigned char* mmapfb, unsigned long fixfbsize, unsigned long data_phys)
122{
123        struct fb *newnode = NULL, *node = fb;
124        char *name = NULL;
125        long ret = 0;
126
127        name = ostrcat(fbname, NULL, 0, 0);
128        if(name == NULL)
129        {
130                err("no memory");
131                return NULL;
132        }
133
134        newnode = (struct fb*)malloc(sizeof(struct fb));       
135        if(newnode == NULL)
136        {
137                err("no memory");
138                free(name);
139                return NULL;
140        }
141       
142        memset(newnode, 0, sizeof(struct fb));
143        newnode->name = name;
144        newnode->dev = dev;
145        newnode->width = width;
146        newnode->height = height;
147        newnode->colbytes = colbytes;
148        newnode->pitch = newnode->width * newnode->colbytes;
149        newnode->fb = mmapfb;
150        newnode->fblong = (unsigned long*)newnode->fb;
151        newnode->fd = fd;
152        newnode->fixfbsize = fixfbsize;
153        newnode->data_phys = data_phys;
154       
155        if(ostrcmp(name, FB) == 0)
156                setfbvarsize(newnode);
157        else if(ostrcmp(name, FB1) == 0)
158#ifdef MIPSEL
159                newnode->varfbsize = width * height * newnode->colbytes;
160#else           
161                newnode->varfbsize = 720 * 576 * newnode->colbytes;
162#endif
163        else
164                newnode->varfbsize = width * height * newnode->colbytes;
165       
166        if(node != NULL)
167        {
168                while(node->next != NULL)
169                        node = node->next;
170                node->next = newnode;
171        }
172        else
173                fb = newnode;
174               
175        /*eigener Buffer zB fuer LCD*/
176        if(dev == 999)
177                return newnode;
178#ifdef CONFIG_ION
179        if(ostrcmp(name, FB) == 0)
180                ret = getfbsize(dev);
181#else
182        ret = getfbsize(dev);
183#endif
184        if(ret < 0)
185        {
186                err("framebuffermem (%s) to small, needed = %ld", name, ret * -1);
187                free(name);
188                free(newnode);
189                if(newnode == fb) fb = NULL;
190                return NULL;
191        }
192
193        debug(444, "fbname=%s, fbwidth=%d, fbheight=%d, fbcol=%d, fbsize=%ld, phys_addr=%lu", newnode->name, newnode->width, newnode->height, newnode->colbytes, newnode->varfbsize, newnode->data_phys);
194        return newnode;
195}
196
197void fb2png_thread()
198{
199        while (writeFBfile.buf1 != NULL || writeFBfile.buf2 != NULL) {
200                if(writeFBfile.buf1 != NULL) {
201                        writeFBfile.ActBuf = writeFBfile.buf1;
202                        fb2png(writeFBfile.buf1, 320, 240, "/tmp/titanlcd.png");
203                        free(writeFBfile.buf1); writeFBfile.buf1 = NULL;
204                        if(writeFBfile.buf2 != NULL)
205                                usleep(500000);
206                }
207                if(writeFBfile.buf2 != NULL) {
208                        writeFBfile.ActBuf = writeFBfile.buf2;
209                        fb2png(writeFBfile.buf2, 320, 240, "/tmp/titanlcd.png");
210                        free(writeFBfile.buf2); writeFBfile.buf2 = NULL;
211                        if(writeFBfile.buf1 != NULL)
212                                usleep(500000);
213                }
214        }
215        writeFBfile.ActBuf = NULL;
216}
217
218void delfb(char *name)
219{
220        struct fb *node = fb, *prev = fb;
221
222        while(node != NULL)
223        {
224                if(ostrcmp(node->name, name) == 0)
225                {
226                        if(node == fb)
227                                fb = node->next;
228                        else
229                                prev->next = node->next;
230
231                        free(node->name);
232                        node->name = NULL;
233
234                        free(node);
235                        node = NULL;
236                        break;
237                }
238
239                prev = node;
240                node = node->next;
241        }
242}
243
244void freefb()
245{
246        struct fb *node = fb, *prev = fb;
247
248        while(node != NULL)
249        {
250                prev = node;
251                node = node->next;
252                if(prev != NULL)
253                        delfb(prev->name);
254        }
255}
256
257struct fb* openfb(char *fbdev, int devnr)
258{
259        int fd = -1;
260        unsigned char *mmapfb = NULL;
261        struct fb_var_screeninfo var_screeninfo;
262        struct fb_fix_screeninfo fix_screeninfo;
263        struct fb* node = NULL;
264
265        if(fbdev == NULL)
266        {
267                err("failed to find fbdev in config file");
268                return NULL;
269        }
270
271#ifdef CONFIG_ION
272        int ion;
273#endif
274
275#ifndef NOFB
276        fd = open(fbdev, O_RDWR);
277
278// blinking work start
279#ifdef MIPSEL
280        if (fd < 0)
281        {
282                err(fbdev);
283                goto nolfb;
284        }
285#endif
286// blinking work end
287               
288        if(fd == -1)
289        {
290                perr("failed to open %s", fbdev);
291                return NULL;
292        }
293        closeonexec(fd);
294       
295        //workarounnd
296        if(checkchipset("HI3798MV200") == 1)
297        {
298                printf("---> setframebuffer(1280, 720, 1280, 2880, 32)\n");
299                setframebuffer(1280, 720, 1280, 2880, 32);
300        }
301        if(frameb1 == 1)
302        {
303                printf("---> setframebuffer(1920, 1080, 1920, 2160, 32);\n");
304                setframebuffer(1920, 1080, 1920, 2160, 32);
305        }
306       
307       
308        if(ioctl(fd, FBIOGET_VSCREENINFO, &var_screeninfo) == -1)
309        {
310                perr("ioctl FBIOGET_VSCREENINFO failed");
311                close(fd);
312                return NULL;
313        }
314
315        if(ioctl(fd, FBIOGET_FSCREENINFO, &fix_screeninfo) == -1)
316        {
317                perr("ioctl FBIOGET_FSCREENINFO failed");
318                close(fd);
319                return NULL;
320        }
321
322        if(!(mmapfb = (unsigned char*)mmap(0, fix_screeninfo.smem_len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0)))
323        {
324                perr("mmap framebuffer");
325                close(fd);
326                return NULL;
327        }
328
329        debug(444, "%dk video mem", fix_screeninfo.smem_len/1024);
330        unsigned long data_phys = 0;   
331#ifdef MIPSEL
332        data_phys = fix_screeninfo.smem_start;
333#ifdef CONFIG_ION
334        /* allocate accel memory here... its independent from the framebuffer */
335        ion = open("/dev/ion", O_RDWR | O_CLOEXEC);
336        if (ion >= 0)
337        {
338                struct ion_allocation_data alloc_data;
339                struct ion_fd_data share_data;
340                struct ion_handle_data free_data;
341                struct ion_phys_data phys_data;
342                int ret;
343               
344                debug(444,"Using ION allocator");
345
346                memset(&alloc_data, 0, sizeof(alloc_data));
347                alloc_data.len = ACCEL_MEM_SIZE;
348                alloc_data.align = 4096; // 4k aligned
349                alloc_data.heap_id_mask = ION_HEAP_ID_MASK;
350                ret = ioctl(ion, ION_IOC_ALLOC, &alloc_data);
351                if (ret < 0)
352                {
353                        err("ION_IOC_ALLOC failed");
354                        err("failed to allocate accel memory!!!");
355                        return NULL;
356                }
357
358                memset(&phys_data, 0, sizeof(phys_data));
359                phys_data.handle = alloc_data.handle;
360                ret = ioctl(ion, ION_IOC_PHYS, &phys_data);
361                if (ret < 0)
362                {
363                        err("ION_IOC_PHYS failed");
364                        goto err_ioc_free;
365                }
366
367                memset(&share_data, 0, sizeof(share_data));
368                share_data.handle = alloc_data.handle;
369                ret = ioctl(ion, ION_IOC_SHARE, &share_data);
370                if (ret < 0)
371                {
372                        err("ION_IOC_SHARE failed");
373                        goto err_ioc_free;
374                }
375
376                memset(&free_data, 0, sizeof(free_data));
377                free_data.handle = alloc_data.handle;
378                if (ioctl(ion, ION_IOC_FREE, &free_data) < 0)
379                        err("ION_IOC_FREE failed");
380
381                m_accel_fd = share_data.fd;
382                lfb=(unsigned char*)mmap(0, ACCEL_MEM_SIZE, PROT_WRITE|PROT_READ, MAP_SHARED, share_data.fd, 0);
383
384                if (lfb)
385                {
386                        debug(444,"%dkB available for acceleration surfaces (via ION).", ACCEL_MEM_SIZE);
387                       
388                        node = addfb(FB, devnr, var_screeninfo.xres, var_screeninfo.yres, var_screeninfo.bits_per_pixel / 8, fd, mmapfb, fix_screeninfo.smem_len, data_phys);
389                        skinfb = addfb(SKINFB, 0, getconfigint("skinfbwidth", NULL), getconfigint("skinfbheight", NULL), 4, share_data.fd, lfb, ACCEL_MEM_SIZE, phys_data.addr);
390                        accelfb = addfb(ACCELFB, 0, (ACCEL_MEM_SIZE-(skinfb->width*skinfb->height*4)) / 4, 1, 4, share_data.fd, skinfb->fb + skinfb->varfbsize, ACCEL_MEM_SIZE, skinfb->data_phys + skinfb->varfbsize);
391                }
392                else
393                {
394                        close(m_accel_fd);
395                        err("mmap lfb failed");
396err_ioc_free:
397                        err("failed to allocate accel memory via ION!!!");
398                        m_accel_fd = -1;
399                        memset(&free_data, 0, sizeof(free_data));
400                        free_data.handle = alloc_data.handle;
401                        if (ioctl(ion, ION_IOC_FREE, &free_data) < 0)
402                                err("ION_IOC_FREE");
403                }
404                close(ion);
405        }
406        else
407        {
408                err("failed to open ION device node! no allocate accel memory available !!");
409                m_accel_fd = -1;
410        }
411        if (!lfb)
412        {
413                err("mmap");
414                goto nolfb;
415        }
416#else
417        lfb = (unsigned char*)mmap(0, fix_screeninfo.smem_len, PROT_WRITE|PROT_READ, MAP_SHARED, fd, 0);
418        if (!lfb)
419        {
420                err("mmap");
421                goto nolfb;
422        }
423
424        if (var_screeninfo.bits_per_pixel != 32)
425        {
426                debug(444, "Only 32 bit per pixel supported. Framebuffer currently use %d", var_screeninfo.bits_per_pixel);
427                closefb();
428                return 0;
429        }
430#endif 
431#endif
432#ifndef CONFIG_ION
433        if(devnr == 0)
434                node = addfb(FB, devnr, var_screeninfo.xres, var_screeninfo.yres, var_screeninfo.bits_per_pixel / 8, fd, mmapfb, fix_screeninfo.smem_len, data_phys);
435        if(devnr == 1)
436                node = addfb(FB1, devnr, var_screeninfo.xres, var_screeninfo.yres, var_screeninfo.bits_per_pixel / 8, fd, mmapfb, fix_screeninfo.smem_len, data_phys);
437
438#endif         
439
440#else
441        mmapfb = malloc(16 * 1024 * 1024);
442        if(devnr == 0)
443                node = addfb(FB, devnr, getconfigint("skinfbwidth", NULL), getconfigint("skinfbheight", NULL), 4, -1, mmapfb, 16*1024*1024, 0);
444        if(devnr == 1)
445                node = addfb(FB1, devnr, getconfigint("skinfbwidth", NULL), getconfigint("skinfbheight", NULL), 4, -1, mmapfb, 16*1024*1024, 0);
446
447#endif
448
449        return node;
450
451#ifdef MIPSEL
452nolfb:
453        if (fd >= 0)
454        {
455                close(fd);
456                fd = -1;
457        }
458
459        debug(444, "framebuffer not available.");
460#endif
461        return 0;
462// blinking work end
463}
464
465void closefb()
466{
467
468#ifdef MIPSEL
469        if(lfb)
470        {
471                debug(444, "ms_sync");
472                msync(lfb, fix_screeninfo.smem_len, MS_SYNC);
473                munmap(lfb, fix_screeninfo.smem_len);
474        }
475        if(fb->fd >= 0)
476        {
477                debug(444, "close");
478                disablemanualblit();
479                close(fb->fd);
480                fb->fd = -1;
481        }
482#endif
483
484        if(fb != NULL)
485        {
486                if(fb->fb != NULL)
487                        munmap(fb->fb, fb->fixfbsize);
488                if(fb->fd != -1)
489                        close(fb->fd);
490#ifdef NOFB
491                free(fb->fb);
492#endif
493        }
494}
495
496void clearfball()
497{
498        if(fb != NULL && fb->fb != NULL)
499                memset(fb->fb, 0, fb->fixfbsize);
500}
501
502void clearfb(struct fb *node)
503{
504        if(node != NULL)
505                memset(node->fb, 0, node->varfbsize);
506}
507
508void blitfb(int flag)
509{
510        blitfb2(skinfb, flag);
511}
512
513void blitfb1()
514{
515        blitfb2(skinfb, 0);
516}
517
518//flag 0: del skinfb
519//flag 1: don't del skinfb
520void changefbresolution(char *value, int flag)
521{
522        debug(444, "fb->colbytes: %d", fb->colbytes);
523#ifdef MIPSEL
524        return;
525#endif
526
527        if(ostrcmp("pal", value) == 0)
528        {
529                fb->width = 720;
530                fb->height = 576;
531                fb->pitch = fb->width * fb->colbytes;
532        }
533        else if(ostrncmp("576", value, 3) == 0)
534        {
535                fb->width = 720;
536                fb->height = 576;
537                fb->pitch = fb->width * fb->colbytes;
538        }
539        else if(ostrncmp("720", value, 3) == 0)
540        {
541                fb->width = 1280;
542                fb->height = 720;
543                fb->pitch = fb->width * fb->colbytes;
544        }
545        else if(ostrncmp("1080", value, 4) == 0)
546        {
547                fb->width = 1920;
548                fb->height = 1080;
549                fb->pitch = fb->width * fb->colbytes;
550        }
551        if(skinfb == fb)
552        {
553                skin->width = skinfb->width;
554                skin->height = skinfb->height;
555                skin->iwidth = skinfb->width;
556                skin->iheight = skinfb->height;
557                skin->rwidth = skinfb->width;
558                skin->rheight = skinfb->height;
559        }
560        clearfb(fb);
561        if(flag == 0) clearfb(skinfb);
562}
563
564static void write_PNG(unsigned char *outbuffer, char *filename,
565                                int width, int height, int interlace)
566{
567        int i;
568        int bit_depth=0, color_type;
569        png_bytep row_pointers[height];
570        png_structp png_ptr;
571        png_infop info_ptr;
572        FILE *outfile = fopen(filename, "wb");
573
574        for (i=0; i<height; i++)
575                row_pointers[i] = outbuffer + i * 4 * width;
576               
577        if (!outfile)
578        {
579                fprintf (stderr, "Error: Couldn't fopen %s.\n", filename);
580                exit(EXIT_FAILURE);
581        }
582   
583        png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING,
584        (png_voidp) NULL, (png_error_ptr) NULL, (png_error_ptr) NULL);
585   
586        if (!png_ptr)
587                err("Error: Couldn't create PNG write struct.");
588   
589        info_ptr = png_create_info_struct(png_ptr);
590        if (!info_ptr)
591        {
592                png_destroy_write_struct(&png_ptr, (png_infopp) NULL);
593                err("Error: Couldn't create PNG info struct.");
594        }
595   
596        png_init_io(png_ptr, outfile);
597   
598        png_set_compression_level(png_ptr, Z_BEST_COMPRESSION);
599   
600        bit_depth = 8;
601        color_type = PNG_COLOR_TYPE_RGB_ALPHA;
602        //color_type = PNG_COLOR_TYPE_RGB;
603        png_set_invert_alpha(png_ptr);
604        png_set_bgr(png_ptr);
605
606        png_set_IHDR(png_ptr, info_ptr, width, height,
607        bit_depth, color_type, interlace,
608        PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
609   
610        png_write_info(png_ptr, info_ptr);
611   
612        printf ("Now writing PNG file\n");
613   
614        png_write_image(png_ptr, row_pointers);
615   
616        png_write_end(png_ptr, info_ptr);
617        /* puh, done, now freeing memory... */
618        png_destroy_write_struct(&png_ptr, &info_ptr);
619   
620        if (outfile != NULL)
621                (void) fclose(outfile);
622}
623
624static void convert_and_write(unsigned char *inbuffer, char *filename,
625                                int width, int height, int bits, int interlace)
626{
627        size_t bufsize = (size_t) width * height * 4;
628
629        unsigned char *outbuffer = malloc(bufsize);
630
631        if (outbuffer == NULL)
632                err("Not enough memory");
633       
634        memset(outbuffer, 0, bufsize);
635        write_PNG(inbuffer, filename, width, height, interlace);
636        (void) free(outbuffer);
637}
638
639int fb2png(unsigned char *buf_p, int width, int height, char *outfile)
640{
641        int interlace = PNG_INTERLACE_ADAM7;
642        int bitdepth = 32;
643               
644        size_t help = 0;
645        while(help <= (width * height * 4))
646        {
647                buf_p[help+3] = 0x00;
648                help = help + 4;
649        }
650               
651        convert_and_write(buf_p, outfile, width, height, bitdepth, interlace);
652
653        return 0;
654}
655
656void pngforlcd(unsigned char *fbuffer, int width, int height)
657{
658        fb2png(fbuffer, width, height, "/tmp/titanlcd.png");
659}
660
661void write_FB_to_JPEG_file(unsigned char *inbuffer, int image_width, int image_height, char * filename, int quality)
662{               
663        size_t helpb = 0;
664        size_t help = 0;
665        unsigned char *helpbuffer = malloc(image_width*image_height*3);
666       
667        //delete alpha byte
668        while(help <= (image_width*image_height*4))
669        {
670                helpbuffer[helpb+0] = inbuffer[help+2];
671                helpbuffer[helpb+1] = inbuffer[help+1];
672                helpbuffer[helpb+2] = inbuffer[help+0];
673                help = help + 4;
674                helpb = helpb + 3;
675        }
676       
677        JSAMPLE *image_buffer = helpbuffer;
678        struct jpeg_compress_struct cinfo;
679        struct jpeg_error_mgr jerr;
680        FILE * outfile;
681       
682        JSAMPROW row_pointer[1];
683        int row_stride;
684       
685        cinfo.err = jpeg_std_error(&jerr);
686        jpeg_create_compress(&cinfo);
687        if ((outfile = fopen(filename, "wb")) == NULL) {
688                fprintf(stderr, "can't open %s\n", filename);
689                exit(1);
690        }
691        jpeg_stdio_dest(&cinfo, outfile);
692        cinfo.image_width = image_width;        /* image width and height, in pixels */
693        cinfo.image_height = image_height;
694        cinfo.input_components = 3;             /* # of color components per pixel */
695        cinfo.in_color_space = JCS_RGB;
696
697        jpeg_set_defaults(&cinfo);
698        jpeg_set_quality(&cinfo, quality, TRUE);
699
700        jpeg_start_compress(&cinfo, TRUE);
701        row_stride = image_width * 3;
702
703        while (cinfo.next_scanline < cinfo.image_height) {
704                row_pointer[0] = & image_buffer[cinfo.next_scanline * row_stride];
705                (void) jpeg_write_scanlines(&cinfo, row_pointer, 1);
706        }
707
708        jpeg_finish_compress(&cinfo);
709        fclose(outfile);
710        jpeg_destroy_compress(&cinfo);
711   
712        free(helpbuffer);
713}
714
715int setframebuffer(int width, int height, int vwidth, int vheight, int bits)
716{
717        struct fb_var_screeninfo var_screeninfo;
718        int fd = -1;
719        char *fbdev = getconfig("fbdev", NULL);
720       
721        if(fbdev == NULL)
722        {
723                err("failed to find fbdev in config file");
724                return -1;
725        }
726
727        fd = open(fbdev, O_RDWR);
728        if(fd == -1)
729        {
730                perr("failed to open %s", fbdev);
731                return -1;
732        }
733       
734        if(ioctl(fd, FBIOGET_VSCREENINFO, &var_screeninfo) < 0)
735        {
736                err("failed to read VSCREENINFO");
737                close(fd);
738                return -1;
739        }
740
741        var_screeninfo.xres = width;
742        var_screeninfo.yres = height;
743        var_screeninfo.xres_virtual = vwidth;
744        var_screeninfo.yres_virtual = vheight;
745        var_screeninfo.bits_per_pixel  = bits;
746
747        if(ioctl(fd, FBIOPUT_VSCREENINFO, &var_screeninfo) < 0)
748        {
749                err("failed to put VSCREENINFO");
750                close(fd);
751                return -1;
752        }
753       
754        printf("---> FBIOPUT_VSCREENINFO endet\n");
755        system("fbset");
756               
757        close(fd);
758        return 0;       
759}
760
761#ifdef OEBUILD
762int saveframebuffer()
763{
764        int fd = -1;
765        char *fbdev = getconfig("fbdev", NULL);
766       
767        if(fbdev == NULL)
768        {
769                err("failed to find fbdev in config file");
770                return -1;
771        }
772
773        fd = open(fbdev, O_RDWR);
774        if(fd == -1)
775        {
776                perr("failed to open %s", fbdev);
777                return -1;
778        }
779        //workaround
780        if(checkchipset("HI3798MV200") == 1)
781        {
782                printf("---> setframebuffer(1280, 720, 1280, 2880, 32)\n");
783                setframebuffer(1280, 720, 1280, 2880, 32);
784        }
785        if(frameb1 == 1)
786        {
787                printf("---> setframebuffer(1920, 1080, 1920, 2160, 32)\n");
788                setframebuffer(1920, 1080, 1920, 2160, 32);
789        }
790       
791        if(ioctl(fd, FBIOGET_VSCREENINFO, &save_var_screeninfo) < 0)
792        {
793                err("failed to read VSCREENINFO");
794                close(fd);
795                return -1;
796        }
797
798        close(fd);
799        return 0;       
800}
801
802int restoreframebuffer()
803{
804        int fd = -1;
805        char *fbdev = getconfig("fbdev", NULL);
806       
807        if(fbdev == NULL)
808        {
809                err("failed to find fbdev in config file");
810                return -1;
811        }
812
813        fd = open(fbdev, O_RDWR);
814        if(fd == -1)
815        {
816                perr("failed to open %s", fbdev);
817                return -1;
818        }
819       
820        if(ioctl(fd, FBIOPUT_VSCREENINFO, &save_var_screeninfo) < 0)
821        {
822                err("failed to write VSCREENINFO");
823                close(fd);
824                return -1;
825        }
826
827        close(fd);
828        return 0;       
829}
830#endif
831
832
833#endif
Note: See TracBrowser for help on using the repository browser.