RockpiS/dev/libmraa
ROCK Pi S > Development > Install Libmraa
Contents
Libmraa on ROCK Pi S
This guide describes how to use libmraa on ROCK Pi S.
Install essential packages
Package libmraa-rockpis is in the Radxa APT buster-testing repository. Edit file /etc/apt/sources.list.d/apt-radxa-com.list and add the following:
For Debian Buster
deb http://apt.radxa.com/buster-testing/ buster main
Get the pub key
wget -O - apt.radxa.com/buster-testing/public.key | sudo apt-key add -
Install essential packages:
sudo apt-get update sudo apt-get install -y rockchip-overlay rockpis-dtbo libmraa-rockpis
Enable interface
See ROCK Pi S GPIO pintout. ROCK Pi S has a 26-pin colorful expansion header. Each pin is distinguished by color. mraa define follow:
Hardware V12
16 GPIO:
PIN03 GPIO2_A2 PIN05 GPIO2_B0 PIN07 GPIO2_B3 PIN09 GPIO4_C4 PIN11 GPIO4_C2 PIN12 GPIO4_A3 PIN13 GPIO4_C6 PIN15 GPIO4_C5 PIN16 GPIO4_D2 PIN18 GPIO4_D4 PIN19 GPIO1_B0 PIN21 GPIO1_A7 PIN22 GPIO4_D5 PIN23 GPIO1_B1 PIN24 GPIO1_B2 PIN26 GPIO1_B2
3 I2C:
PIN23 I2C0_SDA PIN24 I2C0_SCL PIN3 I2C1_SCL PIN5 I2C1_SDA PIN13 I2C2_SDA PIN15 I2C2_SCL
1 SPI:
PIN19 SPI2TX //must disable i2c0 PIN21 SPI2RX //must disable i2c0 PIN23 SPI2CLK PIN24 SPI2CSN
3 UART:
PIN8 UART0_TX PIN10 UART0_RX PIN23 UART1_TX PIN24 UART1_RX PIN19 UART2_RX PIN21 UART2_TX
2 PWM:
PIN11 PWM2 PIN13 PWM3
1 ADC:
PIN26 ADC_IN0 //the measure voltage must lower than 1.8v
modify /boot/hw_intfc.conf to enable pwm2,pwm3,uart1,uart2,i2c0,i2c1,i2c2 for test
root@rockpis:/# cat boot/hw_intfc.conf # Hardware Interface Config # Set "on" to enable the optional hardware interfaces while set "off" to disable. intfc:i2c0=on intfc:i2c1=on intfc:i2c2=on intfc:i2c3=on intfc:pwm1=on intfc:pwm2=on intfc:pwm3=on intfc:spi0=off intfc:spi2=off intfc:uart0=on intfc:uart1=on intfc:uart2=on # Devicetree Overlay Enable, uncomment to enable .dtbo under /boot/overlays/. # Serial console on UART0 intfc:dtoverlay=console-on-ttyS0 # waveshare 3.5inch lcd (B v2) on SPI2. Need set: # intfc:uart1=off intfc:uart2=off intfc:i2c0=off intfc:spi2=on #intfc:dtoverlay=spi2-waveshare35b-v2 # waveshare 3.5inch lcd (C) on SPI2. Need set: # intfc:uart1=off intfc:uart2=off intfc:i2c0=off intfc:spi2=on #intfc:dtoverlay=spi2-waveshare35c root@rockpis:/#
then reboot
Test
test gpio
Use mraa-gpio tool to test
root@rockpis:/# mraa-gpio list 01 3V3: 02 5V: 03 I2C_SDA: GPIO I2C 04 5V: 05 I2C_SCL: GPIO I2C 06 GND: 07 I2S0_8CH_MC: GPIO 08 UART0_TX: GPIO UART 09 GND: 10 UART0_RX: GPIO UART 11 PWM2,I2C3_S: GPIO I2C PWM 12 I2S0_8CH_SC: GPIO 13 PWM3,I2C3_S: GPIO I2C PWM 14 GND: 15 SPDIF_TX: GPIO 16 I2S0_8CH_SD: GPIO 17 3V3: 18 I2S0_8CH_SD: GPIO 19 UART1_RTSN,: GPIO SPI UART 20 GND: 21 UART1_CTSN,: GPIO SPI UART 22 I2S0_8CH_LR: GPIO 23 UART1_RX,I2: GPIO I2C SPI UART 24 UART1_TX,I2: GPIO I2C SPI UART 25 GND: 26 ADC_IN0: AIO root@rockpis:/# mraa-gpio set 15 1 #pin15 pull high root@rockpis:/# mraa-gpio set 15 0 #pin15 pull high root@rockpis:/#
test pwm
use c to test pwm.c,compile pwm.c
root@rockpis:/home/rock/c# cat pwm.c #include <signal.h> #include <stdlib.h> #include <unistd.h> /* mraa header */ #include "mraa/pwm.h" /* PWM declaration */ #define PWM 11 /* PWM period in us */ #define PWM_FREQ 200 volatile sig_atomic_t flag = 1; void sig_handler(int signum) { if (signum == SIGINT) { fprintf(stdout, "Exiting...\n"); flag = 0; } } int main(void) { mraa_result_t status = MRAA_SUCCESS; mraa_pwm_context pwm; float value = 0.0f; float output; /* initialize mraa for the platform (not needed most of the times) */ mraa_init(); //! [Interesting] pwm = mraa_pwm_init(PWM); if (pwm == NULL) { fprintf(stderr, "Failed to initialize PWM\n"); mraa_deinit(); return EXIT_FAILURE; } /* set PWM period */ status = mraa_pwm_period_us(pwm, PWM_FREQ); if (status != MRAA_SUCCESS) { goto err_exit; } /* enable PWM */ status = mraa_pwm_enable(pwm, 1); if (status != MRAA_SUCCESS) { goto err_exit; } while (flag) { value = value + 0.01f; /* write PWM duty cyle */ status = mraa_pwm_write(pwm, value); if (status != MRAA_SUCCESS) { goto err_exit; } usleep(50000); if (value >= 1.0f) { value = 0.0f; } /* read PWM duty cyle */ output = mraa_pwm_read(pwm); fprintf(stdout, "PWM value is %f\n", output); } /* close PWM */ mraa_pwm_close(pwm); //! [Interesting] /* deinitialize mraa for the platform (not needed most of the times) */ mraa_deinit(); return EXIT_SUCCESS; err_exit: mraa_result_print(status); /* close PWM */ mraa_pwm_close(pwm); /* deinitialize mraa for the platform (not needed most of the times) */ mraa_deinit(); return EXIT_FAILURE; } root@rockpis:/home/rock/c# gcc pwm.c -lmraa root@rockpis:/home/rock/c#
Run the compiled file
root@rockpis:/home/rock/c# ./a.out 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 PWM value is 0.070014 PWM value is 0.079984 PWM value is 0.089999 PWM value is 0.100014 PWM value is 0.109983
test i2c
Use mraa-i2c tool to test,here we use I2C MPU6050
root@rockpis:/home/rock/c# cat i2c_mpu6050.c /* standard headers */ #include <endian.h> #include <signal.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> /* mraa header */ #include "mraa/i2c.h" #define I2C_BUS 1 /* register definitions */ #define MPU6050_ADDR 0x68 #define MPU6050_REG_PWR_MGMT_1 0x6b #define MPU6050_REG_RAW_ACCEL_X 0x3b #define MPU6050_REG_RAW_ACCEL_Y 0x3d #define MPU6050_REG_RAW_ACCEL_Z 0x3f #define MPU6050_REG_RAW_GYRO_X 0x43 #define MPU6050_REG_RAW_GYRO_Y 0x45 #define MPU6050_REG_RAW_GYRO_Z 0x47 /* bit definitions */ #define MPU6050_RESET 0x80 #define MPU6050_SLEEP (1 << 6) #define MPU6050_PLL_GYRO_X (1 << 1) /* accelerometer scale factor for (+/-)2g */ #define MPU6050_ACCEL_SCALE 16384.0 /* gyroscope scale factor for (+/-)250/s */ #define MPU6050_GYRO_SCALE 131.0 volatile sig_atomic_t flag = 1; void sig_handler(int signum) { if (signum == SIGINT) { fprintf(stdout, "Exiting...\n"); flag = 0; } } int16_t i2c_read_word(mraa_i2c_context dev, uint8_t command) { return be16toh(mraa_i2c_read_word_data(dev, command)); } int main(void) { mraa_result_t status = MRAA_SUCCESS; mraa_i2c_context i2c; uint8_t data; int16_t accel_data[3]; int16_t gyro_data[3]; int ret; /* install signal handler */ signal(SIGINT, sig_handler); /* initialize mraa for the platform (not needed most of the times) */ mraa_init(); //! [Interesting] /* initialize I2C bus */ i2c = mraa_i2c_init(I2C_BUS); if (i2c == NULL) { fprintf(stderr, "Failed to initialize I2C\n"); mraa_deinit(); return EXIT_FAILURE; } /* set slave address */ status = mraa_i2c_address(i2c, MPU6050_ADDR); if (status != MRAA_SUCCESS) { goto err_exit; } /* reset the sensor */ status = mraa_i2c_write_byte_data(i2c, MPU6050_RESET, MPU6050_REG_PWR_MGMT_1); if (status != MRAA_SUCCESS) { goto err_exit; } sleep(5); /* configure power management register */ ret = mraa_i2c_read_byte_data(i2c, MPU6050_REG_PWR_MGMT_1); if (ret == -1) { return EXIT_FAILURE; } data = ret; data |= MPU6050_PLL_GYRO_X; data &= ~(MPU6050_SLEEP); status = mraa_i2c_write_byte_data(i2c, data, MPU6050_REG_PWR_MGMT_1); if (status != MRAA_SUCCESS) { goto err_exit; } sleep(5); while (flag) { /* read raw accel data */ accel_data[0] = i2c_read_word(i2c, MPU6050_REG_RAW_ACCEL_X) / MPU6050_ACCEL_SCALE; accel_data[1] = i2c_read_word(i2c, MPU6050_REG_RAW_ACCEL_Y) / MPU6050_ACCEL_SCALE; accel_data[2] = i2c_read_word(i2c, MPU6050_REG_RAW_ACCEL_Z) / MPU6050_ACCEL_SCALE; /* read raw gyro data */ gyro_data[0] = i2c_read_word(i2c, MPU6050_REG_RAW_GYRO_X) / MPU6050_GYRO_SCALE; gyro_data[1] = i2c_read_word(i2c, MPU6050_REG_RAW_GYRO_Y) / MPU6050_GYRO_SCALE; gyro_data[2] = i2c_read_word(i2c, MPU6050_REG_RAW_GYRO_Z) / MPU6050_GYRO_SCALE; fprintf(stdout, "accel: x:%d y:%d z:%d\n", accel_data[0], accel_data[1], accel_data[2]); fprintf(stdout, "gyro: x:%d y:%d z:%d\n\n", gyro_data[0], gyro_data[1], gyro_data[2]); sleep(2); } /* stop i2c */ mraa_i2c_stop(i2c); //! [Interesting] /* deinitialize mraa for the platform (not needed most of the times) */ mraa_deinit(); return EXIT_SUCCESS; err_exit: mraa_result_print(status); /* stop i2c */ mraa_i2c_stop(i2c); /* deinitialize mraa for the platform (not needed most of the times) */ mraa_deinit(); return EXIT_FAILURE; } root@rockpis:/home/rock/c# gcc i2c_mpu6050.c -lmraa root@rockpis:/home/rock/c#
Run the compiled file
root@rockpis:/home/rock/c# ./a.out 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 accel: x:0 y:0 z:0 gyro: x:3 y:3 z:5
test uart
enable uart1 for uart test
root@rockpis:/home/rock# cat /boot/hw_intfc.conf # Hardware Interface Config # Set "on" to enable the optional hardware interfaces while set "off" to disable. intfc:i2c0=off intfc:i2c1=off intfc:i2c2=off intfc:i2c3=off intfc:pwm1=off intfc:pwm2=off intfc:pwm3=off intfc:spi0=off intfc:spi2=off intfc:uart0=off intfc:uart1=on intfc:uart2=on # Devicetree Overlay Enable, uncomment to enable .dtbo under /boot/overlays/. # Serial console on UART0 intfc:dtoverlay=console-on-ttyS0 # waveshare 3.5inch lcd (B v2) on SPI2. Need set: # intfc:uart1=off intfc:uart2=off intfc:i2c0=off intfc:spi2=on #intfc:dtoverlay=spi2-waveshare35b-v2 # waveshare 3.5inch lcd (C) on SPI2. Need set: # intfc:uart1=off intfc:uart2=off intfc:i2c0=off intfc:spi2=on #intfc:dtoverlay=spi2-waveshare35c # Dummy spi device on SPI0 for test. Need set: intfc:spi0=on #intfc:dtoverlay=devspi0 # Dummy spi device on SPI2 for test. Need set: intfc:spi2=on #intfc:dtoverlay=devspi2 # Use /dev/ttyS0. Need set: intfc:uart0=on #intfc:dtoverlay=rk3308-uart0 # Use /dev/ttyS1. Need set: intfc:uart1=on intfc:dtoverlay=rk3308-uart1 # Use /dev/ttyS2. Need set: intfc:uart2=on intfc:dtoverlay=rk3308-uart2
then reboot and use serial port PIN23 and PIN24
send command follow:
sudo mraa-uart dev 0 baud 1500000 send data
receive command follow:
sudo mraa-uart dev 0 baud 1500000 recv 1000
the receive window will show
date
test spi
test adc
Development
More introduction of libmraa can look at libmraa official website.