linux标准i o实例,9.3. 一个 I/O 端口例子

## 9.3. 一个 I/O 端口例子

我们用来展示一个设备驱动内的端口 I/O 的例子代码, 操作通用的数字 I/O 端口; 这样的端口在大部分计算机系统中找到.

一个数字 I/O 端口, 在它的大部分的普通的化身中, 是一个字节宽的 I/O 位置, 或者内存映射的或者端口映射的. 当你写一个值到一个输出位置, 在输出管脚上见到的电信号根据写入的单个位而改变. 当你从一个输入位置读取一个值, 输入管脚上所见的当前逻辑电平作为单个位的值被返回.

这样的 I/O 端口的实际实现和软件接口各个系统不同. 大部分时间, I/O 管脚由 2 个 I/O 位置控制: 一个允许选择使用那些位作为输入, 哪些位作为输出, 以及一个可以实际读或写逻辑电平的. 有时, 但是, 事情可能更简单, 并且这些位是硬连线为输入或输出(但是, 在这个情况下, 它们不再是所谓的"通用 I/O"); 在所有个人计算机上出现的并口是这样一个非通用 I/O 端口. 任一方式, I/O 管脚对我们马上介绍的例子代码是可用的.

### 9.3.1. 并口纵览

因为我们期望大部分读者以所谓的"个人计算机"的形式使用一个 x86 平台, 我们觉得值得解释一下 PC 并口如何设计的. 并口是在个人计算机上运行数字 I/O 例子代码的外设接口选择. 尽管大部分读者可能有并口规范用, 为你的方便, 我们在这里总结一下它们.

并口, 在它的最小配置中 ( 我们浏览一下 ECP 和 EPP 模式) 由 3 个 8-位端口组成. PC 标准在 0x378 开始第一个并口的 I/O 端口并且第 2 个在 0x278. 第一个端口是一个双向数据寄存器; 它直接连接到物理连接器的管脚 2 - 9. 第 2 个端口是一个只读状态寄存器; 当并口为打印机使用, 这个寄存器报告打印机状态的几个方面, 例如正在线, 缺纸, 或者忙. 第 3 个端口是一个只出控制寄存器, 它, 在其他东西中, 控制是否中断使能.

并口通讯中使用的信号电平是标准的 TTL 电平: 0 和 5 伏特, 逻辑门限在大概 1.2 伏特. 你可依靠端口至少符合标准 TTL LS 电流规格, 尽管大部分现代并口在电流和电压额定值都工作的好.

并口连接器和计算机内部电路不隔离, 当你想直接连接逻辑门到这个端口是有用的. 但是你不得不小心地正确连接线; 并口电路当你使用你自己的定制电路时容易损坏, 除非你给你的电路增加绝缘. 你可以选择使用插座并口如果你害怕会损坏你的主板.

位的规范在图 [并口的管脚](# "图 9.1. 并口的管脚") 中概述. 你可以存取 12 个输出位和 5 个输入位, 有些是在它们地信号路径上逻辑地翻转了. 唯一的没有关联信号管脚的位是端口 2 的位 4 (0x10), 它使能来自并口的中断. 我们使用这个位作为我们的在第 10 章中的中断处理的实现的一部分.

**图 9.1. 并口的管脚**

![并口的管脚](https://box.kancloud.cn/2015-09-02_55e6d9e7caeb8.png)

### 9.3.2. 一个例子驱动

我们介绍的驱动称为 short (Simple Hardware Operations and Raw Tests). 所有它做的是读和写几个 8-位 端口, 从你在加载时选择的开始. 缺省地, 它使用分配给 PC 并口的端口范围. 每个设备节点(有一个独特的次编号)存取一个不同的端口. short 驱动不做任何有用的事情; 它只是隔离来作为操作端口的单个指令给外部使用. 如果你习惯端口 I/O, 你可以使用 short 来熟悉它; 你能够测量它花费来通过端口传送数据的时间或者其他游戏的时间.

为 short 在你的系统上运行, 必须有存取底层硬件设备的自由(缺省地, 并口); 因此, 不能有其他驱动已经分配了它. 大部分现代发布设置并口驱动作为只在需要时加载的模块, 因此对 I/O 地址的竞争常常不是个问题. 如果, 但是, 你从 short 得到一个"无法获得 I/O 地址" 错误(在控制台上或者在系统 log 文件), 一些其他的驱动可能已经获得这个端口. 一个快速浏览 /proc/ioports 常常告诉你哪个驱动在捣乱. 同样的告诫应用于另外 I/O 设备如果你没有在使用并口.

从现在开始, 我们只是用"并口"来简化讨论. 但是, 你能够设置基本的模块参数在加载时来重定向 short 到其他 I/O 设备. 这个特性允许例子代码在任何 Linux 平台上运行, 这里你对一个数字 I/O 接口有权限通过 outb 和 inb 存取( 尽管实际的硬件是内存映射的, 除 x86 外的所有平台). 后面, 在"使用 I/O 内存"的一节, 我们展示 short 如何用来使用通用的内存映射数字 I/O.

为观察在并口上发生了什么以及如果你有使用硬件的爱好, 你可以焊接尽管 LED 到输出管脚. 每个 LED 应当串连一个 1-K 电阻导向一个地引脚(除非, 当然, 你的 LED 有内嵌的电阻). 如果你连接一个输出引脚到一个输入管脚, 你会产生你自己的输入能够从输入端口读到.

注意, 你无法只连接一个打印机到并口并且看到数据发向 short. 这个驱动实现简单的对 I/O 端口的存取, 并且没有进行与打印机需要的来操作数据的握手; 在下一章, 我们展示了一个例子驱动(称为 shortprint ), 它能够驱动并口打印机; 这个驱动使用中断, 但是, 因此我们还是不能到这一点.

如果你要查看并口数据通过焊接 LED 到一个 D-型 连接器, 我们建议你不要使用管脚 9 和管脚 10, 因为我们之后连接它们在一起来运行第 10 章展示的例子代码.

只考虑到 short, /dev/short0 写到和读自位于 I/O 基地址的 8-bit 端口( 0x378, 除非在加载时间改变). /dev/short1 写到位于基址 + 1 的 8-位, 等等直到基址 + 7.

/dev/short0 进行的实际输出操作是基于使用 outb 的一个紧凑循环. 一个内存屏障指令用来保证输出操作实际发生并且不被优化掉:

~~~

while (count--) {

outb(*(ptr++), port);

wmb();

}

~~~

你可以运行下列命令来点亮你的 LED:

~~~

echo -n "any string" > /dev/short0

~~~

每个 LED 监视一个单个的输出端口位. 记住只有最后写入的字符, 保持稳定在输出管脚上足够长时间你的眼睛能感觉到. 因此, 我们建议你阻止自动插入一个结尾新行, 通过传递一个 -n 选项给 echo.

读是通过一个类似的函数, 围绕 inb 而不是 outb 建立的. 为了从并口读"有意义的"值, 你需要某个硬件连接到连接器的输入管脚来产生信号. 如果没有信号, 你会读到一个相同字节的无结尾的流. 如果你选择从一个输出端口读取, 你极可能得到写到端口的最后的值(这适用于并口和普通使用的其他数字 I/O 电路). 因此, 那些不喜欢拿出他们的烙铁的人可以读取当前的输出值在端口 0x378, 通过运行这样一个命令:

~~~

dd if=/dev/short0 bs=1 count=1 | od -t x1

~~~

为演示所有 I/O 指令的使用, 每个 short 设备有 3 个变形: /dev/short0 进行刚刚展示的循环, /dev/short0p 使用 outb_p 和 inb_p 代替"快速"函数, 并且 /dev/short0s 使用字串指令. 有 8 个这样的设备, 从 short0 到 short7. 尽管 PC 并口只有 3 个端口, 你可能需要它们更多如果使用不同的 I/O 设备来运行你的测试.

short 驱动进行一个非常少的硬件控制, 但是足够来展示如何使用 I/O 端口指令. 感兴趣的读者可能想看看 parpor 和 parport_pc 模块的源码, 来知道这个设备在真实生活中能有多复杂来支持一系列并口上的设备(打印机, 磁带备份, 网络接口)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/561507.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux下如何bash文件,Linux系统的文件管理命令及bash的相关工作特性

一、Linux系统的文件管理命令:1 \pwd:printing working directory2 \cd:change directory cd [/PATH/TO/SOMEDIR/]可带可不带,切换回家目录;注意:bash中~表示家目录;cd ~:切换回自己的家目录&#xff…

2019浙江C语言二级答案,2019年下半年二级C语言试题及答案

机遇总是有的,如果把握不住,不要怨天忧人,原因只是自己不够优秀;不要把时间当垃圾处理,唯有珍惜光阴、努力刷二级C语言试题,才能提升生命的质量。1)若有以下语句:typedef struct S{ int g;char …

c语言鸡兔同笼的程序,C语言:鸡兔同笼问题

鸡兔同笼。已知鸡兔总头数为h(设为30),总脚数为f(设为90),求鸡兔各几只。代码一:#includemain(){int h,f,x,y;printf("请输入总头数和总脚数:");scanf("%d%d",&h,&f);x2*h-f/2;yf/2-h;printf("总头数为%d,总…

c语言成绩管理系统开题报告,学生信息管理系统,开题报告(共篇).doc

学生信息管理系统,开题报告(共篇).doc学生信息管理系统,开题报告(共10篇):开题 信息管理系统 报告 学生 论文开题报告有查重吗 居民信息网络管理系统 学生信息管理系统c语言篇一:学生信息管理系统开题报告毕 业 设 计(论 文)开 题 报 告题目:…

计算机二级c语言填空题答案唯一吗,计算机二级C语言上机填空题及答案.doc

计算机二级C语言上机填空题及答案2、给定程序中,函数fun的功能是建立一个NN的矩阵。 矩阵元素的构成规律是:最外层元素的值全部为1;从外向内第2层元素的值全部为2;第3层元素的值全部为3,…依次类推。例如,若…

C语言字符串倒排,C语言兑现简单的倒排文件索引

C语言实现简单的倒排文件索引inver.h文件#ifndef INVERT_FILE_H#define INVERT_FILE_H#include#includetypedef struct _invertfile_ {unsigned int tablelen;void **table;//unsigned int offset;unsigned int nodecount;}if_t;typedef struct _word_{unsigned int id;unsigne…

c语言 段位,C语言 段位

C语言允许在一个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为“位段”或“位域”在结构体中位段的定义格式为:unsignede :;例如:structbytedata{unsigned a:2; /*位段a,占2位*/unsigned b:6;…

win10定时关机c语言,win10定时关机在哪?win10设置定时关机的三种方法

win10定时关机在哪?很多win10用户可能还不会设置定时关机,下面脚本之家小编就给大家带来win10设置定时关机的三种方法,一起来看看吧!方法一:Win10定时关机命令:shutdown –s –t 3600后面的3600代表秒&…

c语言中ndigit用法,求C语言中头文件及函数的含意的总分类

ALLOC。H 说明内存管理函数(分配、释放等)。ASSERT。H 定义 assert调试宏。BIOS。H 说明调用IBM—PC ROM BIOS子程序的各个函数。CONIO。H 说明调用DOS控制台I/O子程序的各个函数。CTYPE。H 包含有关字符分类及转换的名类信息(如 isalpha和toascii等)。DIR。H 包含有关目录和路…

Android实现自定义相册,在Android Gallery App中创建自定义相册

您可以使用这种方式在Gallery应用中创建相册.该名称显示为“app images”.String path Environment.getExternalStorageDirectory().toString();File dir new File(path, "/appname/media/app images/");if (!dir.isDirectory()) {dir.mkdirs();}File file new Fi…

android 多级分组,android 二级菜单(类似QQ分组)

注意点:1)适配器BaseExpandableListAdapter2)数据源(数组、集合都行)(重点)/*** Created by mb on 2014/11/18.* 二级菜单适配器*/public class MyExpandableListAdapter extends BaseExpandableListAdapter {private Context context;List groups;//String [] grou…

android 清理工具,Android 版 Avira Optimizer 是 Android 手機清理工具

隨著時間推移,應用程式、相片、視訊和音樂會塞滿您的手機或平板電腦,拖慢系統性能。適用於 Android 的 Avira Optimizer 是最佳的 Android 清理工具,其中包括:Smart Booster如需加快開機、優化流程和實現流暢的 Android 設備&…

android编译日志在哪,Android编译环境中的JDK存放位置

this.p{ m:2,b:2,loftPermalink:,id:fks_081066082085084067092086081095080081089075087087,blogTitle:Android编译环境中的JDK存放位置,blogAbstract:因为Ubuntu 10.04已经不带有SUN JDK,所以这个需要到sun网站上下载,并手动安装。所以,这个…

华为鸿蒙系统HarmonyOS手机,华为鸿蒙系统2.0适配哪些机型

华为鸿蒙系统2.0适配机型大部分都是华为手机,那么都有哪些手机适合这个系统呢,用户想要使用鸿蒙系统应该在哪去申请呢,别着急下面我们一起了解吧。华为鸿蒙系统2.0适用机型推荐HarmonyOS 2.0手机开发者Beta公测招募入口:点击进入同…

webstorm 运行android,Windows React Native环境搭建:webstorm+android studio 及解决热更新

工具准备:SDKAndroid SDK Build-tools:23.0.1SDK Platform:Android N 、6.0 、5.1.1、5.0.1、4.4.2、4.1.2Android模拟器镜像:6.0、5.1和4.1python使用 python2nodejs使用官网最新即可更改源:npm config set registry …

android 日期时间类,Android 日期时间等转换工具类

package com.easyder.util;import java.text.SimpleDateFormat;import java.util.Date;/*** 日期时间等转换工具类.** author Administrator**/public class DateTool {/*** long类型的日期时间值转换成MM/dd/yyyy HH:mm:ss格式** param millis* return*/public String getDate…

android内部类broadcastreceiver,android 公开静态内部类BroadcastReceiver

当想实现广播接收功能时,因java 是单继承,所以一般一个类都会extends Activity,所以会想到内部类来extends BroadcastReceiver,这中间可能会出现两种异常1:java.lang.RuntimeException: Unable to instantiatereceiver com.examp…

华为鸿蒙系统使用视频,原生鸿蒙系统,华为WATCH 3上手视频曝光

华为即将在 6 月 2 日发布华为 WATCH 3,而真机图和上手视频已经出现在网络上。华为 WATCH 3 将出厂预装鸿蒙 HarmonyOS,圆形表盘 旋转表冠设计。爆料图和视频都应该都出自华为的线下门店,爆料图展示了华为 WATCH 3 和华为 WATCH 3 Pro 的包装…

在html中怎么写加起来的,css可以在html里面写吗?

css可以在html里面写吗?答案是可以的。那么如何在HTML中写CSS?下面给大家介绍一下。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。下面我们来看一下在HTML中写css的方法:1、内部样式表--在head标签…

广东省2021高考2bi补录成绩查询,重磅!广东省2021年普通高考美术统考成绩1月8日起可查询!...

我省2021年普通高考美术、书法和广播电视编导术科统考工作已全面结束。现就美术、书法和广播电视编导术科统考成绩公布有关事项通知如下:一、成绩公布时间和方式1月8日10:00起,考生可通过省教育考试院官微(ID:gdsksy)小程序和广东教育考试服务…