2012-09-11 5 views
1

Fintek F75111 GPIO가있는 원자 보드가 있습니다. 칩에 액세스 할 SMbus 주소가 06EH라는 제조업체 정보가 있습니다.inb() 및 outb()를 사용하여 GPIO 값을 읽고 쓰는 방법

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); 
} 

나는 리눅스 호환 기능 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 포트의 출력 포트 또는 투입 포트 인 경우 설정하기 위해 사용된다.

GPIO의 출력 값은 인덱스 0x11을 사용하여 설정되고 포트가 입력 포트로 작동하면 입력 값을 읽는 데 인덱스 0x12가 사용됩니다.

문제는이 맞다면 내가 모르는 또는 값을 읽는 방법을

나는 실행하면 (읽기 기능을 읽기 전에 뭔가를 출력하는 이유?!?) :

RESPONSE = gpio_read(PORT, DEVICE, X); 

.. 9의 값으로 X를 변경하면 내가 출력으로이 얻을 : 0 0 0 0

수 8 나를 혼란 0 8 8 0 0 ...

+0

결국이 기능이 작동합니까? Aaeon Gene-CVO5 보드를 사용하여 유사한 프로젝트를 진행하고 있습니다. 불행히도 리눅스 지원은 그렇게 강력하지 않습니다. 보드는 Intel 82801G를 i2c 마스터로 사용합니다. lm-sensors sensor-detect program을 사용하면 F75111이 표시되지 않습니다. – user2058980

답변

4

을 대신의 SMBus 포트에 직접 쓰는 오히려 i2c 라이브러리를 사용하고 싶습니다. I2C (및 SMBUS)는 두 개의 포트 핀을 사용하는데 하나는 클럭 용이고 다른 하나는 데이터 용입니다. 데이터가 전송되고 클럭 에지 (동기식)에서 수신되고, 코드를 읽으며, 클럭 또는 데이터 중 어느 것이 액세스되고 있는지 명확하게 볼 수 없습니다.

시작하려면 i2ctools를 시작 지점으로 사용하십시오 (이 사이트 : http://elinux.org/Interfacing_with_I2C_Devices 확인). 이 도구를 사용하면 I2C 버스에 연결된 장치를 마이크로 프로세서에 연결하고 기본 통신을 수행 할 수 있습니다.

도움이 되길 바랍니다 ...