曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 9196|回复: 0
打印 上一主题 下一主题

/dev/port 设备文件简单测试并口

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34397
跳转到指定楼层
楼主
发表于 2009-8-10 17:01:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
实验目标
在 PC 机上的并口延长线上接一 LED ,通过使用 /dev/port 设备文件控制 LED 闪动。

实验步骤

1、在 BIOS 里把并口模式改为 SPP


SPP ( Sequenced Packed Protocol ,序列分组协议 ) 是标准模式,它与 EPP 和 ECP 不同,是早期定义的规范 ( Centronic ) ,其结构简单且各 PC 类型都可支持。这里,打印机接口地址为 0x378 ,中断号为 7。
( EPP/ECP < Enhanced Parallel Port/Enhanced Capability Port > 是计算机与设备之间的双向并行通信规范,提供比 SPP 并行信号传送更快的数据通信速度。EPP 用于除了打印机以外的设备,而 ECP 是用于打印机和扫描仪。 )

打印机并口有 25 个引脚,其中有 17 条信号线和 8 条地线。8 条地线为 18~25 。信号线中有 4 条控制线条 ( Control Line)、5 条状态线 ( Status Line )、8条数据线 ( Data Line )。控制线用于 PC 机向打印机的连接和握手信号,状态线是用于反映打印机的状态,数据线是用于 PC 机向打印机发送数据。有 3 个与控制打印机相关的寄存器,其地址位于 PC 的 I/O 地址列表内。一般打印机的端口地址为 0x378, 0x379, 0x37A 。只要向对应的寄存器写入数据,其硬件将输出相反的内容。相反,施加到硬件的信号也可以通过寄存器获取。

0x378 控制的引脚为 2~9 (data0~data7),方向为输出。

0x379 控制第 11 脚(busy),方向为输出 ,bit-7;引脚 10,方向为输入 (acknowledge), bit6 ;引脚 12 方向为输入(out of paper),bit-5;引脚13,方向为输入(select), bit-4;引脚15,方向为输入, 比(error),bit-3;bit0~bit2 不用。

0x37A 的 bit5~bit7 未用;bit-4 为 IRQ 控制使能;bit-3 控制引脚 17 (select input 的反向输出),方向为输出;bit-2 控制引脚 16 (init),方向为输出;bit-1控制引脚 14 (auto feed 的反向输出),方向为输出;bit-0 控制引脚 1 (strobe 选通),方向为输出。

2、测试程序
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
    int fd;
    int lp;
   
    unsigned char buff [128];
   
    fd = open("/dev/port", O_RDWR);
    if (fd < 0) {
        perror("/dev/port open error");
        exit(1);
    }

    for (lp = 0; lp < 10; lp++) {
        lseek(fd, 0x378, SEEK_SET);
        buff [0] = 0xFF;
        write(fd, buff, 1);
        sleep(1);
        lseek(fd, 0x378, SEEK_SET);
        buff [0] = 0x00;
        write(fd, buff, 1);
        sleep(1);
    }
    close (1);
   
    return 0;
}

3、运行效果

LED 灯会以 2 秒的时间间隔闪烁。

4、说明
大开 /dev/port 设备文件仍用底层 open() 函数大开。如果正常打开设备后文件,则通过 lseek() 函数把地址指定为文件端口值。这也是 /dev/port 设备文件的设备驱动程序的特征。然而,并不是说所有的设备文件的驱动程序都具有这样的特征。在 lseek() 函数执行后,文件端口的位置就被指定为 0x378。lseek() 的第三个参数 SEEK_SET 表明直接转向文件端口值 0x378。

/dev/port 设备文件可以使应用程序直接接触系统的 I/O 端口。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-6-18 17:42 , Processed in 0.079519 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表