Linux kernel 如何访问PCI打印机卡的I/O位?

Linux kernel 如何访问PCI打印机卡的I/O位?,linux-kernel,linux-device-driver,parallel-port,pci-bus,Linux Kernel,Linux Device Driver,Parallel Port,Pci Bus,以前,在我电脑的P4主板上有一个集成的并行打印机端口,带有DB-25接口。这些I/O引脚非常便于与外部数字设备通信。 我可以使用这些I/O引脚从Linux下的C程序控制外部硬件,因为: 我知道0x378或0x278上的I/O映射,我使用ioperm(0x378,2,1)函数授予在Linux下直接访问的权限。 之后,我可以使用outb(数据,0x378),inb(0x378+1)函数(带有#include)进行简单的读写。(我使用root权限或setuid权限运行它) 但现在我有一个较新的主板GA

以前,在我电脑的P4主板上有一个集成的并行打印机端口,带有DB-25接口。这些I/O引脚非常便于与外部数字设备通信。 我可以使用这些I/O引脚从Linux下的C程序控制外部硬件,因为:

我知道0x378或0x278上的I/O映射,我使用
ioperm(0x378,2,1)
函数授予在Linux下直接访问的权限。 之后,我可以使用
outb(数据,0x378)
inb(0x378+1)
函数(带有#include)进行简单的读写。(我使用root权限或setuid权限运行它)

但现在我有一个较新的主板GA-870A-USB3,没有任何并行端口。 我买了一个并行PCI卡,看起来像是在图片上。 由于主板的原因,我不得不选择PCI接口(我认为使用ISA总线不会有任何问题,但今天主板上没有ISA总线)

在Linux下,我可以用与上面相同的方式从我的C程序访问此PCI打印机卡上的DB-25引脚吗?或者我如何使用此卡的I/O引脚?(最好的比特转换速度约为.5-1毫秒。使用默认并行端口(0x378)上的旧P4主板可以轻松执行此比特率。尽管我的硬件通信协议对比特率不敏感。)

10月5日继续。
我拔掉了上面的PCI I/O卡,我意识到这条线
03:06.0串行控制器:TXIC装置5073(第10版)

与我的卡相关。
以下是详细清单:

lspci -vvvxxxs 03:06.0
03:06.0 Serial controller: TXIC Device 5073 (rev 10) (prog-if 02 [16550])
Subsystem: TXIC Device 3273
Control: I/O+ Mem- BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
Status: Cap- 66MHz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
Interrupt: pin A routed to IRQ 20
NUMA node: 0
Region 0: I/O ports at cf00 [size=8]
Region 1: I/O ports at ce00 [size=8]
Region 2: I/O ports at cd00 [size=8]
Region 3: I/O ports at cc00 [size=8]
Kernel driver in use: serial
00: 51 46 73 50 01 00 00 02 10 02 00 07 00 00 00 00
10: 01 cf 00 00 01 ce 00 00 01 cd 00 00 01 cc 00 00
20: 00 00 00 00 00 00 00 00 00 00 00 00 51 46 73 32
30: 00 00 00 00 00 00 00 00 00 00 00 00 03 01 00 00
40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
80: 51 46 73 50 01 00 00 02 10 02 00 07 00 00 00 00
90: 01 cf 00 00 01 ce 00 00 01 cd 00 00 01 cc 00 00
a0: 00 00 00 00 00 00 00 00 00 00 00 00 51 46 73 32
b0: 00 00 00 00 00 00 00 00 00 00 00 00 03 01 00 00
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
lspci-vvxxss 03:06.0
03:06.0串行控制器:TXIC装置5073(第10版)(prog if 02[16550])
子系统:TXC设备3273
控制:I/O+Mem-BusMaster-SPECCYLE-MemWINV-VGASnoop-ParErr-Stepping-SERR-FASTBB-DISITX-

状态:Cap-66MHz-UDF-fastbb-ParErr-DEVSEL=medium>TAbort-也许可以查看
/proc/iomem
以获取内存映射并使用这些系统调用?除非您有非常严格的计时要求,否则您可以使用
/dev/parport*
直接读取和写入数据管脚,如果需要访问其他PIN,可能需要使用
ioctl()
语句。主要问题是您必须执行系统调用,我无法告诉您是否将保持在10µs以内,但您可以测量此值。使用
lspci
获取有关卡的信息。PCI比ISA复杂得多。如果它没有出现在lspci中,那么就无法确定它将响应什么地址。地址由ISA上的跳线固定或设置。在PCI上,它们通常在引导时由固件分配。