繁体   English   中英

如何使用inb()和outb()读取和写入GPIO值

[英]How to read and write GPIO values with inb() and outb()

我有一个带有Fintek F75111 GPIO的原子板。 我从制造商那里获得信息,访问芯片的SMbus地址是06EH。

我正在尝试读取和写入Linux中的GPIO值。 我有一个为Windows编写的制造商示例程序,看起来像这样。

#include “math.h”
#include “stdio.h”
#include “dos.h”
void main(void){
    int SMB_PORT_AD = 0x400;
    int SMB_DEVICE_ADD = 0x6E;
    /*75111R’s Add=6eh */
    //programming DIO as output //0:input 1:Output
    /* Index 10, GPIO1x Output pin control */
    SMB_Byte_WRITE(SMB_PORT_AD,SMB_DEVICE_ADD,0x10,0xff); delay(10);
    //programming DIO default LOW
    /* Index 11, GPIO1x Output Data value */
    SMB_Byte_WRITE(SMB_PORT_AD,SMB_DEVICE_ADD,0x11,0x00); delay(10);
}


unsigned char SMB_Byte_READ (int SMPORT, int DeviceID, int REG_INDEX)
{
    unsigned char SMB_R;
    outportb(SMPORT+02, 0x00); /* clear */ 
    outportb(SMPORT+00, 0xff); /* clear */ 
    delay(10);
    outportb(SMPORT+04, DeviceID+1); /* clear */ 
    outportb(SMPORT+03, REG_INDEX); /* clear */ 
    outportb(SMPORT+02, 0x48); /* read_byte */ 
    delay(10);
    SMB_R= inportb(SMPORT+05);
    return SMB_R;
}

void SMB_Byte_WRITE(int SMPORT, int DeviceID, int REG_INDEX, int REG_DATA)
{
    outportb(SMPORT+02, 0x00); /* clear */ 
    outportb(SMPORT+00, 0xff); /* clear */
    delay(10);
    outportb(SMPORT+04, DeviceID); /* clear */ 
    outportb(SMPORT+03, REG_INDEX); /* clear */
    outportb(SMPORT+05, REG_DATA); /* read_byte */
    outportb(SMPORT+02, 0x48); /* read_byte */
    delay(10);
}

我试图将其转换为Linux兼容函数inb()和outb(),这就是我所得到的。

#include <stdio.h>
#include <sys/io.h>

unsigned int gpio_read(int PORT, int DEVICE, int REG_INDEX){
    unsigned int RESPONSE;

    outb(0x00, PORT+02);
    outb(0xff, PORT+00);
    usleep(100);
    outb(DEVICE+1, PORT+04);
    outb(REG_INDEX, PORT+03);
    outb(0x48, PORT+02);
    usleep(100);
    RESPONSE = inb(PORT+05);
    return RESPONSE;
}

unsigned int gpio_write(int PORT, int DEVICE, int REG_INDEX, int REG_DATA){
    outb(0x00, PORT+02);
    outb(0xff, PORT+00);
    usleep(100);
    outb(DEVICE, PORT+04);
    outb(REG_INDEX, PORT+03);
    outb(DATA, PORT+05);
    outb(0x48, PORT+02);
    usleep(100);

}

void main() {
    int PORT = 0x400;
    int DEVICE = 0x6E;
    unsigned int RESPONSE;

    // Ask access to port from kernel
    ioperm(0x400, 100, 1);

    // GPIO1x set to input (0xff is output)
    gpio_write(PORT, DEVICE, 0x10, 0x00);

        RESPONSE = gpio_read(PORT, DEVICE, 1);
        printf("\n %u \n", RESPONSE);
}

GPIO1X索引0x10用于设置连接到GPIO1x的8个GPIO端口是输出端口还是输入端口。

使用索引0x11设置GPIO的输出值,如果端口用作输入端口,则索引0x12用于读取输入值。

问题是我不知道这是否正确或如何读取值(为什么读取函数在读取之前会输出一些东西?!?)

当我跑:

RESPONSE = gpio_read(PORT, DEVICE, X);

使用1..9的值更改X我将其作为输出:0 8 8 0 0 0 0 0 0

8号让我困惑......

我宁愿使用i2c库,而不是直接写入SMBus端口。 I2C(和SMBUS)使用两个端口引脚,一个用于时钟,一个用于数据。 数据在时钟边沿(同步)进行传输和接收,读取代码,我无法清楚地看到它们中的哪一个(时钟或数据)被访问以及何时被访问。

首先,我将使用i2ctools作为起点(查看此站点: http ://elinux.org/Interfacing_with_I2C_Devices)。 此工具可帮助您查找连接到I2C总线的设备到您的微处理器,并执行基本的通信。

希望能帮助到你...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM