Rock3/dev/libmraa
ROCK 3 > Development > Install Libmraa
Contents
Libmraa on ROCK 3A
This guide describes how to use libmraa on ROCK 3 to access GPIO, SPI, and other peripherals.
Requirement
- ROCK 3A
- You need our latest official image
Install essential packages
Prebuilt libmraa is located in our Radxa APT Focal and Buster repositories.
Update your /etc/apt/sources.list.d/apt-radxa-com.list
accordingly to enable Radxa APT repository.
- For Debian Buster
deb http://apt.radxa.com/buster-stable/ buster main deb http://apt.radxa.com/buster-testing/ buster main
- For Ubuntu Focal
deb http://apt.radxa.com/focal-stable/ focal main deb http://apt.radxa.com/focal-testing/ focal main
Update and install libmraa
sudo apt-get update sudo apt-get install libmraa
Enable interface
See ROCK 3A GPIO pintout. ROCK 3A has a 40 pins colorful expansion header. Each pin is distinguished by color. mraa define is shown below:
Hardware V1.3
25 GPIO:
PIN03 GPIO1_A0 PIN05 GPIO1_A1 PIN07 GPIO0_B5 PIN11 GPIO3_C4 PIN12 GPIO3_A3 PIN13 GPIO3_C5 PIN15 GPIO0_C0 PIN16 GPIO0_B6 PIN18 GPIO3_B2 PIN19 GPIO4_C3 PIN21 GPIO4_C5 PIN22 GPIO0_C1 PIN23 GPIO4_C2 PIN24 GPIO4_C6 PIN26 GPIO4_D1 PIN27 GPIO0_B4 PIN28 GPIO0_B3 PIN29 GPIO2_D7 PIN31 GPIO3_A0 PIN32 GPIO3_C2 PIN33 GPIO3_C3 PIN35 GPIO3_A4 PIN36 GPIO3_A2 PIN38 GPIO3_A6 PIN40 GPIO3_A5
3 I2C:
PIN27 I2C1_SDA PIN28 I2C1_SCL PIN7 I2C2_SCL_M0 PIN16 I2C2_SDA_M0 PIN3 I2C3_SDA_M0 PIN5 I2C3_SCL_M0
1 SPI:
PIN19 SPI3_MOSI_M1 PIN21 SPI3_MISO_M1 PIN23 SPI3_CLK_M1 PIN24 SPI3_CS0_M1
6 UART:
PIN22 UART0_TX PIN15 UART0_RX PIN5 UART3_TX_M0 PIN3 UART3_RX_M0 PIN32 UART5_TX_M1 PIN33 UART5_RX_M1 PIN11 UART7_TX_M1 PIN13 UART7_RX_M1 PIN29 UART8_TX_M1 PIN31 UART8_RX_M1 PIN21 UART9_TX_M1 PIN24 UART9_RX_M1
7 PWM: (Currently only one PWM function can be used at a time)
PIN15 PWM1_M0 PIN7 PWM1_M1 PIN22 PWM2_M0 PIN16 PWM2_M1 PIN18 PWM9_M0 PIN21 PWM12_M1 PIN24 PWM13_M1 PIN11 PWM14_M0 PIN23 PWM14_M1 PIN13 PWM15_M0 PIN19 PWM15_M1
1 ADC:
PIN37 ADC_IN5 //the measure voltage must lower than 1.8v
Since many peripherals are reusing the same physical pin, all but one has to be disabled to allow proper functionality. While in a normal PC user can easily disable or enable peripherals in their UEFI firmware, currently there is no such universal equivalent in ARM world. Instead, Device tree blobs (dtb) and Device tree overlays (dtbo) are used to inform Linux kernel the existence of external devices. Please refer to this guide on available dtbo for ROCK 3A. Please read those carefully or you may get an unbootable system.
Run libmraa tests
After set correct dtbo to use, reboot Radxa Zero for change to take effect. You can now try some examples supplied by libmraa. They can be used to test SPI, UART, I2C, GPIO, and so on.
In this example, we will use the sample files located under /usr/local/share/mraa/examples/c.
And we copy them to home directory.
rock@rock3a:~/mraa-examples$ sudo cp -av /usr/local/share/mraa/examples/c /home/rock/mraa-examples
You should pay more attention to the Black Bold words when modifying configuration file /boot/uEnv.txt.
GPIO test
Use mraa-gpio tool to test
rock@rock3a:~$ mraa-gpio list 01 3V3: 02 5V: 03 I2C3_SDA_M0: GPIO I2C UART 04 5V: 05 I2C3_SCL_M0: GPIO I2C UART 06 GND: 07 I2C2_SCL_M0: GPIO I2C PWM 08 UART2_TXD: GPIO UART 09 GND: 10 UART2_RXD: GPIO UART 11 PWM14_M0,UA: GPIO PWM UART 12 GPIO3_A3: GPIO 13 PWM15_IR_M0: GPIO PWM UART 14 GND: 15 PWM1_M0,UAR: GPIO PWM UART 16 I2C2_SDA_M0: GPIO I2C PWM 17 3V3: 18 PWM9_M0: GPIO PWM 19 PWM15_IR_M1: GPIO SPI PWM 20 GND: 21 PWM12_M1,SP: GPIO SPI PWM UART 22 PWM2_M0,UAR: GPIO PWM UART 23 PWM14_M1,SP: GPIO SPI PWM 24 PWM13_M1,SP: GPIO SPI PWM UART 25 GND: 26 SPI3_CS1_M1: GPIO SPI 27 I2C1_SDA: GPIO I2C 28 I2C1_SCL: GPIO I2C 29 UART8_TX_M1: GPIO UART 30 GND: 31 UART8_RX_M1: GPIO UART 32 UART5_TX_M1: GPIO UART 33 UART5_RX_M1: GPIO UART 34 GND: 35 GPIO3_A4: GPIO 36 GPIO3_A2: GPIO 37 SARADC_VIN5: AIO 38 GPIO3_A6: GPIO 39 GND: 40 GPIO3_A5: GPIO root@rock3a:~$ mraa-gpio set 40 1 #pin40 pull high root@rock3a:~# mraa-gpio set 40 0 #pin40 pull low
I2C test
ROCK 3A V1.3 provides 3 I2C,There are I2C1 , I2C2m0, I2C3m0. If you need the I2C function, you can turn on one or more of them.
Firstly, modify the /boot/uEnv.txt file to add the following
root@rock3a:~# cat /boot/uEnv.txt verbosity=7 overlay_prefix=rockchip rootfstype=ext4 fdtfile=rockchip/rk3568-rock-3-a.dtb overlays=rk3568-pwm8-m0-fan rk3568-i2c3-m0 rootuuid=ee2ce23a-e0b1-4625-a54b-6ce12c167e97 initrdsize=0x81bfa9 kernelversion=4.19.193-16-rockchip-g0cca7bdf9cdb initrdimg=initrd.img-4.19.193-16-rockchip-g0cca7bdf9cdb kernelimg=vmlinuz-4.19.193-16-rockchip-g0cca7bdf9cdb
Then, use mraa-i2c tool to test,we must have a i2c slave device,for example:
root@rock3a:~# mraa-i2c list Bus 0: id=01 type=linux default Bus 1: id=02 type=linux Bus 2: id=03 type=linux root@rock3a:~# mraa-i2c detect 2 00: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
We use MPU6050 tets i2c. Modify the macro MPU6050 in /home/rock/mraa-examples/i2c_mpu6050.c ,as follows to test I2C3m0.
/* mraa header */ #include "mraa/i2c.h" #define I2C_BUS 2 rock@rock3a:~/mraa-examples$ gcc -o i2c_mpu6050 i2c_mpu6050.c -lmraa rock@rock3a:~/mraa-examples$ sudo ./i2c_mpu6050 accel: x:0 y:0 z:0 gyro: x:-10 y:1 z:7 accel: x:0 y:0 z:0 gyro: x:107 y:-12 z:69 accel: x:0 y:0 z:0 gyro: x:6 y:136 z:-50 accel: x:0 y:0 z:0 gyro: x:-5 y:48 z:-103
UART test
ROCK 3A V1.3 provides 6 UART,There are uart0 ,uart3, uart5, uart7, uart8, uart9. If you need the uart function, you can turn on one or more of them.
Firstly, Disable console and enable uart0 for uart test.modify the /boot/uEnv.txt file to add the following
root@rock3a:~# cat /boot/uEnv.txt verbosity=7 overlay_prefix=rockchip rootfstype=ext4 fdtfile=rockchip/rk3568-rock-3-a.dtb overlays=rk3568-pwm8-m0-fan rk3568-uart0 rootuuid=ee2ce23a-e0b1-4625-a54b-6ce12c167e97 initrdsize=0x81bfa9 kernelversion=4.19.193-16-rockchip-g0cca7bdf9cdb initrdimg=initrd.img-4.19.193-16-rockchip-g0cca7bdf9cdb kernelimg=vmlinuz-4.19.193-16-rockchip-g0cca7bdf9cdb
Here set console to NULL value.
then reboot . use ssh connect to rock3a in a new window, to send data.
send command follow:
rock@rock3a:~$ sudo mraa-uart dev 0 baud 1500000 send radxa rock@rock3a:~$ sudo mraa-uart dev 0 baud 1500000 send radxa
Another window sets the baud 1500000 and receives the data by serial console
radxaradxa
SPI test
Change overlays in /boot/uEnv.txt and reboot
root@rock3a:~# cat /boot/uEnv.txt verbosity=7 overlay_prefix=rockchip rootfstype=ext4 fdtfile=rockchip/rk3568-rock-3-a.dtb overlays=rk3568-pwm8-m0-fan rk3568-spi3-m1-cs0-spidev rootuuid=ee2ce23a-e0b1-4625-a54b-6ce12c167e97 initrdsize=0x81bfa9 kernelversion=4.19.193-16-rockchip-g0cca7bdf9cdb initrdimg=initrd.img-4.19.193-16-rockchip-g0cca7bdf9cdb kernelimg=vmlinuz-4.19.193-16-rockchip-g0cca7bdf9cdb
then execute command, sync, followed by reboot.
Create file test-spi.c and add the following contents.
rock@rock3a:~/mraa-examples$ cat test-spi.c #include <signal.h> #include <stdlib.h> #include <unistd.h> /* mraa header */ #include "mraa/spi.h" /* SPI declaration */ #define SPI_BUS 3 /* SPI frequency in Hz */ #define SPI_FREQ 10000000 int main(int argc, char** argv) { mraa_result_t status = MRAA_SUCCESS; mraa_spi_context spi; int i, j; /* initialize mraa for the platform (not needed most of the times) */ mraa_init(); //! [Interesting] /* initialize SPI bus */ spi = mraa_spi_init(SPI_BUS); if (spi == NULL) { fprintf(stderr, "Failed to initialize SPI\n"); mraa_deinit(); return EXIT_FAILURE; } /* set SPI frequency */ status = mraa_spi_frequency(spi, SPI_FREQ); if (status != MRAA_SUCCESS) goto err_exit; /* set big endian mode */ status = mraa_spi_lsbmode(spi, 0); if (status != MRAA_SUCCESS) { goto err_exit; } j = 10; while(j) { j--; printf("0x%x\n",mraa_spi_write(spi, 0xaa)); } err_exit: mraa_result_print(status); /* stop spi */ mraa_spi_stop(spi); /* deinitialize mraa for the platform (not needed most of the times) */ mraa_deinit(); return EXIT_FAILURE; } rock@rock3a:~/mraa-examples$ gcc -o test-spi test-spi.c -lmraa
Then short pin19 and pin21 and run test-spi
rock@rock3a:~/mraa-examples$ sudo ./test-spi 0xaa 0xaa 0xaa 0xaa 0xaa 0xaa 0xaa 0xaa 0xaa 0xaa MRAA: SUCCESS
PWM test
ROCK 3A V1.3 provides 7 PWM, there are pwm1-m0, pwm1-m1, pwm2-m0, pwm2-m1, pwm9-m0, pwm12-m1, pwm13-m1, pwm14-m0, pwm14-m1, pwm15-m0, pwm15-m1.
but only one PWM function can be used at a time currently.
Firstly, modify the /boot/uEnv.txt file to add the following
root@rock3a:~# cat /boot/uEnv.txt verbosity=7 overlay_prefix=rockchip rootfstype=ext4 fdtfile=rockchip/rk3568-rock-3-a.dtb overlays=rk3568-pwm8-m0-fan rk3568-pwm1-m0 #rk3568-pwm8-m0-fan should be here to use pwm fan. rootuuid=ee2ce23a-e0b1-4625-a54b-6ce12c167e97 initrdsize=0x81bfa9 kernelversion=4.19.193-16-rockchip-g0cca7bdf9cdb initrdimg=initrd.img-4.19.193-16-rockchip-g0cca7bdf9cdb kernelimg=vmlinuz-4.19.193-16-rockchip-g0cca7bdf9cdb
Modify the macro PWM in /home/rock/mraa-examples/pwm.c as follows to test PWM1_M0.
/* PWM declaration */ #define PWM 15 //15 means its pin number
Save and compile pwm.c
rock@rock3a:~/mraa-examples$ gcc -o pwm pwm.c -lmraa rock@rock3a:~/mraa-examples$ sudo ./pwm PWM value is 0.010015 PWM value is 0.019985 PWM value is 0.030000 PWM value is 0.040014 PWM value is 0.049984 PWM value is 0.059999
ADC test
connect signal you want to measure, and then compile mraa example c file, aio.c, to test.
rock@rock3a:~/mraa-examples$ gcc -o aio aio.c -lmraa rock@rock3a:~/mraa-examples$ sudo ./aio ADC A0 read 20F - 527 ADC A0 read float - 0.51808 ADC A0 read 212 - 530 ADC A0 read float - 0.51906 ADC A0 read 213 - 531 ADC A0 read float - 0.51711
Development
More introduction of libmraa can look at libmraa official website.
Troubleshooting
Post your issue on the forum: https://forum.radxa.com/c/rock3