F2S Board SP7021 GPIO Control LED

1.Pin define

SP7021's GPIO pins have two kinds name system, one is GPIO_Pm_n which m is 0~8 and n is 0~7, another is G_MX[z] which z is 0~71. G_MX means general mux pin which can be program to other functions.
For example, SP7021 pin21 which pin name is GPIO_P2_6, the general mux pin name is G_MX[22]. The relationship between pin name and general mux pin name is 2*8+6=22 in this case and so on.
Figure1 show portion of F2S board SP7021 GPIO pin define. Figure2 show F2S board Rpi like 40 pins GPIO port. So F2S board can collect the same functions as Rpi 40 pins output port with appropriate source code setting.

Figure1 F2S board SP7021 GPIO pin define

Figure2 F2S board Rpi like 40 pins GPIO port

2.GPIO control example by C code

Set pins of Rpi like port number 18 and 22 (SP7021 pin mux number is G_MX[22] and G_MX[24]) as output. In this example, both LEDs will be on for 3 seconds at the beginning and then turn on for 1 second rotary.


gpio.c
/************************************************************/
// gpio.c
/************************************************************/
#include "gpio.h"
#define SYS_GPIO_PFX "/sys/class/gpio/"
int fd = -1;

//gpio init
uint8 gpio_init(int _pin)
{
    DIR *dp;
    char fpath[100];
    int port,num;


    port = _pin/8;
    num = _pin%8;
    printf("port=%d, num=%d \n",port,num);
    sprintf(fpath, SYS_GPIO_PFX"P%d_0%d", port, num);
    if(!(dp=opendir(fpath)))
    {
        FILE *fp;
        if((fp = fopen(SYS_GPIO_PFX"export", "w")) == NULL) return(-1);
        fprintf(fp, "%d", _pin);
        fclose(fp);
    }
    else
    {
        closedir(dp);
    }
    return(0);
}

uint8 gpio_read(int _pin)
{
    char ret, ss[2];
    char fpath[100];
    int port,num;


    port = _pin/8;
    num = _pin%8;
    sprintf(fpath, SYS_GPIO_PFX"P%d_0%d/value", port, num);
    printf("fpath=%s \n", fpath);
    fd = open(fpath, O_RDWR); // open file and enable read and write
    if(fd < 0)
    {
        perror("Can't open gpio file \n"); // open i2c dev file fail
        exit(1);
    }
    printf("open gpio file success !\n"); // open i2c dev file succes
    ret = read(fd, ss, 1);
    close(fd);
    if(ret < 0) return(0);
        return((ss[0] == '0'?0:1));
}


uint8 gpio_write(int _pin, int _val)
{
    int ret;
    char x[2];
    char fpath[100];
    int port,num;


    port = _pin/8;
    num = _pin%8;
    sprintf(fpath, SYS_GPIO_PFX"P%d_0%d/value", port, num);
    printf("fpath=%s \n", fpath);
    fd = open(fpath, O_RDWR); // open file and enable read and write
    if(fd < 0)
    {
        perror("Can't open gpio file \n"); // open i2c dev file fail
        exit(1);
    }
    printf("open gpio file success !\n"); // open i2c dev file succes
    x[1] = '\0';
    x[0] = (_val>0 ? '1':'0');
    ret = write(fd, x, 1);
    close(fd);
    return(ret);
}


uint8 gpio_dir_get(int _pin)
{
    static char ss[2];
    char fpath[100];
    int ret,port,num;


    port = _pin/8;
    num = _pin%8;
    sprintf(fpath, SYS_GPIO_PFX"P%d_0%d/direction", port, num);
    printf("fpath=%s \n", fpath);
    fd = open(fpath, O_RDWR); // open file and enable read and write
    if(fd < 0)
    {
        perror("Can't open gpio file \n"); // open i2c dev file fail
        exit(1);
    }
    printf("open gpio file success !\n"); // open i2c dev file succes
    ret = read(fd, ss, 2);
    close(fd);
    if(ret < 0) return(0);
        return((ss[0] == 'i'? PIN_DIR_I:PIN_DIR_O));
}


uint8 gpio_dir_set(int _pin, int _dir)
{
    int ret=0;
    const char *ss="in";
    char fpath[100];
    int port,num;


    port = _pin/8;
    num = _pin%8;
    sprintf(fpath, SYS_GPIO_PFX"P%d_0%d/direction", port, num);
    printf("fpath=%s \n", fpath);
    fd = open(fpath, O_RDWR); // open file and enable read and write
    if(fd < 0)
    {
        perror("Can't open gpio file \n"); // open i2c dev file fail
        exit(1);
    }
    printf("open gpio file success !\n"); // open i2c dev file succes
    if(_dir == PIN_DIR_O) ss="out";
    ret = write(fd, ss, strlen(ss)*sizeof(char));
    close(fd);
    return((ret<2 ? -1:0));
}


gpio.h
/************************************************************/
// gpio.h
/************************************************************/
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/ioctl.h>
#include<fcntl.h>
#include<dirent.h>
#include<string.h>


#define PIN_DIR_I 0
#define PIN_DIR_O 1
typedef unsigned char uint8;
uint8 gpio_init(int);
uint8 gpio_read(int);
uint8 gpio_write(int,int);
uint8 gpio_dir_get(int);
uint8 gpio_dir_set(int,int);


main.c
/************************************************************/
// main.c
/************************************************************/
#include "gpio.h"
// main
int main(int argc, char *argv[])
{
    int pinnum1,pinnum2;


    printf("GPIO test main start \n");
    pinnum1 = 22; //mean GPIO_P2_6=MX[22]
    pinnum2 = 24; //mean GPIO_P3_0=MX[24]
    gpio_init(pinnum1);
    gpio_init(pinnum2);
    gpio_dir_set(pinnum1,PIN_DIR_O);
    gpio_dir_set(pinnum2,PIN_DIR_O);
    gpio_write(pinnum1,1);
    gpio_write(pinnum2,0);
    usleep(3000*1000);
    while(1)
    {
        gpio_write(pinnum1,1);
        gpio_write(pinnum2,0);
        usleep(1000*1000);
        gpio_write(pinnum1,0);
        gpio_write(pinnum2,1);
        usleep(1000*1000);
    }
}


3.Makefile


/******************************/

// Makefile for test code

/*****************************/

 
CC = $(CROSS_COMPILE)gcc
CFLAGS= -O2 -Wall -D_GNU_SOURCE -static -march=armv7-a
LDFLAGS= -static
SOURCES= main.c gpio.c
OBJECTS= ${SOURCES:.c=.o}

OUT = gpiotest
all: $(OUT)
@echo Build DONE.
$(OUT): $(OBJECTS)
$(CC) $(LDFLAGS) -o $(OUT) $(OBJECTS) $(LIBS)
clean:
rm -f $(OBJECTS) $(OUT) 



4.執行=>$ sudo ./gpiotest