soloforce 发表于 2013-5-20 12:11:19

Python GPIO库:用C直接操作GPIO

本帖最后由 soloforce 于 2013-5-20 12:13 编辑

在hipboi的这个帖子http://forum.cubietech.com/forum.php?mod=viewthread&tid=456,我们可以用Python GPIO里面的GPIO C库文件直接编写应用程序了。下面是读和写的两个例子。

读GPIO:本例读取PD8的值,并打印提示信息#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <signal.h>

#include "gpio_lib.h"
#define PD0    SUNXI_GPD(0)
#define PD1    SUNXI_GPD(1)
#define PD2    SUNXI_GPD(2)
#define PD3    SUNXI_GPD(3)
#define PD4    SUNXI_GPD(4)
#define PD5    SUNXI_GPD(5)
#define PD6    SUNXI_GPD(6)
#define PD7    SUNXI_GPD(7)
#define PD8    SUNXI_GPD(8)
#define PD9    SUNXI_GPD(9)
#define PD10    SUNXI_GPD(10)
#define PD11    SUNXI_GPD(11)
#define PD12    SUNXI_GPD(12)
#define PD13    SUNXI_GPD(13)
#define PD14    SUNXI_GPD(14)
#define PD15    SUNXI_GPD(15)
#define PD16    SUNXI_GPD(16)
#define PD17    SUNXI_GPD(17)
#define PD18    SUNXI_GPD(18)
#define PD19    SUNXI_GPD(19)
#define PD20    SUNXI_GPD(20)
#define PD21    SUNXI_GPD(21)
#define PD22    SUNXI_GPD(22)
#define PD23    SUNXI_GPD(23)
#define PD24    SUNXI_GPD(24)
#define PD25    SUNXI_GPD(25)
#define PD26    SUNXI_GPD(26)
#define PD27    SUNXI_GPD(27)

#define MISO    SUNXI_GPE(3)
#define MOSI    SUNXI_GPE(2)
#define SCK   SUNXI_GPE(1)
#define CS      SUNXI_GPE(0)

struct sigaction new_act,new_act2, old_act;

/**
* @brief Signal INT handler
* */
void sigint_handler(int sig_num)
{
    printf("Uninitialzing GPIO...\n");

    /* uninitialize the GPIO */
    sunxi_gpio_cleanup();

    /* change back to the original handler */
    sigaction(SIGINT, &old_act,NULL);

    /* emit the SIGINT again */
    kill(0,SIGINT);
}

/**
* @brief Signal TERM handler
* */
void sigterm_handler(int sig_num)
{
    printf("Uninitialzing GPIO...\n");

    /* uninitialize the GPIO */
    sunxi_gpio_cleanup();

    /* change back to the original handler */
    sigaction(SIGTERM, &old_act,NULL);

    /* emit the SIGTERM again */
    kill(0,SIGTERM);
}

int main()
{

    memset(&new_act,0,sizeof(new_act));
    memset(&new_act2,0,sizeof(new_act));
    memset(&old_act,0,sizeof(old_act));
    new_act.sa_handler=&sigint_handler;
    new_act2.sa_handler=&sigterm_handler;
    sigaction(SIGINT, &new_act, &old_act);
    sigaction(SIGTERM, &new_act2, &old_act);


    if(SETUP_OK!=sunxi_gpio_init()){
      printf("Failed to initialize GPIO\n");
      return -1;
    }

    if(SETUP_OK!=sunxi_gpio_set_cfgpin(PD8,INPUT)){
      printf("Failed to config GPIO pin\n");
      return -1;
    }

    while(1){
      if(HIGH==sunxi_gpio_input(PD8)){
            printf("HIGH\n");
      }
      usleep(1000);
    }

    sunxi_gpio_cleanup();

   
    return 0;
   
}

本例写PD16脚,如果上面接了一个led,且负极接地,则会周期闪烁。#include <stdlib.h>
#include <stdio.h>

#include "gpio_lib.h"
#define PD0    SUNXI_GPD(0)
#define PD1    SUNXI_GPD(1)
#define PD2    SUNXI_GPD(2)
#define PD3    SUNXI_GPD(3)
#define PD4    SUNXI_GPD(4)
#define PD5    SUNXI_GPD(5)
#define PD6    SUNXI_GPD(6)
#define PD7    SUNXI_GPD(7)
#define PD8    SUNXI_GPD(8)
#define PD9    SUNXI_GPD(9)
#define PD10    SUNXI_GPD(10)
#define PD11    SUNXI_GPD(11)
#define PD12    SUNXI_GPD(12)
#define PD13    SUNXI_GPD(13)
#define PD14    SUNXI_GPD(14)
#define PD15    SUNXI_GPD(15)
#define PD16    SUNXI_GPD(16)
#define PD17    SUNXI_GPD(17)
#define PD18    SUNXI_GPD(18)
#define PD19    SUNXI_GPD(19)
#define PD20    SUNXI_GPD(20)
#define PD21    SUNXI_GPD(21)
#define PD22    SUNXI_GPD(22)
#define PD23    SUNXI_GPD(23)
#define PD24    SUNXI_GPD(24)
#define PD25    SUNXI_GPD(25)
#define PD26    SUNXI_GPD(26)
#define PD27    SUNXI_GPD(27)

#define MISO    SUNXI_GPE(3)
#define MOSI    SUNXI_GPE(2)
#define SCK   SUNXI_GPE(1)
#define CS      SUNXI_GPE(0)

int main()
{
    if(SETUP_OK!=sunxi_gpio_init()){
      printf("Failed to initialize GPIO\n");
      return -1;
    }

    if(SETUP_OK!=sunxi_gpio_set_cfgpin(PD16,OUTPUT)){
      printf("Failed to config GPIO pin\n");
      return -1;
    }

    int i;
    for(i=0;i<5;i++){
      if(sunxi_gpio_output(PD16,HIGH)){
            printf("Failed to set GPIO pin value\n");
            return -1;
      }

      usleep(500000);
      if(sunxi_gpio_output(PD16,LOW)){
            printf("Failed to set GPIO pin value\n");
            return -1;
      }
      usleep(500000);
    }

    sunxi_gpio_cleanup();

    return 0;
   
}

SUNROC1 发表于 2013-6-6 20:32:06

gpio_lib.h找不到

tll 发表于 2013-7-12 23:25:19

SUNROC1 发表于 2013-6-6 20:32 static/image/common/back.gif
gpio_lib.h找不到

在pySUNXI包里

yzbx 发表于 2013-7-30 21:34:00

本帖最后由 yzbx 于 2013-7-31 08:55 编辑

楼主你好,在PC上的ubuntu系统下编译,出现了以下问题:请问是不是少安装了什么?yzbx@:pySUNXI-0.1.12$ arm-linux-gnueabihf-gcc readPD8.c -static -o readPD8
/tmp/cc603gTU.o: In function `sigint_handler':
readPD8.c:(.text+0x14): undefined reference to `sunxi_gpio_cleanup'
/tmp/cc603gTU.o: In function `sigterm_handler':
readPD8.c:(.text+0x58): undefined reference to `sunxi_gpio_cleanup'
/tmp/cc603gTU.o: In function `main':
readPD8.c:(.text+0x132): undefined reference to `sunxi_gpio_init'
readPD8.c:(.text+0x156): undefined reference to `sunxi_gpio_set_cfgpin'
readPD8.c:(.text+0x176): undefined reference to `sunxi_gpio_input'
collect2: ld 返回 1
yzbx@:pySUNXI-0.1.12$

tll 发表于 2013-8-5 23:38:40

yzbx 发表于 2013-7-30 21:34 static/image/common/back.gif
楼主你好,在PC上的ubuntu系统下编译,出现了以下问题:请问是不是少安装了什么? ...

正好,我也这样,解决方法是把include的h改成c,但是有时候要反过来,不知道为啥

soloforce 发表于 2013-8-6 09:54:51

$ gcc gpio_lib.c -c
$ gcc gpio_test.c -c
$ gcc gpio_test.o gpio_lib.o -o gpio_test

yuzj 发表于 2014-2-15 11:01:59

我也是做按键输入,但io口一直都是高电平啊。。。

管叫我小狄 发表于 2014-8-20 10:29:32

这个是不是要交叉编译在放到板子上测试啊我这交叉编译放过去 执行不了

soloforce 发表于 2014-8-20 15:27:20

管叫我小狄 发表于 2014-8-20 10:29 static/image/common/back.gif
这个是不是要交叉编译在放到板子上测试啊我这交叉编译放过去 执行不了
...

在板子系统上安装个gcc,直接在板子上编译运行就可以了。

m801231100 发表于 2014-9-30 13:13:34

如果是CT的話,是只要define CT的腳位就可以了嗎還是script.fex 的腳位也要修改
页: [1] 2
查看完整版本: Python GPIO库:用C直接操作GPIO