(莱昂氏unix源代码分析导读-50)LP11行式打印机
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行式打印机的更多相关文章
- (莱昂氏unix源代码分析导读-49) 字符缓冲区
by cszhao1980 同块设备一样,对字符设备的输入输出也是通过缓冲区来进行的.使用缓冲区有个额外 的好处,即以缓冲区为界,函数可分为高低两个层次.低层函数负责与实际设备交互, 而高层函数只与缓 ...
- Hadoop源代码分析
http://wenku.baidu.com/link?url=R-QoZXhc918qoO0BX6eXI9_uPU75whF62vFFUBIR-7c5XAYUVxDRX5Rs6QZR9hrBnUdM ...
- Hadoop源代码分析(完整版)
Hadoop源代码分析(一) 关键字: 分布式云计算 Google的核心竞争技术是它的计算平台.Google的大牛们用了下面5篇文章,介绍了它们的计算设施. GoogleCluster:http:// ...
- hostapd源代码分析(二):hostapd的工作机制
[转]hostapd源代码分析(二):hostapd的工作机制 原文链接:http://blog.csdn.net/qq_21949217/article/details/46004433 在我的上一 ...
- Android系统进程Zygote启动过程的源代码分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6768304 在Android系统中,所有的应用 ...
- Android系统匿名共享内存Ashmem(Anonymous Shared Memory)驱动程序源代码分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6664554 在上一文章Android系统匿名共 ...
- Android应用Activity、Dialog、PopWindow、Toast窗体加入机制及源代码分析
[工匠若水 http://blog.csdn.net/yanbober 转载烦请注明出处.尊重劳动成果] 1 背景 之所以写这一篇博客的原因是由于之前有写过一篇<Android应用setCont ...
- UiAutomator喷射事件的源代码分析
上一篇文章<UiAutomator源代码分析之UiAutomatorBridge框架>中我们把UiAutomatorBridge以及它相关的类进行的描写叙述,往下我们会尝试依据两个实例将这 ...
- 新秀nginx源代码分析数据结构篇(四)红黑树ngx_rbtree_t
新秀nginx源代码分析数据结构篇(四)红黑树ngx_rbtree_t Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csd ...
随机推荐
- AC题目简解-数据结构
A - Japan POJ 3067 要两条路有交叉,(x1,y1)(x2,y2)那么需要满足:(x1-x2)*(y1-y2)<0判断出这是求逆序的问题 树状数组求逆序,先通过自定义的比较器实 ...
- POJ1061——青蛙的约会(扩展欧几里德)
青蛙的约会 Description两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件 ...
- 安装Hadoop系列 — 安装Hadoop
安装步骤如下: 1)下载hadoop:hadoop-1.0.3 http://archive.apache.org/dist/hadoop/core/hadoop-1.0.3/ 2)解压文 ...
- C++重载输入和输出操作符以及IO标准库中的刷新输入缓冲区残留字符问题
今天在做C++ Primer习题的14.11时,印象中应该挺简单的一题,结果却费了很长时间. 类定义: typedef string Date; class CheckoutRecord{ publi ...
- 学习Java Web开发
学习DreamWaveMX中文版的网页设计技术 HTML网页设计,这是最基本的.学习XML的一些基本知识.初步掌握一些JSCRIPT的应用. 学习JAVA语言. 这应该分成2次来进行: 第1次找一本国 ...
- [转]Linux下Nagios的安装与配置
转自:http://blog.chinaunix.net/uid-29539073-id-4149856.html 月色书香 一.Nagios简介 Nagios是一款开源的电脑系统和网络监视工具,能有 ...
- bzoj1003: [ZJOI2006]物流运输
dp+最短路.暴力枚举就可以了.O(n3logn).样例中m=n然后测样例过了.然后 54行习惯性的dis[n]然后就WA了!!!. #include<cstdio> #include&l ...
- Cookie设置HttpOnly,Secure,Expire属性
在eclipese中创建Web工程时,有个dynamic web module version选项,首先解释下这个选项的意思: http://stackoverflow.com/questions/3 ...
- POJ 1637 Sightseeing tour ★混合图欧拉回路
[题目大意]混合图欧拉回路(1 <= N <= 200, 1 <= M <= 1000) [建模方法] 把该图的无向边随便定向,计算每个点的入度和出度.如果有某个点出入度之差为 ...
- Spring中使用quartz插件实现定时任务
第一步:导入架包 *spring3.2.3版本的架包将spring的各个功能模块给分开了,我们必须将Spring必须依赖的包导入上去 第二步:编写配置文件 <?xml version=" ...