关于framebuffer的一些文章_ - 我的文章 - t_t.htm
来自「S3C44B0X下的LCD (framebuffer)驱动资料与相关代码」· HTM 代码 · 共 928 行 · 第 1/5 页
HTM
928 行
pFbdev->fb_fix.smem_len +
pFbdev->fb_mem_offset,<SPAN>
</SPAN><SPAN> </SPAN>PROT_READ |
PROT_WRITE, MAP_SHARED, pFbdev->fb, 0);</SPAN></P>
<P class=MsoNormal><SPAN
lang=EN-US><SPAN> </SPAN>if (-1L
== (long) pFbdev->fb_mem) </SPAN></P>
<P class=MsoNormal><SPAN
lang=EN-US><SPAN>
</SPAN>{</SPAN></P>
<P class=MsoNormal><SPAN
lang=EN-US><SPAN>
</SPAN><SPAN>
</SPAN>printf("mmap error! mem:%d offset:%d\n", pFbdev->fb_mem,
pFbdev->fb_mem_offset);</SPAN></P>
<P class=MsoNormal><SPAN
lang=EN-US><SPAN>
</SPAN>return FALSE;</SPAN></P>
<P class=MsoNormal><SPAN
lang=EN-US><SPAN>
</SPAN>}</SPAN></P>
<P class=MsoNormal><SPAN
lang=EN-US><SPAN> </SPAN>return
TRUE;</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>}</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>//close frame buffer</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>int fb_close(PFBDEV
pFbdev)</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>{</SPAN></P>
<P class=MsoNormal><SPAN
lang=EN-US><SPAN>
</SPAN>close(pFbdev->fb);</SPAN></P>
<P class=MsoNormal><SPAN
lang=EN-US><SPAN>
</SPAN>pFbdev->fb=-1;</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>}</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>//get display depth</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>int get_display_depth(PFBDEV
pFbdev);</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>{</SPAN></P>
<P class=MsoNormal><SPAN
lang=EN-US><SPAN>
</SPAN>if(pFbdev->fb<=0)</SPAN></P>
<P class=MsoNormal><SPAN
lang=EN-US><SPAN>
</SPAN>{</SPAN></P>
<P class=MsoNormal><SPAN
lang=EN-US><SPAN>
</SPAN><SPAN> </SPAN>printf("fb
device not open, open it first\n");</SPAN></P>
<P class=MsoNormal><SPAN
lang=EN-US><SPAN>
</SPAN>return FALSE;</SPAN></P>
<P class=MsoNormal><SPAN
lang=EN-US><SPAN>
</SPAN>}</SPAN></P>
<P class=MsoNormal><SPAN
lang=EN-US><SPAN> </SPAN>return
pFbdev->fb_var.bits_per_pixel;</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>}</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>//full screen clear</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>void fb_memset (void *addr, int
c, size_t len)</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>{</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US><SPAN>
</SPAN>memset(addr, c, len);</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>}</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>//use by test</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>#define DEBUG</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>#ifdef DEBUG</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>main()</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>{</SPAN></P>
<P class=MsoNormal><SPAN
lang=EN-US><SPAN> </SPAN>FBDEV
fbdev;</SPAN></P>
<P class=MsoNormal><SPAN
lang=EN-US><SPAN>
</SPAN>memset(&fbdev, 0, sizeof(FBDEV));</SPAN></P>
<P class=MsoNormal><SPAN
lang=EN-US><SPAN>
</SPAN>strcpy(fbdev.dev, "/dev/fb0");</SPAN></P>
<P class=MsoNormal><SPAN
lang=EN-US><SPAN>
</SPAN>if(fb_open(&fbdev)==FALSE)</SPAN></P>
<P class=MsoNormal><SPAN
lang=EN-US><SPAN>
</SPAN>{</SPAN></P>
<P class=MsoNormal><SPAN
lang=EN-US><SPAN>
</SPAN><SPAN>
</SPAN>printf("open frame buffer error\n");</SPAN></P>
<P class=MsoNormal><SPAN
lang=EN-US><SPAN>
</SPAN>return;</SPAN></P>
<P class=MsoNormal><SPAN
lang=EN-US><SPAN>
</SPAN>}</SPAN></P>
<P class=MsoNormal><SPAN
lang=EN-US><SPAN>
</SPAN>fb_memset(fbdev.fb_mem + fbdev.fb_mem_offset, 0,
fbdev.fb_fix.smem_len);</SPAN></P>
<P class=MsoNormal><SPAN
lang=EN-US><SPAN>
</SPAN><SPAN>
</SPAN>fb_close(&fbdev);</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>}</SPAN></P>
<P class=MsoNormal><SPAN style="FONT-FAMILY: 宋体">(二)基于</SPAN><SPAN
lang=EN-US>Linux</SPAN><SPAN
style="FONT-FAMILY: 宋体">核心的汉字显示的尝试</SPAN></P>
<P class=MsoNormal><SPAN
style="FONT-FAMILY: 宋体">我们以一个简单的例子来说明字符显示的过程。我们假设是在虚拟终端</SPAN><SPAN
lang=EN-US>1</SPAN><SPAN style="FONT-FAMILY: 宋体">(</SPAN><SPAN
lang=EN-US>/dev/tty1</SPAN><SPAN
style="FONT-FAMILY: 宋体">)下运行一个如下的简单程序。</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>main ( )</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>{</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>puts("hello,
world.\n");</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>}</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>puts </SPAN><SPAN
style="FONT-FAMILY: 宋体">函数向缺省输出文件</SPAN><SPAN
lang=EN-US>(/dev/tty1)</SPAN><SPAN
style="FONT-FAMILY: 宋体">发出写的系统调用</SPAN><SPAN
lang=EN-US>write(2)</SPAN><SPAN
style="FONT-FAMILY: 宋体">。系统调用到</SPAN><SPAN
lang=EN-US>linux</SPAN><SPAN
style="FONT-FAMILY: 宋体">核心里面对应的核心函数是</SPAN><SPAN
lang=EN-US>console.c</SPAN><SPAN
style="FONT-FAMILY: 宋体">中的</SPAN><SPAN lang=EN-US>
con_write()</SPAN><SPAN style="FONT-FAMILY: 宋体">,</SPAN><SPAN
lang=EN-US>con_write()</SPAN><SPAN
style="FONT-FAMILY: 宋体">最终会调用</SPAN><SPAN lang=EN-US>do_con_write(
)</SPAN><SPAN style="FONT-FAMILY: 宋体">。在</SPAN><SPAN
lang=EN-US>do_con_write( )</SPAN><SPAN
style="FONT-FAMILY: 宋体">中负责把</SPAN><SPAN lang=EN-US>"hello,
world.\n"</SPAN><SPAN style="FONT-FAMILY: 宋体">这个字符串放到</SPAN><SPAN
lang=EN-US>tty1</SPAN><SPAN
style="FONT-FAMILY: 宋体">对应的缓冲区中去。</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>do_con_write( )</SPAN><SPAN
style="FONT-FAMILY: 宋体">还负责处理控制字符和光标的位置。让我们来看一下</SPAN><SPAN
lang=EN-US>do_con_write()</SPAN><SPAN
style="FONT-FAMILY: 宋体">这个函数的声明。</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>static int do_con_write(struct
tty_struct * tty, int from_user, const unsigned char *buf, int
count) </SPAN></P>
<P class=MsoNormal><SPAN style="FONT-FAMILY: 宋体">其中</SPAN><SPAN
lang=EN-US>tty</SPAN><SPAN style="FONT-FAMILY: 宋体">是指向</SPAN><SPAN
lang=EN-US>tty_struct</SPAN><SPAN
style="FONT-FAMILY: 宋体">结构的指针,这个结构里面存放着关于这个</SPAN><SPAN
lang=EN-US>tty</SPAN><SPAN
style="FONT-FAMILY: 宋体">的所有信息(请参照</SPAN><SPAN lang=EN-US>
linux/include/linux/tty.h</SPAN><SPAN
style="FONT-FAMILY: 宋体">)。</SPAN><SPAN
lang=EN-US>Tty_struct</SPAN><SPAN
style="FONT-FAMILY: 宋体">结构中定义了通用(或高层)</SPAN><SPAN
lang=EN-US>tty</SPAN><SPAN
style="FONT-FAMILY: 宋体">的属性(例如宽度和高度等)。在</SPAN><SPAN
lang=EN-US>do_con_write( )</SPAN><SPAN
style="FONT-FAMILY: 宋体">函数中用到了</SPAN><SPAN
lang=EN-US>tty_struct</SPAN><SPAN
style="FONT-FAMILY: 宋体">结构中的</SPAN><SPAN
lang=EN-US>driver_data</SPAN><SPAN
style="FONT-FAMILY: 宋体">变量。</SPAN><SPAN
lang=EN-US>driver_data</SPAN><SPAN
style="FONT-FAMILY: 宋体">是一个</SPAN><SPAN
lang=EN-US>vt_struct</SPAN><SPAN
style="FONT-FAMILY: 宋体">指针。在</SPAN><SPAN
lang=EN-US>vt_struct</SPAN><SPAN
style="FONT-FAMILY: 宋体">结构中包含这个</SPAN><SPAN
lang=EN-US>tty</SPAN><SPAN
style="FONT-FAMILY: 宋体">的序列号(我们正使用</SPAN><SPAN
lang=EN-US>tty1</SPAN><SPAN
style="FONT-FAMILY: 宋体">,所以这个序号为</SPAN><SPAN
lang=EN-US>1</SPAN><SPAN style="FONT-FAMILY: 宋体">)。</SPAN><SPAN
lang=EN-US>Vt_struct</SPAN><SPAN
style="FONT-FAMILY: 宋体">结构中有一个</SPAN><SPAN lang=EN-US>vc</SPAN><SPAN
style="FONT-FAMILY: 宋体">结构的数组</SPAN><SPAN
lang=EN-US>vc_cons</SPAN><SPAN
style="FONT-FAMILY: 宋体">,这个数组就是各虚拟终端的私有数据。</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>static int do_con_write(struct
tty_struct * tty, int from_user,const unsigned char *buf, int
count)</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>{</SPAN></P>
<P class=MsoNormal
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?