首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在FINTEK F81866A芯片组上编程GPIO引脚

在FINTEK F81866A芯片组上编程GPIO引脚
EN

Stack Overflow用户
提问于 2018-10-05 17:17:01
回答 2查看 2.7K关注 0票数 4

我有一个Cincoze DE-1000工业PC,它的特点是一个芬泰克F81866A芯片组。我必须管理DIO引脚读取输入从一个电话按钮和设置/关闭一个LED。我有C++编程方面的经验,但不具备低/硬件水平。

在PC附带的文档中,有以下C代码:

代码语言:javascript
复制
#define AddrPort 0x4E
#define DataPort 0x4F

//<Enter the Extended Function Mode>
WriteByte(AddrPort, 0x87)
WriteByte(AddrPort, 0x87) //Must write twice to entering Extended mode

//<Select Logic Device>
WriteByte(AddrPort, 0x07)
WriteByte(DataPort, 0x06)
//Select logic device 06h

//<Input Mode Selection> //Set GP74 to GP77 input mode
WriteByte(AddrPort, 0x80) //Select configuration register 80h
WriteByte(DataPort, 0x0X)
//Set (bit 4~7) = 0 to select GP 74~77 as Input mode.

//<input Value>
WriteByte(AddrPort, 0x82) // Select configuration register 82h
ReadByte(DataPort, Value) // Read bit 4~7(0xFx)= GP74 ~77 as High.

//<Leave the Extended Function Mode>
WriteByte(AddrPort, 0xAA)

据我所知,上面的代码应该读取四个输入PIN的值(因此它应该为每个PIN读取一个),但是我真的很难理解它是如何工作的。我已经理解了逻辑(选择一个地址并为它读写一个十六进制值),但我不知道WriteByte()ReadByte()是什么样的C指令。而且,我也不明白行中的Value是从哪里来的ReadByte(DataPort, Value)。它应该一起读取4个PIN,所以它应该是某种“字节”类型,它应该在其第4-7位中包含1,但我仍然不能真正理解这一行的含义。

我找到了一个类似芯片的答案,但它并没有帮助我理解。

请给我建议或指给我一些相关的文件。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-05 21:42:55

该芯片看起来像一个相当典型的控制器,它基本上是集线器,所有的“慢速”外围设备组合成一个单一的芯片组。

Coreboot有一个关于如何访问超级I/O的wiki页面。

在PC机体系结构上,采用专用的inout指令来实现端口I/O。这些是特权指令,只能从内核模式驱动程序(Ring 0)或被授予I/O权限的用户空间进程中使用。

幸运的是,这在Linux中很容易实现。看看和朋友

您可以使用ioperm(2)或者iopl(2)告诉内核允许用户空间应用程序访问有关的I/O端口。如果不这样做,将导致应用程序接收分段错误。

因此,我们可以将您的功能调整到这样的Linux环境中:

代码语言:javascript
复制
/* Untested: Use at your own risk! */
#include <sys/io.h>
#include <stdio.h>

#define ReadByte(port)          inb(port)
#define WriteByte(port, val)    outb(val, port)

int main(void)
{
    if (iopl(3) < 0) {
        fprintf(stderr, "Failed to get I/O privileges (are you root?)\n");
        return 2;
    }


    /* Your code using ReadByte / WriteByte here */
}

警告

在使用这种方法直接与超级IO对话时,您应该非常小心,因为您的操作系统几乎肯定有设备驱动程序也在与芯片对话。

实现这一目标的正确方法是编写一个与其他内核代码适当协调的设备驱动程序,以避免对设备的并发访问。

Linux内核至少提供了一些超级I/O设备的GPIO访问;将其中一个设备移植到您的平台应该很简单。见这个对IT87xx芯片组的拉请求

票数 6
EN

Stack Overflow用户

发布于 2018-10-05 21:14:34

WriteByte()ReadByte()不是C语言的一部分。从外观上看,它们是用于操作系统内核端口IO的某种形式的系统调用的占位符的函数(而不是按照此答案的前一个版本直接执行内存映射IO的宏)。

这些功能的原型将遵循以下内容:

代码语言:javascript
复制
#include <stdint.h>
void WriteByte(unsigned port, uint8_t value);
void ReadByte(unsigned port, uint8_t *value);

因此,Value变量将是指向8位无符号整数的指针(也可以使用unsigned char),如下所示:

代码语言:javascript
复制
uint8_t realValue;
uint8_t *Value = &realValue;

当然,让Value成为一个uint8_t并拥有ReadByte(DataPort, &Value)就更有意义了。但是,示例代码也没有任何分号,因此可能从未真正运行过任何分号。无论哪种方式,这都是Value包含您要寻找的数据的方式。

我还在这里找到了一些关于寄存器的更多文档- https://www.electronicsdatasheets.com/download/534cf560e34e2406135f469d.pdf?format=pdf

希望这能有所帮助。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52670521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档