在Android上使用Java控制Guitar的GPIO

From BananaPro/Pi
Jump to: navigation, search
This page is a translated version of the page Use Java to control GPIO on Android and the translation is 93% complete.

Other languages:
English • ‎中文(简体)‎

GPIO

这里介绍了在Android下如何使用Java去控制Guitar的GPIO.
40Pin GPIO口编码序列号:

public int Guitar_port[] =          //BOARD MODE                
{
        -1,           // 0
        -1,     -1,   //1,            2
        131,    -1,   //3(SDA2),      4
        130,    -1,   //5(SCK2),      6
        50,     91,   //7(B18),       8(UART0_TX)
        -1,     90,   //9,           10(UART0_RX)
        64,     40,   //11(C0),      12(B8-PWM)
        65,    -1,    //13(C1),      14
        68,     25,   //15(C4),      16(A25)
        -1,     70,   //17,          18(B9)
        89,     -1,   //19(MISO),    20
        88,     69,   //21(MOSI),    22(C5)
        86,     87,   //23(SCLK),    24(B19)
        -1,     51,   //25,          26(CE0)
        48,     46,   //27(B16),     28(B14)
        47,     -1,   //29(B15),     30
        42,     45,   //31(B10),     32(B13)      
        32,     -1,   //33(B0),      34
        33,     28,   //35(B1),      36(A28)
        34,     31,   //37(B2),      38(A31)
        -1,     27,   //39,          40(A27)
        -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, //41-> 55
        -1, -1, -1, -1, -1, -1, -1, -1 // 56-> 63
};

注: -1代表非GPIO口,Guitar板子上可分配的普通IO口为7个,分别对应Guitar_port数组的7,11,13,15,16,18,22。


普通IO口的申请

通过调用export接口对IO口进行申请。调用接口路径:

/sys/class/gpio/export

调用方法:

writeSysfs("/sys/class/gpio/export",Integer.toString(Guitar_port[port[i]]));

实例:

for (int i = 0;i < 7;i++){
    writeSysfs("/sys/class/gpio/export",Integer.toString(Guitar_port[port[i]]));
    ShellUtils.execCommand("chmod 0777"+" /sys/class/gpio/gpio"+Integer.toString(Guitar_port[port[i]])+"/direction", true);
    writeSysfs("/sys/class/gpio/gpio"+Integer.toString(Guitar_port[port[i]])+"/direction","out");
    ShellUtils.execCommand("chmod 0777"+" /sys/class/gpio/gpio"+Integer.toString(Guitar_port[port[i]])+"/value", true);
}


实例分析:
申请普通IO口序列号数组。:

int port[] = {7,11,13,15,16,18,22};

使用export接口申请相应的GPIO接口,并在相应路径/sys/class/gpio下创建gpioX节点。

writeSysfs("/sys/class/gpio/export",Integer.toString(Guitar_port[port[i]]));

使用超级用户权限设置gpioX节点下的direction属性为可读可写可执行。

ShellUtils.execCommand("chmod 0777"+" /sys/class/gpio/gpio"+Integer.toString(Guitar_port[port[i]])+"/direction", true);

注: ShellUtils.execCommand函数为true的时候,使用超级用户权限运行linux指令。

设置新申请的gpioX节点的direction属性为out

writeSysfs("/sys/class/gpio/gpio"+Integer.toString(Guitar_port[port[i]])+"/direction","out");

注:direction为out状态时,gpioX节点作为输出功能使用。direction为in状态时,gpioX节点作为输入功能使用。

使用超级用户权限设置gpioX节点下的value属性为可读可写可执行。

ShellUtils.execCommand("chmod 0777"+" /sys/class/gpio/gpio"+Integer.toString(Guitar_port[port[i]])+"/value", true);

注:value属性为gpioX节点的data属性。当作为输出功能使用时,对value写入相应的值,可改变GPIO口的逻辑电平状态。

普通IO口的卸载

通过调用unexport接口对IO口进行申请,调用接口路径:

/sys/class/gpio/unexport

调用方法:

writeSysfs("/sys/class/gpio/unexport",Integer.toString(Guitar_port[port[i]]));

实例:

public void unExport_port(){
    int port[] = {7,11,13,15,16,18,22};
    for (int i = 0;i < 7;i++){
        writeSysfs("/sys/class/gpio/unexport",Integer.toString(Guitar_port[port[i]]));
    }
}

实例分析:
使用unexport接口卸载相应的GPIO接口,并在相应路径(/sys/class/gpio)下删除gpioX节点。

writeSysfs("/sys/class/gpio/unexport",Integer.toString(Guitar_port[port]));

普通IO口输出功能

设置GPIO口为高电平状态。
使用接口路径:

/sys/class/gpio/gpioX/value

实例:

public void LedOpen(){
    int port[] = {7,11,13,15,16,18,22};
    for(int i = 0;i < 7;i++){
        writeSysfs("/sys/class/gpio/gpio"+Integer.toString(Guitar_port[port[i]])+"/value","1");
    }
}

实例分析:
设置gpioX节点的value属性为1时,相应gpio管脚的逻辑电平为高电平。

writeSysfs("/sys/class/gpio/gpio"+Integer.toString(Guitar_port[port[i]])+"/value","1");

普通IO口输入功能

使用接口路径:

/sys/class/gpio/gpioX/value

实例:

readSysfs("/sys/class/gpio/gpio"+Integer.toString(Guitar_port[port])+"/value")

实例分析:
读取相应gpioX节点的value属性值来获取当前GPIO的逻辑电平状态。

public int getInputVal(int port){
    return Integer.parseInt(readSysfs("/sys/class/gpio/gpio"+Integer.toString(Guitar_port[port])+"/value"));
}

参考代码:
SimpleGPIO

SPI

40Pin SPI编码序列号:

        89,     -1,   //19(MISO),    20
        88,     69,   //21(MOSI),    22(C5)
        86,     87,   //23(SCLK),    24(B19)
        -1,     51,   //25,          26(CE0)

SPI静态库的加载

在com.lmk.hardware类中声明并加载静态库(lmkhardwarejni)

static {
        try {
                System.loadLibrary("lmkhardwarejni");
        } catch (UnsatisfiedLinkError e) {
                Log.d(TAG, "lmkhardware library not found!");
        }
    }

在com.lmk.hardware类中声明SPI库的使用接口

设置SPI位数的接口函数为:

setSPIBits(int fd, int Bits)

获取SPI位数的接口函数为:

getSPIBits(int fd)

设置SPI读写速度的接口函数为:

setSPIMaxSpeed(int fd, int speed)

设置SPI读写模式的接口函数为:

setSPIMode(int fd, int mode)

发送SPI消息的接口函数为:

transferArray(int fd, int[] writebuf,int delay, int speed, int bits)

SPI接口的使用

Activity中声明SPI接口函数class

import com.lmk.hardware;

注: 必须使用root权限打开spidev*.*(spidev为spi设备接口文件)文件。

获取spidev设备文件描述符fd

fd0 = hardware.open("/dev/spidev0.0",hardware.O_RDWR);

向spidev设备发送消息

public int[] at45BufReadI(){
        int rBuf[] = {0xd4, 0xff, 0x00, 0x02, 0xff, 0xff}; // read data from buffer
        return hardware.transferArray(fd0,rBuf,0,5000000,8);
}

参考代码:
SimpleSPI

I2C

40Pin I2C 编码序列号:

        131,     -1,   //3(SDA2),    4
        130,     -1,   //5(SCK2),    6

I2C静态库的加载

在com.lmk.hardware类中声明并加载静态库(lmkhardwarejni)

static {
        try {
                System.loadLibrary("lmkhardwarejni");
        } catch (UnsatisfiedLinkError e) {
                Log.d(TAG, "lmkhardware library not found!");
        }
    }

在com.lmk.hardware类中声明SPI库的使用接口

设置从机I2C地址的函数接口:

setI2CSlaveAddr(int fd, int addr, int force)

设置从机I2C超时的函数接口:

setI2CTimeout(int fd, int timeout)

设置从机I2C访问失败重试次数的函数接口:

setI2CRetries(int fd, int retries)

设置从机I2C读写操作检测的函数接口:

I2CCheck(int fd, int size)

读取一个字节的I2C数据的函数接口:

I2CReadByte(int fd, int reg)

写入一个字节的I2C数据的函数接口:

I2CWriteByte(int fd, int reg, int data)

I2C接口的使用

Activity中声明SPI接口函数class

import com.lmk.hardware;

注: 必须使用root权限打开i2c-dev(i2c-dev为i2c设备接口文件)文件。

获取i2c-dev设备文件描述符fd

fd0 = hardware.open("/dev/i2c-dev",hardware.O_RDWR);

向i2c设备发送一个字节的数据

hardware.I2CWriteByte(fd,0x200,0x01)//向I2C设备的0x200寄存器写入0x01。

向i2c设备读取一个字节的数据

regvalue = hardware. I2CReadByte (fd,0x200)//读取I2C设备的0x200寄存器的值.

Code for reference:
SimpleI2C

UART

UART静态库的加载

/* 波特率nSpeed:115200,9600,4800,2400
数据位nBits:8,7
校验位nEvent:‘N’,'E','O'---->Note,Even,Odd
停止位nStop:1,2
*/

设置UART模式

static public native  FileDescriptor setUartMode(int fd,  int nSpeed, int nBits, int nEvent, int nStop)

发送字符串

public static void UartSendSring(FileDescriptor mFd,String sendSring)

接收字符

public static char UartReceiveChar() {}

UART接口的使用

   fd0 = hardware.open("/dev/ttyS0",hardware.O_RDWR);//open ttyS0
    mFd = hardware.setUartMode(fd0,115200,8,'N',1); //设置相关参数,默认即可
    hardware.UartSendSring(mFd,"123654");//发送字符串"123654"
    char value = hardware.UartReceiveChar();//接收字符,最好通过线程来读取

Code for reference:
SimpleUART