Rock/wiringX
Contents
WiringX is a modular approach to several GPIO interfaces. Till now, it supports five platforms: Raspberry Pi, Hummingboard, BananaPi, Radxa Rock and MIPS CI20 Creator. For Radxa Rock(pro/lite), wiringX provides interfaces for GPIO, I2C, SPI and ISR. You can easily use these function on Rock through wiringX.
Firstly, get wiringX from github:
git clone https://github.com/wiringX/wiringX.git cd wiringX
or
wget https://github.com/wiringX/wiringX/archive/master.zip unzip master.zip cd wiringX-master
Then, install wiringX follow the way on github.
When compile your source code, add the static lib like:
gcc -o test test.c /usr/local/lib/libwiringX.a ./test
WiringX is running on your board!
Pin Number Defined in WiringX
You can find pin numbers for Radxa Rock(pro/lite) here. However, only pins can be used as GPIO are valid in wiringX. Thus, for J8, totally 21 pins can be used (number defined as 0-20) and for J12/15, 8 pins can be used (number 25-32). Besides, 3 onboard LEDs can be used, (number 33-35).
GPIO
WiringX provide digitalread and digitalwrite, after you set it as input/output using pinMode:
wiringXSetup(); pinMode(0, OUTPUT); digitalWrite(0, HIGH);
Theoretically, all pins can be used as GPIO. However, some multiplexed pins can't be used (pin number defined in extension header): J8: 11-16, 20, 22, 24, 26-28, 31-32; J12/15: 33-38. These pins can only be used as PWM, UART or SPI, not for GPIO.
I2C
I2C0 is connected to pin 31, 32 on J8, it can be simply used like:
#define I2C_ADDR 0x04 fd_i2c = wiringXI2CSetup(I2C_ADDR) data=wiringXI2CRead(fd_i2c); wiringXI2CWrite(fd_i2c, data);
SPI
SPI0 and SPI1 are connected to J12/15, J8 respectively. It can be used like:
#define SPI_CHAN 0 #define SPI_SPEED 250000 wiringXSetup(); fd_spi = wiringXSPISetup(SPI_CHAN, SPI_SPEED); wiringXSPIDataRW(SPI_CHAN, &spi_data, 1);
ISR
For RK3188, Port A can be configured as interrupt. It can be used like:
pthread_t pth; wiringXSetup(); wiringXISR(1, INT_EDGE_RISING); pthread_create(&pth, NULL, interrupt, NULL);
This will creat a thread "interrupt" to handle:
void *interrupt(void *param) { while(1) { if(waitForInterrupt(1, 1000) > 0) printf("interrupt\n"); else printf("timeout\n"); } }
It should take note that, for a linux kernel version below 3.12, interrupt only support INT_EDGE_RISING or INT_EDGE_FALLING, not for INT_EDGE_BOTH.