|
实验目标:
在 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 端口。 |
|