⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 关于frambuffer - ~ 悠悠风信子 ~ - csdnblog.htm

📁 S3C44B0X下的LCD (framebuffer)驱动资料与相关代码
💻 HTM
📖 第 1 页 / 共 5 页
字号:
            <P>#i nclude &lt;linux/fb.h&gt;</P>
            <P>//a framebuffer device structure;</P>
            <P>typedef struct fbdev{</P>
            <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int fb;</P>
            <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned long 
            fb_mem_offset;</P>
            <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned long fb_mem;</P>
            <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struct fb_fix_screeninfo 
            fb_fix;</P>
            <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struct fb_var_screeninfo 
            fb_var;</P>
            <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char dev[20];</P>
            <P>} FBDEV, *PFBDEV;</P>
            <P>//open &amp; init a frame buffer</P>
            <P>//to use this function,</P>
            <P>//you must set FBDEV.dev="/dev/fb0"</P>
            <P>//or "/dev/fbX"</P>
            <P>//it's your frame buffer.</P>
            <P>int fb_open(PFBDEV pFbdev);</P>
            <P>//close a frame buffer</P>
            <P>int fb_close(PFBDEV pFbdev);</P>
            <P>//get display depth</P>
            <P>int get_display_depth(PFBDEV pFbdev);</P>
            <P>//full screen clear</P>
            <P>void fb_memset(void *addr, int c, size_t len);</P>
            <P>#endif</P>
            <P>&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;</P>
            <P>/******************</P>
            <P>File name : fbtools.c</P>
            <P>*/</P>
            <P>#i nclude &lt;stdio.h&gt;</P>
            <P>#i nclude &lt;stdlib.h&gt;</P>
            <P>#i nclude &lt;fcntl.h&gt;</P>
            <P>#i nclude &lt;unistd.h&gt;</P>
            <P>#i nclude &lt;string.h&gt;</P>
            <P>#i nclude &lt;sys/ioctl.h&gt;</P>
            <P>#i nclude &lt;sys/mman.h&gt;</P>
            <P>#i nclude &lt;asm/page.h&gt;</P>
            <P>#i nclude "fbtools.h"</P>
            <P>#define TRUE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1</P>
            <P>#define FALSE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0</P>
            <P>#define MAX(x,y)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            ((x)&gt;(y)?(x)y))</P>
            <P>#define MIN(x,y)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            ((x)&lt;(y)?(x)y))</P>
            <P>//open &amp; init a frame buffer</P>
            <P>int fb_open(PFBDEV pFbdev)</P>
            <P>{</P>
            <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pFbdev-&gt;fb = 
            open(pFbdev-&gt;dev, O_RDWR);</P>
            <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(pFbdev-&gt;fb &lt; 0)</P>
            <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</P>
            <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            printf("Error opening %s: %m. Check kernel config\n", 
            pFbdev-&gt;dev);</P>
            <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            return FALSE;</P>
            <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</P>
            <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (-1 == 
            ioctl(pFbdev-&gt;fb,FBIOGET_VSCREENINFO,&amp;(pFbdev-&gt;fb_var)))</P>
            <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</P>
            <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            printf("ioctl FBIOGET_VSCREENINFO\n");</P>
            <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            return FALSE;</P>
            <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</P>
            <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (-1 == 
            ioctl(pFbdev-&gt;fb,FBIOGET_FSCREENINFO,&amp;(pFbdev-&gt;fb_fix)))</P>
            <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</P>
            <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            printf("ioctl FBIOGET_FSCREENINFO\n");</P>
            <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            return FALSE;</P>
            <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</P>
            <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //map physics address to 
            virtual address</P>
            <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pFbdev-&gt;fb_mem_offset = 
            (unsigned long)(pFbdev-&gt;fb_fix.smem_start) &amp; 
(~PAGE_MASK);</P>
            <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pFbdev-&gt;fb_mem = 
            (unsigned long int)mmap(NULL, pFbdev-&gt;fb_fix.smem_len + 
            pFbdev-&gt;fb_mem_offset,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            PROT_READ | PROT_WRITE, MAP_SHARED, pFbdev-&gt;fb, 0);</P>
            <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (-1L == (long) 
            pFbdev-&gt;fb_mem) </P>
            <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</P>
            <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            printf("mmap error! mem:%d offset:%d\n", pFbdev-&gt;fb_mem, 
            pFbdev-&gt;fb_mem_offset);</P>
            <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            return FALSE;</P>
            <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</P>
            <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return TRUE;</P>
            <P>}</P>
            <P>//close frame buffer</P>
            <P>int fb_close(PFBDEV pFbdev)</P>
            <P>{</P>
            <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; close(pFbdev-&gt;fb);</P>
            <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pFbdev-&gt;fb=-1;</P>
            <P>}</P>
            <P>//get display depth</P>
            <P>int get_display_depth(PFBDEV pFbdev);</P>
            <P>{</P>
            <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(pFbdev-&gt;fb&lt;=0)</P>
            <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</P>
            <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            printf("fb device not open, open it first\n");</P>
            <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            return FALSE;</P>
            <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</P>
            <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 
            pFbdev-&gt;fb_var.bits_per_pixel;</P>
            <P>}</P>
            <P>//full screen clear</P>
            <P>void fb_memset (void *addr, int c, size_t len)</P>
            <P>{</P>
            <P>&nbsp;&nbsp;&nbsp; memset(addr, c, len);</P>
            <P>}</P>
            <P>//use by test</P>
            <P>#define DEBUG</P>
            <P>#ifdef DEBUG</P>
            <P>main()</P>
            <P>{</P>
            <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FBDEV fbdev;</P>
            <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memset(&amp;fbdev, 0, 
            sizeof(FBDEV));</P>
            <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcpy(fbdev.dev, 
            "/dev/fb0");</P>
            <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            if(fb_open(&amp;fbdev)==FALSE)</P>
            <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</P>
            <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            printf("open frame buffer error\n");</P>
            <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            return;</P>
            <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</P>
            <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fb_memset(fbdev.fb_mem + 
            fbdev.fb_mem_offset, 0, fbdev.fb_fix.smem_len);</P>
            <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            fb_close(&amp;fbdev);</P>
            <P>}</P>
            <P>(二)基于Linux核心的汉字显示的尝试</P>
            <P>我们以一个简单的例子来说明字符显示的过程。我们假设是在虚拟终端1(/dev/tty1)下运行一个如下的简单程序。</P>
            <P>main ( )</P>
            <P>{</P>
            <P>puts("hello, world.\n");</P>
            <P>}</P>
            <P>puts 
            函数向缺省输出文件(/dev/tty1)发出写的系统调用write(2)。系统调用到linux核心里面对应的核心函数是console.c中的 
            con_write(),con_write()最终会调用do_con_write( )。在do_con_write( 
            )中负责把"hello, world.\n"这个字符串放到tty1对应的缓冲区中去。</P>
            <P>do_con_write( )还负责处理控制字符和光标的位置。让我们来看一下do_con_write()这个函数的声明。</P>
            <P>static int do_con_write(struct tty_struct * tty, int from_user, 
            const unsigned char *buf, int count) </P>
            <P>其中tty是指向tty_struct结构的指针,这个结构里面存放着关于这个tty的所有信息(请参照 
            linux/include/linux/tty.h)。Tty_struct结构中定义了通用(或高层)tty的属性(例如宽度和高度等)。在do_con_write( 
            )函数中用到了tty_struct结构中的driver_data变量。driver_data是一个vt_struct指针。在vt_struct结构中包含这个tty的序列号(我们正使用tty1,所以这个序号为1)。Vt_struct结构中有一个vc结构的数组vc_cons,这个数组就是各虚拟终端的私有数据。</P>
            <P>static int do_con_write(struct tty_struct * tty, int 
            from_user,const unsigned char *buf, int count)</P>
            <P>{</P>
            <P>struct vt_struct *vt = (struct vt_struct 
            *)tty-&gt;driver_data;//我们用到了driver_data变量</P>
            <P>. . . . .</P>
            <P>currcons = vt-&gt;vc_num; file://我们在这里的vc_nums就是1</P>
            <P>. . . . .</P>
            <P>}</P>
            <P>要访问虚拟终端的私有数据,需使用vc_cons〔currcons〕.d指针。这个指针指向的结构含有当前虚拟终端上光标的位置、缓冲区的起始地址、缓冲区大小等等。</P>
            <P>"hello, world.\n"中的每一个字符都要经过conv_uni_to_pc( 
            )这个函数转换成8位的显示字符。这要做的主要目的是使不同语言的国家能把16位的UniCode码映射到8位的显示字符集上,目前还是主要针对欧洲国家的语言,映射结果为8位,不包含对双字节(double 
            byte)的范围。</P>
            <P>这种UNICODE到显示字符的映射关系可以由用户自行定义。在缺省的映射表上,会把中文的字符映射到其他的字符上,这是我们不希望看到也是不需要的。所以我们有两个选择∶</P>
            <P>1不进行conv_uni_to_pc( )的转换。</P>
            <P>2加载符合双字节处理的映射关系,即对非控制字符进行1对1的不变映射。我们自己定制的符合这种映射关系的UNICODE码表是direct.uni。要想查看/装载当前系统的unicode映射表,可使外部命令loadunimap。</P>
            <P>经过conv_uni_to_pc( )转换之后,"hello, 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -