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
(test i2c)
m
 
(59 intermediate revisions by 4 users not shown)
Line 3: Line 3:
 
{{Languages|rockpiS/dev/libmraa}}
 
{{Languages|rockpiS/dev/libmraa}}
  
      [[rockpiS | ROCK Pi S]] > [[rockpiS/dev | Development]] > [[rockpiS/dev/libmraa  | Install Libmraa ]]
+
    [[rockpiS | ROCK Pi S]] > [[rockpiS/dev | Development]] > [[rockpiS/dev/libmraa  | Install Libmraa ]]
  
 
=== Libmraa on ROCK Pi S ===
 
=== Libmraa on ROCK Pi S ===
Line 11: Line 11:
 
==== Install essential packages ====
 
==== 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:
+
Package libmraa is in the Radxa APT bionic-stable and buster-stable repositories.
  
For Debian Buster
+
Execute the following commands to add Radxa APT
    deb http://apt.radxa.com/buster-testing/ buster main
+
  
Get the pub key
+
rock@rockpis:~$ export DISTRO=bionic-stable      # for Bionic
    wget -O -  apt.radxa.com/buster-testing/public.key | sudo apt-key add -
+
 
 +
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:
 
Install essential packages:
    sudo apt-get update
+
 
    sudo apt-get install -y rockchip-overlay rockpis-dtbo libmraa-rockpis
+
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 ====
 
==== Enable interface ====
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 follow: 
 
  
===== Hardware V12 =====
+
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 V1.2 =====
  
 
16 GPIO:
 
16 GPIO:
Line 51: Line 64:
 
     PIN3      I2C'''1'''_SCL
 
     PIN3      I2C'''1'''_SCL
 
     PIN5      I2C'''1'''_SDA
 
     PIN5      I2C'''1'''_SDA
     PIN13      I2C'''2'''_SDA
+
     PIN13      I2C'''3'''_SDA
     PIN15      I2C'''2'''_SCL
+
     PIN15      I2C'''3'''_SCL
 
    
 
    
 
 
1 SPI:
 
1 SPI:
 
     PIN19      SPI'''2'''TX        //must disable i2c0
 
     PIN19      SPI'''2'''TX        //must disable i2c0
Line 76: Line 88:
 
     PIN26      ADC_IN0          //the measure voltage must lower than 1.8v
 
     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
+
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].
    root@rockpis:/# cat boot/hw_intfc.conf
+
 
    # Hardware Interface Config
+
For those ROCK Pi S system images released before March 1st, 2020, the configuration file is /boot/hw_intfc.conf.
     # Set "on" to enable the optional hardware interfaces while set "off" to disable.
+
 
      
+
===== Hardware V1.3=====
     intfc:i2c0=on
+
 
     intfc:i2c1=on
+
28 GPIO:
     intfc:i2c2=on
+
     PIN03      GPIO2_A2
     intfc:i2c3=on
+
     PIN05      GPIO2_B0
      
+
     PIN07      GPIO2_B3
     intfc:pwm1=on
+
     PIN08      GPIO2_A1
     intfc:pwm2=on
+
     PIN09      GPIO4_C4
     intfc:pwm3=on
+
     PIN11      GPIO4_C2
      
+
     PIN12      GPIO4_A3
     intfc:spi0=off
+
     PIN13      GPIO4_C6
     intfc:spi2=off
+
     PIN15      GPIO4_C5
      
+
     PIN16      GPIO4_D2
     intfc:uart0=on
+
     PIN18      GPIO4_D4
     intfc:uart1=on
+
     PIN19      GPIO1_B0
     intfc:uart2=on
+
     PIN21      GPIO1_A7
      
+
     PIN22      GPIO4_D5
   # Devicetree Overlay Enable, uncomment to enable .dtbo under /boot/overlays/.
+
     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
 
    
 
    
  # Serial console on UART0
+
2 SPI:
  intfc:dtoverlay=console-on-ttyS0
+
     PIN19      SPI'''2'''TX        //must disable i2c0 UART1
      
+
    PIN21      SPI'''2'''RX      //must disable i2c0 UART1
  # waveshare 3.5inch lcd (B v2) on SPI2. Need set:
+
    PIN23      SPI'''2'''CLK
  # intfc:uart1=off intfc:uart2=off intfc:i2c0=off intfc:spi2=on
+
     PIN24      SPI'''2'''CSN
  #intfc:dtoverlay=spi2-waveshare35b-v2
+
    PIN40      SPI'''1'''TX        //must disable i2c3  UART3
      
+
    PIN42      SPI'''1'''RX        //must disable i2c3  UART3
  # waveshare 3.5inch lcd (C) on SPI2. Need set:
+
    PIN41      SPI'''1'''CLK
  # intfc:uart1=off intfc:uart2=off intfc:i2c0=off intfc:spi2=on
+
    PIN39      SPI'''1'''CSN
  #intfc:dtoverlay=spi2-waveshare35c
+
  root@rockpis:/#
+
  
then '''reboot'''
+
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 ====
  
===== test gpio =====
+
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
 
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
    root@rockpis:/#
+
  
===== test pwm =====
+
===== PWM test =====
use c to test pwm.c,compile pwm.c
+
 
    root@rockpis:/home/rock/c# cat pwm.c
+
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.
    #include <signal.h>
+
 
    #include <stdlib.h>
+
Firstly, modify the /boot/uEnv.txt file to add the following
    #include <unistd.h>
+
 
   
+
root@rockpis:~# cat /boot/uEnv.txt
    /* mraa header */
+
verbosity=7
    #include "mraa/pwm.h"
+
'''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
 
      
 
      
    /* PWM declaration */
+
accel: x:0 y:0 z:0
    #define PWM 11
+
gyro: x:6 y:136 z:-50
 
      
 
      
    /* PWM period in us */
+
accel: x:0 y:0 z:0
    #define PWM_FREQ 200
+
gyro: x:-5 y:48 z:-103
   
+
    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 */
+
accel: x:0 y:0 z:0
        status = mraa_pwm_period_us(pwm, PWM_FREQ);
+
gyro: x:3 y:3 z:5
        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
+
===== UART test =====
    root@rockpis:/home/rock/c# ./a.out
+
ROCK Pi S V1.2 provides 3 UART,There are  '''uart0''' ,'''uart1''', '''uart2'''.  
    PWM value is 0.010015
+
ROCK Pi S V1.3 provides 4 UART,There are  '''uart0''' ,'''uart1''', '''uart2''', '''uart3''' .
    PWM value is 0.019985
+
If you need the uart function, you can turn on one or more of them.
    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 =====
+
Firstly, Disable console and enable '''uart0''' for uart test.modify the '''/boot/uEnv.txt''' file to add the following
Use mraa-i2c tool to test,here we use I2C MPU6050
+
 
    root@rockpis:/home/rock/c# cat i2c_mpu6050.c
+
root@rockpis:~# cat /boot/uEnv.txt
    /* standard headers */
+
verbosity=7
    #include <endian.h>
+
'''overlay_prefix=rockchip'''
    #include <signal.h>
+
'''rootfstype=ext4'''
    #include <stdio.h>
+
fdtfile=rockchip/rk3308-rock-pi-s.dtb
    #include <stdlib.h>
+
'''overlays=rk3308-uart0 rk3308-uart1 rk3308-uart2 rk3308-uart3'''
    #include <unistd.h>
+
'''console='''
   
+
rootuuid=c3800af9-fa58-4fb3-bb56-e52fd04837ba
    /* mraa header */
+
initrdsize=0x5c96c3
    #include "mraa/i2c.h"
+
kernelversion=4.4.143-47-rockchip-g495ff574976c
   
+
initrdimg=initrd.img-4.4.143-47-rockchip-g495ff574976c
    #define I2C_BUS 1
+
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;
 +
    }
 
      
 
      
    /* register definitions */
+
    j = 10;
    #define MPU6050_ADDR 0x68
+
     while(j) {
    #define MPU6050_REG_PWR_MGMT_1 0x6b
+
  j--;
    #define MPU6050_REG_RAW_ACCEL_X 0x3b
+
        printf("0x%x\n",mraa_spi_write(spi, 0xaa));
    #define MPU6050_REG_RAW_ACCEL_Y 0x3d
+
    }
    #define MPU6050_REG_RAW_ACCEL_Z 0x3f
+
err_exit:
    #define MPU6050_REG_RAW_GYRO_X 0x43
+
    mraa_result_print(status);
    #define MPU6050_REG_RAW_GYRO_Y 0x45
+
    #define MPU6050_REG_RAW_GYRO_Z 0x47
+
    /* stop spi */
   
+
    mraa_spi_stop(spi);
    /* bit definitions */
+
    #define MPU6050_RESET 0x80
+
    /* deinitialize mraa for the platform (not needed most of the times) */
    #define MPU6050_SLEEP (1 << 6)
+
    mraa_deinit();
    #define MPU6050_PLL_GYRO_X (1 << 1)
+
   
+
      return EXIT_FAILURE;
    /* accelerometer scale factor for (+/-)2g */
+
}
    #define MPU6050_ACCEL_SCALE 16384.0
+
rock@rockpis:~/mraa-examples$ gcc -o test-spi test-spi.c -lmraa
   
+
    /* 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
+
Then short pin19 and pin21 and run  test-spi
    root@rockpis:/home/rock/c#
+
  
===== test uart =====
+
rock@rockpis:~/mraa-examples$ sudo ./test-spi
 +
0xaa
 +
0xaa
 +
0xaa
 +
0xaa
 +
0xaa
 +
0xaa
 +
0xaa
 +
0xaa
 +
0xaa
 +
0xaa
 +
MRAA: SUCCESS
  
===== test spi =====
+
===== ADC test =====
  
===== test adc =====
+
connect signal you want to measure, and then compile mraa example c file, aio.c, to test.
  
====Development====
+
<pre>
 +
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
 +
</pre>
 +
 
 +
==== Development ====
  
 
More introduction of libmraa can look at [http://iotdk.intel.com/docs/master/mraa/index.html libmraa official website].
 
More introduction of libmraa can look at [http://iotdk.intel.com/docs/master/mraa/index.html libmraa official website].
 +
 +
==== Troubleshooting ====
 +
 +
* Refer [[RockpiS/getting_started/troubleshooting | Troubleshooting page]]
 +
* Post your issue on the forum: https://forum.radxa.com/c/rockpiS

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