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

📄 关于frambuffer--狼牙月.htm

📁 S3C44B0X下的LCD (framebuffer)驱动资料与相关代码
💻 HTM
📖 第 1 页 / 共 5 页
字号:
                        <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>

⌨️ 快捷键说明

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