Difference between revisions of "RockpiS/dev/libmraa"
(→Libmraa on ROCK Pi S) |
(→Hardware V12) |
||
Line 82: | Line 82: | ||
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, 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 before March 1st, 2020, modify '''/boot/ | + | 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. |
rock@rockpis:/boot$ cat uEnv.txt | rock@rockpis:/boot$ cat uEnv.txt | ||
Line 94: | Line 94: | ||
initrdimg=initrd.img-4.4.143-39-rockchip-gdaf243b9655a | initrdimg=initrd.img-4.4.143-39-rockchip-gdaf243b9655a | ||
kernelimg=vmlinuz-4.4.143-39-rockchip-gdaf24 | kernelimg=vmlinuz-4.4.143-39-rockchip-gdaf24 | ||
− | |||
==== Test ==== | ==== Test ==== |
Revision as of 07:53, 21 April 2020
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 bionic-testing and buster-testing repositories.
Execute the following commands to add Radxa APT
export DISTRO=bionic-testing # for Bionic # or export DISTRO=buster-testing # for Buster
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
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
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 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, to enable pwm2,pwm3,uart1,uart2,i2c0,i2c1,i2c3 and so overlays=, need to follow 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.
rock@rockpis:/boot$ cat 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 initrdsize=0x62c6be kernelversion=4.4.143-39-rockchip-gdaf243b9655a initrdimg=initrd.img-4.4.143-39-rockchip-gdaf243b9655a kernelimg=vmlinuz-4.4.143-39-rockchip-gdaf24
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
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
First, modify the / boot/uEnv.txt file to add the following
rock@rockpis:/boot$ cat 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 initrdsize=0x62c6be kernelversion=4.4.143-39-rockchip-gdaf243b9655a initrdimg=initrd.img-4.4.143-39-rockchip-gdaf243b9655a kernelimg=vmlinuz-4.4.143-39-rockchip-gdaf243b9655a rootuuid=37055840-4ec4-444f-979b-9e47ee4bd848
then reboot
use c to test spi,compile spi.c,if use spi1,must disable
rock@rockpis:~$ 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:~$ gcc -o test-spi test-spi.c -lmraa
then short pin19 and pin21 and run a.out
rock@rockpis:~$ sudo ./test-spi 0xaa 0xaa 0xaa 0xaa 0xaa 0xaa 0xaa 0xaa 0xaa 0xaa MRAA: SUCCESS
test adc
connect signal you want to measure,and then compile mraa examplec file to test.
Folder / mraa / examples / C has examples of testing ADC,compiling it and executing
rock@rockpis:~/mraa/examples/c$ gcc aio.c -lmraa rock@rockpis:~/mraa/examples/c$ ./a.out 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.