by cszhao1980

LP11有两个设备寄存器:状态寄存器(lpsr)和数据缓冲寄存器(lpbuf),可通过以下结构进行访问:

8812: #define LPADDR 0177514

8823: struct {

8824:     int lpsr;

8825:     int lpbuf;

8826: };

(1).  LPADDR.lpsr:状态寄存器

i. 第15位(最高位):出错标记;

如电源未开、缺纸、温度太高等都会造成标志置位。

判断条件: LPADDR.lpsr < 0

ii. 第7位: DONE标记(当该打印机控制器准备接收下一字符时设置);

iii. 第6位: Enable标记,设置后才启动了该打印机,其作用是使“DONE”或“ERROR”造成一中断。

(2). LPADDR.lpbuf:数据缓冲寄存器

第6至第0位保存要打印字符的7位ASCII代码,对此寄存器只能执行写操作。

除此之外,unix v6使用struct lp11来维护LP11设备信息,如下所示:

8829: struct {

8830:     int cc;    //前三个字用作缓冲头,即起到struct clist的作用。

8831:     int cf;

8832:     int cl;

8833:     int flag;   //记录LP11的工作状态信息

8834:     int mcc;

8835:     int ccc;

8836:     int mlc;

8837: } lp11;

1 LP11的工作方式

【注】:莱昂书中并没有详细介绍LP11的工作方式——它实在是一种简单的设备,而且,在当时

也可能很常用。本章的部分内容是通过代码所进行的合理的推测。

首先, LP11设备拥有一个缓存区域,用来存放要打印的内容。向LP11发送数据是通过设置LPADDR.

lpbuf进行的,当我们设置LPADDR.lpbuf后,其内容会被LP11以很快的速度(超过CPU存放速度)存放

在其内部的缓存区域内。当LP11无法再接收数据时,会将DONE标记复位,此时,不应再向LP11发送数据。

当LP11收到足够多的数据后(也许是达到一整行的内容后),会启动打印操作。操作结束后,会通过中断

矢量200进入中断处理程序lpint。

2 LP11驱动程序

了解了LP11的工作方式之后,其驱动程序就很容易理解了。

其open和close代码都非常简单,在这里不再多解释了。唯一需要注意的是open时对“OPEN”flag的检查和设置,

这些代码实现了unix v6对LP11设备的互斥访问。

下面,我们来看一下其打印(write)过程。前面说过,write会通过writei函数调用到设备的实际write函数,对

LP11来说,是lpwrite。

8870: lpwrite()

8871: {

8872:     register int c;

8873:

8874:     while ((c=cpass())>=0)     //从用户空间内取要打印的数据

8875:         lpcanon(c);           //简单起见,我们暂时将其看作一个lpoutput调用

8876: }

8986: lpoutput(c)

8987: {

8988:     if (lp11.cc >= LPHWAT)     //lp11起到clist的作用,cc为字符缓冲区内的char的数量。

8989:          sleep(&lp11, LPPRI);   //最多存放LPHWAT个,否则睡眠

8990:     putc(c, &lp11);             //向字符缓冲区放置char

8991:     spl4();

8992:     lpstart();                   //启动真正的LP11驱动程序lpstart

8993:     spl0();

8994: }

lpstart非常简单,即在DONE标记置位时,从字符缓冲区取字符发送给LP11设备。

8967: lpstart()

8968: {

8969:      register int c;

8970:

8971:      while (LPADDR->lpsr&DONE && (c = getc(&lp11)) >= 0)

8972:              LPADDR->lpbuf = c;

8973: }

中断处理程序lpint也非常简单,如下所示:

8976: lpint()

8977: {

8978:     register int c;

8979:

8980:     lpstart();

8981:     if (lp11.cc == LPLWAT || lp11.cc == 0)

8982:           wakeup(&lp11);

8983: }

lpcanon是LP11驱动程序中最长的一个,莱昂对其有详细的讲解,再次不再赘述。

博客地址:http://blog.csdn.net/cszhao1980

博客专栏地址:http://blog.csdn.net/column/details/lions-unix.html

(莱昂氏unix源代码分析导读-50)LP11行式打印机的更多相关文章

  1. (莱昂氏unix源代码分析导读-49) 字符缓冲区

    by cszhao1980 同块设备一样,对字符设备的输入输出也是通过缓冲区来进行的.使用缓冲区有个额外 的好处,即以缓冲区为界,函数可分为高低两个层次.低层函数负责与实际设备交互, 而高层函数只与缓 ...

  2. Hadoop源代码分析

    http://wenku.baidu.com/link?url=R-QoZXhc918qoO0BX6eXI9_uPU75whF62vFFUBIR-7c5XAYUVxDRX5Rs6QZR9hrBnUdM ...

  3. Hadoop源代码分析(完整版)

    Hadoop源代码分析(一) 关键字: 分布式云计算 Google的核心竞争技术是它的计算平台.Google的大牛们用了下面5篇文章,介绍了它们的计算设施. GoogleCluster:http:// ...

  4. hostapd源代码分析(二):hostapd的工作机制

    [转]hostapd源代码分析(二):hostapd的工作机制 原文链接:http://blog.csdn.net/qq_21949217/article/details/46004433 在我的上一 ...

  5. Android系统进程Zygote启动过程的源代码分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6768304 在Android系统中,所有的应用 ...

  6. Android系统匿名共享内存Ashmem(Anonymous Shared Memory)驱动程序源代码分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6664554 在上一文章Android系统匿名共 ...

  7. Android应用Activity、Dialog、PopWindow、Toast窗体加入机制及源代码分析

    [工匠若水 http://blog.csdn.net/yanbober 转载烦请注明出处.尊重劳动成果] 1 背景 之所以写这一篇博客的原因是由于之前有写过一篇<Android应用setCont ...

  8. UiAutomator喷射事件的源代码分析

    上一篇文章<UiAutomator源代码分析之UiAutomatorBridge框架>中我们把UiAutomatorBridge以及它相关的类进行的描写叙述,往下我们会尝试依据两个实例将这 ...

  9. 新秀nginx源代码分析数据结构篇(四)红黑树ngx_rbtree_t

    新秀nginx源代码分析数据结构篇(四)红黑树ngx_rbtree_t Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csd ...

随机推荐

  1. BZOJ 1030 文本生成器

    很老的题目了,很早以前学AC自动机的时候就A过一次 今天算是复习啦 我们可以把问题转化成一个给定字符串都没出现的字符串有多少个 我们建立AC自动机,设dp[i][j]表示走了i步当前在j节点上 在DP ...

  2. [itint5]判断是否为二叉搜索树

    http://www.itint5.com/oj/#25 这题在leetcode上是用中序遍历来做的,但是这里由于有相等的情况,即左子树小于等于根,这样中序遍历无法完全判定.可以用递归来做,用递归给出 ...

  3. MVC @Html.DropDownListFor 默认值

    今天在做MVC 的 @Html.DropDownListFor  的时候,本来数据库中读取到的值是HK,但是 @Html.DropDownListFor的起始默认值始终是“请选择国家”,搞了一个下午, ...

  4. DVB系统中PCR的生成和PCR校正

    http://blog.csdn.net/chenliangming/article/details/3616720 引自<广播电视信息>2008年1月 从数字电视前端系统功能上来讲,传统 ...

  5. [Unity菜鸟] Unity Web Player 相关问题 (待完善)

    1. 发布网页版Unity自适应网页大小 发布网页版,Unity3D自适应网页大小.这个问题困扰了我很长时间,今天终于把他解决了,给大家分享一下. 这里用Uinty4.0发布网页版,我去掉了里面的标题 ...

  6. 使用QGridLayout布局实现翻页效果

    http://blog.csdn.net/u013704336/article/details/51474942

  7. VC++的文件格式详解

    .APS:存放二进制资源的中间文件,VC把当前资源文件转换成二进制格式,并存放在APS文件中,以加快资源装载速度.资源辅助文件. .BMP:位图资源文件. .BSC:浏览信息文件,由浏览信息维护工具( ...

  8. R语言学习笔记:取数据子集

    上文介绍了,如何生成序列,本文介绍一下如何取出其数据子集 取出元素的逻辑值 > x<-c(0,-3,4,-1,45,90,5) > x>0 [1] FALSE FALSE  T ...

  9. CSS那些事儿-阅读随笔3(清除浮动)

    浮动主要是由浮动(float)属性导致的页面错位现象,清除浮动不仅能解决页面错位的现象,还可以解决子元素浮动导致父元素背景无法自适应子元素高度的问题.在CSS样式中,主要利用clear属性中的both ...

  10. 设计模式 - observer

    简单来讲,就是observer依赖于subject,当subject发生变化时,observer得到通知,并将状态与subject同步,常来用于维护对象间状态的一致性. observer的工作过程大体 ...