Please enable javascript, or click here to visit my ecommerce web site powered by Shopify.
Jump to: navigation, search

Difference between revisions of "RockpiS/dev/libmraa"

< RockpiS‎ | dev
(PWM test)
m
 
(30 intermediate revisions by 4 users not shown)
Line 11: Line 11:
 
==== Install essential packages ====
 
==== Install essential packages ====
  
Package libmraa is in the Radxa APT bionic-testing and buster-testing repositories.
+
Package libmraa is in the Radxa APT bionic-stable and buster-stable repositories.
  
 
Execute the following commands to add Radxa APT
 
Execute the following commands to add Radxa APT
  
  rock@rockpis:~$ export DISTRO=bionic-testing     # for Bionic
+
  rock@rockpis:~$ export DISTRO=bionic-stable     # for Bionic
  
 
or
 
or
  
  rock@rockpis:~$ export DISTRO=buster-testing     # for Buster
+
  rock@rockpis:~$ export DISTRO=buster-stable     # for Buster
 
  rock@rockpis:~$ echo "deb http://apt.radxa.com/$DISTRO/ ${DISTRO%-*} main" | sudo tee -a /etc/apt/sources.list.d/apt-radxa-com.list
 
  rock@rockpis:~$ echo "deb http://apt.radxa.com/$DISTRO/ ${DISTRO%-*} main" | sudo tee -a /etc/apt/sources.list.d/apt-radxa-com.list
  
Line 29: Line 29:
  
 
  rock@rockpis:~$ sudo apt-get update
 
  rock@rockpis:~$ sudo apt-get update
  rock@rockpis:~$ sudo apt-get install -y rockchip-overlay rockpis-dtbo libmraa # libmraa version: >=0.4
+
  rock@rockpis:~$ sudo apt-get install -y rockchip-overlay libmraa # libmraa version: >=0.4
  rock@rockpis:~$ sudo apt-get install -y linux-4.4-rockpis-latest # ROCK Pi S kernel version: >= 4.4.143-47
+
  rock@rockpis:~$ sudo apt-get install -y linux-4.4-rock-pi-s-latest # ROCK Pi S kernel version: >= 4.4.143-47
 +
 
 +
Install compiler:
 +
rock@rockpis:~$ sudo apt install -y build-essential
  
 
==== Enable interface ====
 
==== Enable interface ====
Line 36: Line 39:
 
See ROCK Pi S [[rockpiS/hardware/gpio | GPIO pintout]]. ROCK Pi S has a 26-pin colorful expansion header. Each pin is distinguished by color. mraa define is shown below:   
 
See ROCK Pi S [[rockpiS/hardware/gpio | GPIO pintout]]. ROCK Pi S has a 26-pin colorful expansion header. Each pin is distinguished by color. mraa define is shown below:   
  
===== Hardware V12 =====
+
===== Hardware V1.2 =====
  
 
16 GPIO:
 
16 GPIO:
Line 85: Line 88:
 
     PIN26      ADC_IN0          //the measure voltage must lower than 1.8v
 
     PIN26      ADC_IN0          //the measure voltage must lower than 1.8v
  
For those ROCK Pi S system images released after March 1st, 2020, to enable '''pwm2,pwm3,uart1,uart2,i2c0,i2c1,i2c3''' and so overlays=, need to follow [https://wiki.radxa.com/Device-tree-overlays Device tree overlays].
+
For those ROCK Pi S system images released after March 1st, 2020, the configuration file is /boot/uEnv.txt. For more details, follow this guide, [https://wiki.radxa.com/Device-tree-overlays Device tree overlays].
  
For those ROCK Pi S system images released before March 1st, 2020, modify '''/boot/uEnv.txt''' to enable '''pwm2,pwm3,uart1,uart2,i2c0,i2c1,i2c3''' for test.
+
For those ROCK Pi S system images released before March 1st, 2020, the configuration file is /boot/hw_intfc.conf.
  
<pre>
+
===== Hardware V1.3=====
rock@rockpis:~$ cat /boot/uEnv.txt
+
 
verbosity=7
+
28 GPIO:
overlay_prefix=rockchip
+
    PIN03      GPIO2_A2
rootfstype=ext4
+
    PIN05      GPIO2_B0
fdtfile=rockchip/rk3308-rock-pi-s.dtb
+
    PIN07      GPIO2_B3
overlays=rk3308-console-on-uart0 rk3308-i2c0 rk3308-i2c1 rk3308-i2c3
+
    PIN08      GPIO2_A1
rootuuid=37055840-4ec4-444f-979b-9e47ee4bd848
+
    PIN09      GPIO4_C4
initrdsize=0x64d1d4
+
    PIN11      GPIO4_C2
kernelversion=4.4.143-47-rockchip-g495ff574976c
+
    PIN12      GPIO4_A3
initrdimg=initrd.img-4.4.143-47-rockchip-g495ff574976c
+
    PIN13      GPIO4_C6
kernelimg=vmlinuz-4.4.143-47-rockchip-g495ff574976c
+
    PIN15      GPIO4_C5
</pre>
+
    PIN16      GPIO4_D2
 +
    PIN18      GPIO4_D4
 +
    PIN19      GPIO1_B0
 +
    PIN21      GPIO1_A7
 +
    PIN22      GPIO4_D5
 +
    PIN23      GPIO1_B1
 +
    PIN24      GPIO1_D1
 +
    PIN28      GPIO2_B5
 +
    PIN30      GPIO2_B6
 +
    PIN32      GPIO2_B7
 +
    PIN34      GPIO2_C0
 +
    PIN39      GPIO3_B5
 +
    PIN40      GPIO3_B4
 +
    PIN41      GPIO3_B3
 +
    PIN42      GPIO3_B2
 +
    PIN43      GPIO2_B4
 +
    PIN44      GPIO2_B3
 +
    PIN45      GPIO2_B0
 +
    PIN46      GPIO2_A6
 +
 
 +
3 I2C:
 +
    PIN23      I2C'''0'''_SDA  //must disable SPI2 UART1
 +
    PIN24      I2C'''0'''_SCL  //must disable SPI2 UART1
 +
    PIN3      I2C'''1'''_SCL
 +
    PIN5      I2C'''1'''_SDA
 +
    PIN13      I2C'''3'''m0_SDA 
 +
    PIN15      I2C'''3'''m0_SCL
 +
    PIN40      I2C'''3'''m1_SDA    //must disable SPI1 UART3
 +
    PIN39      I2C'''3'''m1_SCL    //must disable SPI1 UART3
 +
 
 +
2 SPI:
 +
    PIN19      SPI'''2'''TX        //must disable i2c0 UART1
 +
    PIN21      SPI'''2'''RX      //must disable i2c0 UART1
 +
    PIN23      SPI'''2'''CLK
 +
    PIN24      SPI'''2'''CSN
 +
    PIN40      SPI'''1'''TX        //must disable i2c3 UART3
 +
    PIN42      SPI'''1'''RX        //must disable i2c3  UART3
 +
    PIN41      SPI'''1'''CLK
 +
    PIN39      SPI'''1'''CSN
 +
 
 +
4 UART:
 +
    PIN8      UART'''0'''_TX 
 +
    PIN10      UART'''0'''_RX
 +
    PIN23      UART'''1'''_TX
 +
    PIN24      UART'''1'''_RX
 +
    PIN19      UART'''2'''_RX  //must disable SPI2 i2c0
 +
    PIN21      UART'''2'''_TX  //must disable SPI2 i2c0
 +
    PIN40      UART'''3'''_RX  //must disable SPI1 i2c3
 +
    PIN39      UART'''3'''_TX  //must disable SPI1 i2c3
 +
 
 +
2 PWM:
 +
    PIN11      PWM'''2'''
 +
    PIN13      PWM'''3'''
 +
 
 +
1 ADC:
 +
    PIN26      ADC_IN0          //the measure voltage must lower than 1.8v
 +
 
 +
For those ROCK Pi S system images released after March 1st, 2020, the configuration file is /boot/uEnv.txt. For more details, follow this guide, [https://wiki.radxa.com/Device-tree-overlays Device tree overlays].
 +
 
 +
For those ROCK Pi S system images released before March 1st, 2020, the configuration file is /boot/hw_intfc.conf.
  
 
==== Test ====
 
==== Test ====
Line 113: Line 175:
 
You should pay more attention to the Black Bold words when modifying configuration file /boot/uEnv.txt.
 
You should pay more attention to the Black Bold words when modifying configuration file /boot/uEnv.txt.
  
===== test gpio =====
+
===== GPIO test =====
  
 
Use '''mraa-gpio tool''' to test
 
Use '''mraa-gpio tool''' to test
  
    root@rockpis:~# mraa-gpio list
+
root@rockpis:~# mraa-gpio list
    01        3V3:  
+
01        3V3:  
    02          5V:  
+
02          5V:  
    03    I2C_SDA: GPIO I2C   
+
03    I2C_SDA: GPIO I2C   
    04          5V:  
+
04          5V:  
    05    I2C_SCL: GPIO I2C   
+
05    I2C_SCL: GPIO I2C   
    06        GND:  
+
06        GND:  
    07 I2S0_8CH_MC: GPIO  
+
07 I2S0_8CH_MC: GPIO  
    08    UART0_TX: GPIO UART  
+
08    UART0_TX: GPIO UART  
    09        GND:  
+
09        GND:  
    10    UART0_RX: GPIO UART  
+
10    UART0_RX: GPIO UART  
    11 PWM2,I2C3_S: GPIO I2C  PWM   
+
11 PWM2,I2C3_S: GPIO I2C  PWM   
    12 I2S0_8CH_SC: GPIO  
+
12 I2S0_8CH_SC: GPIO  
    13 PWM3,I2C3_S: GPIO I2C  PWM   
+
13 PWM3,I2C3_S: GPIO I2C  PWM   
    14        GND:  
+
14        GND:  
    15    SPDIF_TX: GPIO  
+
15    SPDIF_TX: GPIO  
    16 I2S0_8CH_SD: GPIO  
+
16 I2S0_8CH_SD: GPIO  
    17        3V3:  
+
17        3V3:  
    18 I2S0_8CH_SD: GPIO  
+
18 I2S0_8CH_SD: GPIO  
    19 UART1_RTSN,: GPIO SPI  UART  
+
19 UART1_RTSN,: GPIO SPI  UART  
    20        GND:  
+
20        GND:  
    21 UART1_CTSN,: GPIO SPI  UART  
+
21 UART1_CTSN,: GPIO SPI  UART  
    22 I2S0_8CH_LR: GPIO  
+
22 I2S0_8CH_LR: GPIO  
    23 UART1_RX,I2: GPIO I2C  SPI  UART  
+
23 UART1_RX,I2: GPIO I2C  SPI  UART  
    24 UART1_TX,I2: GPIO I2C  SPI  UART  
+
24 UART1_TX,I2: GPIO I2C  SPI  UART  
    25        GND:  
+
25        GND:  
    26    ADC_IN0: AIO  
+
26    ADC_IN0: AIO  
    root@rockpis:~# mraa-gpio set 15 1          #pin15 pull high
+
root@rockpis:~# mraa-gpio set 15 1          #pin15 pull high
    root@rockpis:~# mraa-gpio set 15 0          #pin15 pull high
+
root@rockpis:~# mraa-gpio set 15 0          #pin15 pull low
  
 
===== PWM test =====
 
===== PWM test =====
Line 153: Line 215:
 
Firstly, modify the /boot/uEnv.txt file to add the following
 
Firstly, modify the /boot/uEnv.txt file to add the following
  
<pre>
+
root@rockpis:~# cat /boot/uEnv.txt
root@rockpis:~# cat /boot/uEnv.txt
+
verbosity=7
verbosity=7
+
'''overlay_prefix=rockchip'''
overlay_prefix=rockchip
+
'''rootfstype=ext4'''
rootfstype=ext4
+
fdtfile=rockchip/rk3308-rock-pi-s.dtb
fdtfile=rockchip/rk3308-rock-pi-s.dtb
+
overlays=rk3308-console-on-uart0 '''rk3308-pwm1 rk3308-pwm2 rk3308-pwm3'''
overlays=rk3308-console-on-uart0 '''rk3308-pwm1 rk3308-pwm2 rk3308-pwm3'''
+
rootuuid=37055840-4ec4-444f-979b-9e47ee4bd848
rootuuid=37055840-4ec4-444f-979b-9e47ee4bd848
+
initrdsize=0x64d1d4
initrdsize=0x64d1d4
+
kernelversion=4.4.143-47-rockchip-g495ff574976c
kernelversion=4.4.143-47-rockchip-g495ff574976c
+
initrdimg=initrd.img-4.4.143-47-rockchip-g495ff574976c
initrdimg=initrd.img-4.4.143-47-rockchip-g495ff574976c
+
kernelimg=vmlinuz-4.4.143-47-rockchip-g495ff574976c
kernelimg=vmlinuz-4.4.143-47-rockchip-g495ff574976c
+
 
</pre>
+
  
 
Modify the macro PWM in /home/rock/mraa-examples/pwm.c as follows to test PWM2. To test PWM3, change '''#define PWM 11''' to '''#define PWM 13'''.
 
Modify the macro PWM in /home/rock/mraa-examples/pwm.c as follows to test PWM2. To test PWM3, change '''#define PWM 11''' to '''#define PWM 13'''.
Line 183: Line 244:
  
 
===== I2C test =====
 
===== I2C test =====
 +
ROCK Pi S V1.2 provides 3 I2C,There are  I2C0 ,I2C1, I2C3.
 +
ROCK Pi S V1.3 provides 3 I2C,There are  I2C0 ,I2C1, I2C3m0,I2C3m1.
 +
If you need the I2C function, you can turn on one or more of them,but you can just choose one between I2C3m0 and I2C3m1 .
  
Use mraa-i2c tool to test. Here we use I2C MPU6050
+
Firstly, modify the /boot/uEnv.txt file to add the following
    rock@rockpis:~/mraa-examples$ 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;
+
    }
+
   
+
    rock@rockpis:~/mraa-examples$ gcc i2c_mpu6050 i2c_mpu6050.c -lmraa
+
  
Run the compiled file
+
root@rockpis:~# cat /boot/uEnv.txt
 +
verbosity=7
 +
'''overlay_prefix=rockchip'''
 +
'''rootfstype=ext4'''
 +
fdtfile=rockchip/rk3308-rock-pi-s.dtb
 +
overlays=rk3308-console-on-uart0  '''rk3308-i2c0 rk3308-i2c1 rk3308-i2c3-m0'''
 +
rootuuid=37055840-4ec4-444f-979b-9e47ee4bd848
 +
initrdsize=0x64d1d4
 +
kernelversion=4.4.143-47-rockchip-g495ff574976c
 +
initrdimg=initrd.img-4.4.143-47-rockchip-g495ff574976c
 +
kernelimg=vmlinuz-4.4.143-47-rockchip-g495ff574976c
 +
 
 +
We use  MPU6050 tets i2c.
 +
Modify the macro  MPU6050 in '''/home/rock/mraa-examples/i2c_mpu6050.c''' ,as follows to test I2C0. To test I2C1 and I2C3, change '''#define I2C_BUS 0''' to '''#define I2C_BUS 1'''  or'''#define I2C_BUS 3''' .
 +
 +
  /* mraa header */
 +
  #include "mraa/i2c.h"
 +
  '''#define I2C_BUS 0'''
 +
 
 +
rock@rockpis:~/mraa-examples$ gcc -o i2c_mpu6050 i2c_mpu6050.c  -lmraa
 
  rock@rockpis:~/mraa-examples$ sudo ./i2c_mpu6050
 
  rock@rockpis:~/mraa-examples$ sudo ./i2c_mpu6050
 
  accel: x:0 y:0 z:0
 
  accel: x:0 y:0 z:0
Line 350: Line 287:
  
 
===== UART test =====
 
===== UART test =====
 +
ROCK Pi S V1.2 provides 3 UART,There are  '''uart0''' ,'''uart1''', '''uart2'''.
 +
ROCK Pi S V1.3 provides 4 UART,There are  '''uart0''' ,'''uart1''', '''uart2''', '''uart3''' .
 +
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@rockpis:~# cat /boot/uEnv.txt
 +
verbosity=7
 +
'''overlay_prefix=rockchip'''
 +
'''rootfstype=ext4'''
 +
fdtfile=rockchip/rk3308-rock-pi-s.dtb
 +
'''overlays=rk3308-uart0 rk3308-uart1 rk3308-uart2 rk3308-uart3'''
 +
'''console='''
 +
rootuuid=c3800af9-fa58-4fb3-bb56-e52fd04837ba
 +
initrdsize=0x5c96c3
 +
kernelversion=4.4.143-47-rockchip-g495ff574976c
 +
initrdimg=initrd.img-4.4.143-47-rockchip-g495ff574976c
 +
kernelimg=vmlinuz-4.4.143-47-rockchip-g495ff574976c
 +
 +
Here set console to NULL value.
 +
 +
then reboot . use '''ssh''' connect to rockpis,we must have '''2 windows''',one is for send data,anothor is for receive.
 +
 +
send command follow:
 +
rock@rockpis:~$ sudo mraa-uart '''dev 0''' baud 1500000 send  radxa
 +
 +
Another window sets the baud  1500000 and receives the data
 +
 +
radxa
 +
 +
receive command follow:
 +
rock@rockpis:~$ sudo mraa-uart '''dev 0''' baud 1500000 recv  1000
 +
radxa
  
 
===== SPI test =====
 
===== SPI test =====
Line 372: Line 342:
 
Create file test-spi.c and add the following contents.
 
Create file test-spi.c and add the following contents.
  
  rock@rockpis:~/mraa-examples$ cat test-spi.c  
+
rock@rockpis:~/mraa-examples$ cat test-spi.c  
  #include <signal.h>
+
#include <signal.h>
  #include <stdlib.h>
+
#include <stdlib.h>
  #include <unistd.h>
+
#include <unistd.h>
 
+
  /* mraa header */
+
/* mraa header */
  #include "mraa/spi.h"
+
#include "mraa/spi.h"
 
+
  /* SPI declaration */
+
/* SPI declaration */
  '''#define SPI_BUS 2'''
+
'''#define SPI_BUS 2'''
 
+
  /* SPI frequency in Hz */
+
/* SPI frequency in Hz */
  #define SPI_FREQ 10000000
+
#define SPI_FREQ 10000000
  int
+
int
  main(int argc, char** argv)
+
main(int argc, char** argv)
  {
+
{
      mraa_result_t status = MRAA_SUCCESS;
+
    mraa_result_t status = MRAA_SUCCESS;
      mraa_spi_context spi;
+
    mraa_spi_context spi;
      int i, j;
+
    int i, j;
 
+
      /* initialize mraa for the platform (not needed most of the times) */
+
    /* initialize mraa for the platform (not needed most of the times) */
      mraa_init();
+
    mraa_init();
 
+
      //! [Interesting]
+
    //! [Interesting]
      /* initialize SPI bus */
+
    /* initialize SPI bus */
      spi = mraa_spi_init(SPI_BUS);
+
    spi = mraa_spi_init(SPI_BUS);
      if (spi == NULL) {
+
    if (spi == NULL) {
          fprintf(stderr, "Failed to initialize SPI\n");
+
        fprintf(stderr, "Failed to initialize SPI\n");
          mraa_deinit();
+
        mraa_deinit();
          return EXIT_FAILURE;
+
        return EXIT_FAILURE;
      }
+
    }
 
+
      /* set SPI frequency */
+
    /* set SPI frequency */
      status = mraa_spi_frequency(spi, SPI_FREQ);
+
    status = mraa_spi_frequency(spi, SPI_FREQ);
      if (status != MRAA_SUCCESS)
+
    if (status != MRAA_SUCCESS)
          goto err_exit;
+
        goto err_exit;
 
+
      /* set big endian mode */
+
    /* set big endian mode */
      status = mraa_spi_lsbmode(spi, 0);
+
    status = mraa_spi_lsbmode(spi, 0);
      if (status != MRAA_SUCCESS) {
+
    if (status != MRAA_SUCCESS) {
          goto err_exit;
+
        goto err_exit;
      }
+
    }
     
+
   
      j = 10;
+
    j = 10;
      while(j) {
+
    while(j) {
    j--;
+
  j--;
          printf("0x%x\n",mraa_spi_write(spi, 0xaa));
+
        printf("0x%x\n",mraa_spi_write(spi, 0xaa));
      }
+
    }
  err_exit:
+
err_exit:
      mraa_result_print(status);
+
    mraa_result_print(status);
 
+
      /* stop spi */
+
    /* stop spi */
      mraa_spi_stop(spi);
+
    mraa_spi_stop(spi);
 
+
      /* deinitialize mraa for the platform (not needed most of the times) */
+
    /* deinitialize mraa for the platform (not needed most of the times) */
      mraa_deinit();
+
    mraa_deinit();
 
+
        return EXIT_FAILURE;
+
      return EXIT_FAILURE;
  }
+
}
  rock@rockpis:~/mraa-examples$ gcc -o test-spi test-spi.c -lmraa
+
rock@rockpis:~/mraa-examples$ gcc -o test-spi test-spi.c -lmraa
  
 
Then short pin19 and pin21 and run  test-spi
 
Then short pin19 and pin21 and run  test-spi
Line 453: Line 423:
  
 
<pre>
 
<pre>
rock@rockpis:~/mraa-examples$ gcc aio aio.c -lmraa
+
rock@rockpis:~/mraa-examples$ gcc -o aio aio.c -lmraa
 
rock@rockpis:~/mraa-examples$ sudo ./aio
 
rock@rockpis:~/mraa-examples$ sudo ./aio
 
ADC A0 read 1A5 - 421
 
ADC A0 read 1A5 - 421

Latest revision as of 09:52, 2 August 2022

    ROCK Pi S >  Development >  Install Libmraa 

Libmraa on ROCK Pi S

This guide describes how to use libmraa on ROCK Pi S.

Install essential packages

Package libmraa is in the Radxa APT bionic-stable and buster-stable repositories.

Execute the following commands to add Radxa APT

rock@rockpis:~$ export DISTRO=bionic-stable      # for Bionic

or

rock@rockpis:~$ export DISTRO=buster-stable      # for Buster
rock@rockpis:~$ echo "deb http://apt.radxa.com/$DISTRO/ ${DISTRO%-*} main" | sudo tee -a /etc/apt/sources.list.d/apt-radxa-com.list

Get the pub key

rock@rockpis:~$  wget -O -  apt.radxa.com/buster-testing/public.key | sudo apt-key add -

Install essential packages:

rock@rockpis:~$ sudo apt-get update
rock@rockpis:~$ sudo apt-get install -y rockchip-overlay libmraa # libmraa version: >=0.4
rock@rockpis:~$ sudo apt-get install -y linux-4.4-rock-pi-s-latest # ROCK Pi S kernel version: >= 4.4.143-47

Install compiler:

rock@rockpis:~$ sudo apt install -y build-essential

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 is shown below:

Hardware V1.2

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      I2C3_SDA
   PIN15      I2C3_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

For those ROCK Pi S system images released after March 1st, 2020, the configuration file is /boot/uEnv.txt. For more details, follow this guide, Device tree overlays.

For those ROCK Pi S system images released before March 1st, 2020, the configuration file is /boot/hw_intfc.conf.

Hardware V1.3

28 GPIO:

   PIN03      GPIO2_A2
   PIN05      GPIO2_B0
   PIN07      GPIO2_B3
   PIN08      GPIO2_A1
   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_D1
   PIN28      GPIO2_B5
   PIN30      GPIO2_B6
   PIN32      GPIO2_B7
   PIN34      GPIO2_C0
   PIN39      GPIO3_B5
   PIN40      GPIO3_B4
   PIN41      GPIO3_B3
   PIN42      GPIO3_B2
   PIN43      GPIO2_B4
   PIN44      GPIO2_B3
   PIN45      GPIO2_B0
   PIN46      GPIO2_A6

3 I2C:

   PIN23      I2C0_SDA   //must disable SPI2 UART1
   PIN24      I2C0_SCL   //must disable SPI2 UART1
   PIN3       I2C1_SCL
   PIN5       I2C1_SDA
   PIN13      I2C3m0_SDA   
   PIN15      I2C3m0_SCL
   PIN40      I2C3m1_SDA    //must disable SPI1 UART3 
   PIN39      I2C3m1_SCL    //must disable SPI1 UART3 
  

2 SPI:

   PIN19      SPI2TX        //must disable i2c0 UART1 
   PIN21      SPI2RX       //must disable i2c0 UART1 
   PIN23      SPI2CLK
   PIN24      SPI2CSN
   PIN40      SPI1TX        //must disable i2c3  UART3 
   PIN42      SPI1RX        //must disable i2c3  UART3 
   PIN41      SPI1CLK
   PIN39      SPI1CSN

4 UART:

   PIN8       UART0_TX   
   PIN10      UART0_RX
   PIN23      UART1_TX
   PIN24      UART1_RX
   PIN19      UART2_RX  //must disable SPI2 i2c0
   PIN21      UART2_TX   //must disable SPI2 i2c0
   PIN40      UART3_RX  //must disable SPI1 i2c3
   PIN39      UART3_TX   //must disable SPI1 i2c3

2 PWM:

   PIN11      PWM2
   PIN13      PWM3

1 ADC:

   PIN26      ADC_IN0          //the measure voltage must lower than 1.8v

For those ROCK Pi S system images released after March 1st, 2020, the configuration file is /boot/uEnv.txt. For more details, follow this guide, Device tree overlays.

For those ROCK Pi S system images released before March 1st, 2020, the configuration file is /boot/hw_intfc.conf.

Test

Package libmraa provides some examples for testing spi, uart, i2c, gpio, etc. We way use the c files in /usr/local/share/mraa/examples/c.

And we copy them to home directory.

rock@rockpis:~/mraa-examples$ 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

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 low
PWM test

ROCK Pi S V1.2 provides 2 PWM, PWM2 and PWM3. It is necessary to enable PWM1, PWM2 and PWM3 at the same time if you need PWM function.

Firstly, modify the /boot/uEnv.txt file to add the following

root@rockpis:~# cat /boot/uEnv.txt
verbosity=7
overlay_prefix=rockchip
rootfstype=ext4
fdtfile=rockchip/rk3308-rock-pi-s.dtb
overlays=rk3308-console-on-uart0 rk3308-pwm1 rk3308-pwm2 rk3308-pwm3
rootuuid=37055840-4ec4-444f-979b-9e47ee4bd848
initrdsize=0x64d1d4
kernelversion=4.4.143-47-rockchip-g495ff574976c
initrdimg=initrd.img-4.4.143-47-rockchip-g495ff574976c
kernelimg=vmlinuz-4.4.143-47-rockchip-g495ff574976c


Modify the macro PWM in /home/rock/mraa-examples/pwm.c as follows to test PWM2. To test PWM3, change #define PWM 11 to #define PWM 13.

/* PWM declaration */
#define PWM 11

Save and compile pwm.c

rock@rockpis:~/mraa-examples$ gcc -o pwm pwm.c -lmraa
rock@rockpis:~/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
I2C test

ROCK Pi S V1.2 provides 3 I2C,There are I2C0 ,I2C1, I2C3. ROCK Pi S V1.3 provides 3 I2C,There are I2C0 ,I2C1, I2C3m0,I2C3m1. If you need the I2C function, you can turn on one or more of them,but you can just choose one between I2C3m0 and I2C3m1 .

Firstly, modify the /boot/uEnv.txt file to add the following

root@rockpis:~# cat /boot/uEnv.txt
verbosity=7
overlay_prefix=rockchip
rootfstype=ext4
fdtfile=rockchip/rk3308-rock-pi-s.dtb
overlays=rk3308-console-on-uart0  rk3308-i2c0 rk3308-i2c1 rk3308-i2c3-m0
rootuuid=37055840-4ec4-444f-979b-9e47ee4bd848
initrdsize=0x64d1d4
kernelversion=4.4.143-47-rockchip-g495ff574976c
initrdimg=initrd.img-4.4.143-47-rockchip-g495ff574976c
kernelimg=vmlinuz-4.4.143-47-rockchip-g495ff574976c

We use MPU6050 tets i2c. Modify the macro MPU6050 in /home/rock/mraa-examples/i2c_mpu6050.c ,as follows to test I2C0. To test I2C1 and I2C3, change #define I2C_BUS 0 to #define I2C_BUS 1 or#define I2C_BUS 3 .

  /* mraa header */
  #include "mraa/i2c.h"
  #define I2C_BUS 0
  
rock@rockpis:~/mraa-examples$ gcc -o i2c_mpu6050 i2c_mpu6050.c  -lmraa
rock@rockpis:~/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
     
accel: x:0 y:0 z:0
gyro: x:3 y:3 z:5
UART test

ROCK Pi S V1.2 provides 3 UART,There are uart0 ,uart1, uart2. ROCK Pi S V1.3 provides 4 UART,There are uart0 ,uart1, uart2, uart3 . 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@rockpis:~# cat /boot/uEnv.txt 
verbosity=7
overlay_prefix=rockchip
rootfstype=ext4
fdtfile=rockchip/rk3308-rock-pi-s.dtb
overlays=rk3308-uart0 rk3308-uart1 rk3308-uart2 rk3308-uart3
console=
rootuuid=c3800af9-fa58-4fb3-bb56-e52fd04837ba
initrdsize=0x5c96c3
kernelversion=4.4.143-47-rockchip-g495ff574976c
initrdimg=initrd.img-4.4.143-47-rockchip-g495ff574976c
kernelimg=vmlinuz-4.4.143-47-rockchip-g495ff574976c

Here set console to NULL value.

then reboot . use ssh connect to rockpis,we must have 2 windows,one is for send data,anothor is for receive.

send command follow:

rock@rockpis:~$ sudo mraa-uart dev 0 baud 1500000 send  radxa

Another window sets the baud 1500000 and receives the data

radxa

receive command follow:

rock@rockpis:~$ sudo mraa-uart dev 0 baud 1500000 recv  1000
radxa
SPI test

Firstly, modify the /boot/uEnv.txt file.

root@rockpis:~# cat /boot/uEnv.txt
verbosity=7
overlay_prefix=rockchip
rootfstype=ext4
fdtfile=rockchip/rk3308-rock-pi-s.dtb
overlays=rk3308-console-on-uart0 rk3308-spi-spidev
param_spidev_spi_bus=2
rootuuid=37055840-4ec4-444f-979b-9e47ee4bd848
initrdsize=0x64d1d4
kernelversion=4.4.143-47-rockchip-g495ff574976c
initrdimg=initrd.img-4.4.143-47-rockchip-g495ff574976c
kernelimg=vmlinuz-4.4.143-47-rockchip-g495ff574976c

then execute command, sync, followed by reboot.

Create file test-spi.c and add the following contents.

rock@rockpis:~/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 2

/* 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@rockpis:~/mraa-examples$ gcc -o test-spi test-spi.c -lmraa

Then short pin19 and pin21 and run test-spi

rock@rockpis:~/mraa-examples$ sudo ./test-spi 
0xaa
0xaa
0xaa
0xaa
0xaa
0xaa
0xaa
0xaa
0xaa
0xaa
MRAA: SUCCESS
ADC test

connect signal you want to measure, and then compile mraa example c file, aio.c, to test.

rock@rockpis:~/mraa-examples$ gcc -o aio aio.c -lmraa
rock@rockpis:~/mraa-examples$ sudo ./aio
ADC A0 read 1A5 - 421
ADC A0 read float - 0.41153
ADC A0 read 1A5 - 421
ADC A0 read float - 0.41153
ADC A0 read 1A5 - 421
ADC A0 read float - 0.41153
ADC A0 read 1A5 - 421
ADC A0 read float - 0.41153

Development

More introduction of libmraa can look at libmraa official website.

Troubleshooting