Framebuffer简单测试程序
时间:2007-03-17 来源:kf701
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <stdint.h>
5 #include <unistd.h>
6 #include <fcntl.h>
7 #include <sys/ioctl.h>
8 #include <sys/mman.h>
9 #include <asm/page.h>
10 #include <linux/fb.h>
11
12 #define TRUE 1
13 #define FALSE 2
14
15 //a framebuffer device structure;
16 typedef struct fbdev{
17 int fb;
18 unsigned long fb_mem_offset;
19 unsigned long fb_mem;
20 struct fb_fix_screeninfo fb_fix;
21 struct fb_var_screeninfo fb_var;
22 char dev[20];
23 } FBDEV, *PFBDEV;
24
25 int fb_open(PFBDEV pFbdev)
26 {
27 pFbdev->fb = open(pFbdev->dev, O_RDWR);
28 if(pFbdev->fb < 0)
29 {
30 printf("Error opening %s: %m. Check kernel config\n", pFbdev->dev);
31 return FALSE;
32 }
33 if (-1 == ioctl(pFbdev->fb,FBIOGET_VSCREENINFO,&(pFbdev->fb_var)))
34 {
35 printf("ioctl FBIOGET_VSCREENINFO\n");
36 return FALSE;
37 }
38 if (-1 == ioctl(pFbdev->fb,FBIOGET_FSCREENINFO,&(pFbdev->fb_fix)))
39 {
40 printf("ioctl FBIOGET_FSCREENINFO\n");
41 return FALSE;
42 }
43
44 //map physics address to virtual address
45 pFbdev->fb_mem_offset = (unsigned long)(pFbdev->fb_fix.smem_start) & (~PAGE_MASK);
46 pFbdev->fb_mem = (unsigned long int)mmap(NULL, pFbdev->fb_fix.smem_len +
47 pFbdev->fb_mem_offset,
48 PROT_READ | PROT_WRITE, MAP_SHARED, pFbdev->fb, 0);
49 if (-1L == (long) pFbdev->fb_mem)
50 {
51 printf("mmap error! mem:%ld offset:%ld\n", pFbdev->fb_mem,
52 pFbdev->fb_mem_offset);
53 return FALSE;
54 }
55
56 return TRUE;
57 }
58
59 void fb_close(PFBDEV pFbdev)
60 {
61 close(pFbdev->fb);
62 pFbdev->fb=-1;
63 }
64
65 void fb_memset (void *addr, int c, size_t len)
66 {
67 memset(addr, c, len);
68 }
69
70 void draw_dot (PFBDEV pFbdev, uint32_t x, uint32_t y, uint8_t r, uint8_t g, uint8_t b)
71 {
72 unsigned int offset;
73 if (-1L == (long) pFbdev->fb_mem)
74 {
75 printf("mmap error! mem:%ld offset:%ld\n", pFbdev->fb_mem,
76 pFbdev->fb_mem_offset);
77 return;
78 }
79 offset = y*pFbdev->fb_fix.line_length+4*x;
80 fb_memset((void*)(pFbdev->fb_mem + pFbdev->fb_mem_offset + offset), b, 1);
81 fb_memset((void*)(pFbdev->fb_mem + pFbdev->fb_mem_offset + offset + 1), g, 1);
82 fb_memset((void*)(pFbdev->fb_mem + pFbdev->fb_mem_offset + offset + 2), r, 1);
83 fb_memset((void*)(pFbdev->fb_mem + pFbdev->fb_mem_offset + offset + 3), 0x00, 1);
84 }
85
86
87 int main(void)
88 {
89 FBDEV fb;
90 memset(&fb, 0, sizeof(FBDEV));
91 strcpy(fb.dev, "/dev/fb0");
92 if(fb_open(&fb)==FALSE)
93 {
94 printf("open frame buffer error\n");
95 return 0;
96 }
97
98 printf("depth(bits per pixel) = %d\n",fb.fb_var.bits_per_pixel);
99 printf("smemlen = %d\n",fb.fb_fix.smem_len);
100 printf("fix_line(in byte) = %d\n",fb.fb_fix.line_length);
101
102 int i,j;
103 for(i=100; i<300; ++i)
104 for(j = 80;j<100;++j)
105 {
106 draw_dot(&fb,i,j,0xff,0x00,0x0);
107 }
108
109 fb_close(&fb);
110 return 0;
111 }
2 #include <stdlib.h>
3 #include <string.h>
4 #include <stdint.h>
5 #include <unistd.h>
6 #include <fcntl.h>
7 #include <sys/ioctl.h>
8 #include <sys/mman.h>
9 #include <asm/page.h>
10 #include <linux/fb.h>
11
12 #define TRUE 1
13 #define FALSE 2
14
15 //a framebuffer device structure;
16 typedef struct fbdev{
17 int fb;
18 unsigned long fb_mem_offset;
19 unsigned long fb_mem;
20 struct fb_fix_screeninfo fb_fix;
21 struct fb_var_screeninfo fb_var;
22 char dev[20];
23 } FBDEV, *PFBDEV;
24
25 int fb_open(PFBDEV pFbdev)
26 {
27 pFbdev->fb = open(pFbdev->dev, O_RDWR);
28 if(pFbdev->fb < 0)
29 {
30 printf("Error opening %s: %m. Check kernel config\n", pFbdev->dev);
31 return FALSE;
32 }
33 if (-1 == ioctl(pFbdev->fb,FBIOGET_VSCREENINFO,&(pFbdev->fb_var)))
34 {
35 printf("ioctl FBIOGET_VSCREENINFO\n");
36 return FALSE;
37 }
38 if (-1 == ioctl(pFbdev->fb,FBIOGET_FSCREENINFO,&(pFbdev->fb_fix)))
39 {
40 printf("ioctl FBIOGET_FSCREENINFO\n");
41 return FALSE;
42 }
43
44 //map physics address to virtual address
45 pFbdev->fb_mem_offset = (unsigned long)(pFbdev->fb_fix.smem_start) & (~PAGE_MASK);
46 pFbdev->fb_mem = (unsigned long int)mmap(NULL, pFbdev->fb_fix.smem_len +
47 pFbdev->fb_mem_offset,
48 PROT_READ | PROT_WRITE, MAP_SHARED, pFbdev->fb, 0);
49 if (-1L == (long) pFbdev->fb_mem)
50 {
51 printf("mmap error! mem:%ld offset:%ld\n", pFbdev->fb_mem,
52 pFbdev->fb_mem_offset);
53 return FALSE;
54 }
55
56 return TRUE;
57 }
58
59 void fb_close(PFBDEV pFbdev)
60 {
61 close(pFbdev->fb);
62 pFbdev->fb=-1;
63 }
64
65 void fb_memset (void *addr, int c, size_t len)
66 {
67 memset(addr, c, len);
68 }
69
70 void draw_dot (PFBDEV pFbdev, uint32_t x, uint32_t y, uint8_t r, uint8_t g, uint8_t b)
71 {
72 unsigned int offset;
73 if (-1L == (long) pFbdev->fb_mem)
74 {
75 printf("mmap error! mem:%ld offset:%ld\n", pFbdev->fb_mem,
76 pFbdev->fb_mem_offset);
77 return;
78 }
79 offset = y*pFbdev->fb_fix.line_length+4*x;
80 fb_memset((void*)(pFbdev->fb_mem + pFbdev->fb_mem_offset + offset), b, 1);
81 fb_memset((void*)(pFbdev->fb_mem + pFbdev->fb_mem_offset + offset + 1), g, 1);
82 fb_memset((void*)(pFbdev->fb_mem + pFbdev->fb_mem_offset + offset + 2), r, 1);
83 fb_memset((void*)(pFbdev->fb_mem + pFbdev->fb_mem_offset + offset + 3), 0x00, 1);
84 }
85
86
87 int main(void)
88 {
89 FBDEV fb;
90 memset(&fb, 0, sizeof(FBDEV));
91 strcpy(fb.dev, "/dev/fb0");
92 if(fb_open(&fb)==FALSE)
93 {
94 printf("open frame buffer error\n");
95 return 0;
96 }
97
98 printf("depth(bits per pixel) = %d\n",fb.fb_var.bits_per_pixel);
99 printf("smemlen = %d\n",fb.fb_fix.smem_len);
100 printf("fix_line(in byte) = %d\n",fb.fb_fix.line_length);
101
102 int i,j;
103 for(i=100; i<300; ++i)
104 for(j = 80;j<100;++j)
105 {
106 draw_dot(&fb,i,j,0xff,0x00,0x0);
107 }
108
109 fb_close(&fb);
110 return 0;
111 }
相关阅读 更多 +