Posts: 10
Threads: 4
Joined: Jun 2019
Hi,
I would like to do some manipulation of the user and general purchase I/Os of the pianissimo platform, for example to light up a user LED via pressing down a pushbutton.
I found the functions in the sdk runtime doc for configuring the gpio as a bus such as rt_gpio_init and rt_gpio_pin_configure etc, but I did not find any document mentioning the exact address/pin or registers that are corresponding to the LEDs or pushbuttons. I am wondering where to get the detailed info of such so that I can light up a user LED?
Thanks,
Mapletree
Posts: 39
Threads: 0
Joined: Nov 2018
(09-23-2019, 02:46 PM)mapletree Wrote: Hi,
I would like to do some manipulation of the user and general purchase I/Os of the pianissimo platform, for example to light up a user LED via pressing down a pushbutton.
I found the functions in the sdk runtime doc for configuring the gpio as a bus such as rt_gpio_init and rt_gpio_pin_configure etc, but I did not find any document mentioning the exact address/pin or registers that are corresponding to the LEDs or pushbuttons. I am wondering where to get the detailed info of such so that I can light up a user LED?
Thanks,
Mapletree
Hi Mapletree,
You can use the following example:
Code: /*
* This example shows how drive a GPIO as an output.
*/
#include "rt/rt_data.h"
#include <stdio.h>
#include <rt/rt_api.h>
#include <stdint.h>
#define GPIO 5 // LED0 on Genesys2 board
unsigned int __rt_iodev_uart_baudrate = 115200;
int __rt_fpga_fc_frequency = 20000000;
int __rt_fpga_periph_frequency = 10000000;
int main()
{
// GPIO initialization
rt_pad_set_function(GPIO, 1); //pad_func=1 means gpio functionality. pad_func=0 is default (e.g. in this case spim_csn1)
rt_gpio_init(0, GPIO);
// Configure GPIO as an outpout
rt_gpio_set_dir(0, 1<<GPIO, RT_GPIO_IS_OUT);
// Now set the output value
rt_gpio_set_pin_value(0, GPIO, 1);
return 0;
}
Unfortunately, the documentation on that regard is a little bit lacking. Here is a summary of the GPIO/Pad association currently in use:
Pad Name Assigned GPIO
---------------------------
spim_sdio0 GPIO 0
spim_sdio1 GPIO 1
spim_sdio2 GPIO 2
spim_sdio3 GPIO 3
spim_csn0 GPIO 4
spim_csn1 GPIO 5
spim_sck GPIO 6
uart_rx GPIO 7
uart_tx GPIO 8
cam_pclk GPIO 9
cam_hsync GPIO 10
cam_data0 GPIO 11
cam_data1 GPIO 12
cam_data2 GPIO 13
cam_data3 GPIO 14
cam_data4 GPIO 15
cam_data5 GPIO 16
cam_data6 GPIO 17
cam_data7 GPIO 18
cam_vsync GPIO 19
sdio_clk GPIO 20
sdio_cmd GPIO 21
sdio_data0 GPIO 22
sdio_data1 GPIO 23
sdio_data2 GPIO 24
sdio_data3 GPIO 25
i2c0_sda GPIO 26
i2c0_scl GPIO 27
i2s0_sck GPIO 28
i2s0_ws GPIO 29
i2s0_sdi GPIO 30
i2s1_sdi GPIO 31
You can find this information in the pulpissimo/pad_control.sv.
I hope this helps.
Greetings,
Manuel
Posts: 10
Threads: 4
Joined: Jun 2019
(09-30-2019, 09:23 AM)meggiman Wrote: (09-23-2019, 02:46 PM)mapletree Wrote: Hi,
I would like to do some manipulation of the user and general purchase I/Os of the pianissimo platform, for example to light up a user LED via pressing down a pushbutton.
I found the functions in the sdk runtime doc for configuring the gpio as a bus such as rt_gpio_init and rt_gpio_pin_configure etc, but I did not find any document mentioning the exact address/pin or registers that are corresponding to the LEDs or pushbuttons. I am wondering where to get the detailed info of such so that I can light up a user LED?
Thanks,
Mapletree
Hi Mapletree,
You can use the following example:
Code: /*
* This example shows how drive a GPIO as an output.
*/
#include "rt/rt_data.h"
#include <stdio.h>
#include <rt/rt_api.h>
#include <stdint.h>
#define GPIO 5 // LED0 on Genesys2 board
unsigned int __rt_iodev_uart_baudrate = 115200;
int __rt_fpga_fc_frequency = 20000000;
int __rt_fpga_periph_frequency = 10000000;
int main()
{
// GPIO initialization
rt_pad_set_function(GPIO, 1); //pad_func=1 means gpio functionality. pad_func=0 is default (e.g. in this case spim_csn1)
rt_gpio_init(0, GPIO);
// Configure GPIO as an outpout
rt_gpio_set_dir(0, 1<<GPIO, RT_GPIO_IS_OUT);
// Now set the output value
rt_gpio_set_pin_value(0, GPIO, 1);
return 0;
}
Unfortunately, the documentation on that regard is a little bit lacking. Here is a summary of the GPIO/Pad association currently in use:
Pad Name Assigned GPIO
---------------------------
spim_sdio0 GPIO 0
spim_sdio1 GPIO 1
spim_sdio2 GPIO 2
spim_sdio3 GPIO 3
spim_csn0 GPIO 4
spim_csn1 GPIO 5
spim_sck GPIO 6
uart_rx GPIO 7
uart_tx GPIO 8
cam_pclk GPIO 9
cam_hsync GPIO 10
cam_data0 GPIO 11
cam_data1 GPIO 12
cam_data2 GPIO 13
cam_data3 GPIO 14
cam_data4 GPIO 15
cam_data5 GPIO 16
cam_data6 GPIO 17
cam_data7 GPIO 18
cam_vsync GPIO 19
sdio_clk GPIO 20
sdio_cmd GPIO 21
sdio_data0 GPIO 22
sdio_data1 GPIO 23
sdio_data2 GPIO 24
sdio_data3 GPIO 25
i2c0_sda GPIO 26
i2c0_scl GPIO 27
i2s0_sck GPIO 28
i2s0_ws GPIO 29
i2s0_sdi GPIO 30
i2s1_sdi GPIO 31
You can find this information in the pulpissimo/pad_control.sv.
I hope this helps.
Greetings,
Manuel
Great! it is really helpful! Thanks a lot Manueal!
Mapletree
Posts: 8
Threads: 2
Joined: Oct 2019
(09-30-2019, 02:24 PM)mapletree Wrote: (09-30-2019, 09:23 AM)meggiman Wrote: (09-23-2019, 02:46 PM)mapletree Wrote: Hi,
I would like to do some manipulation of the user and general purchase I/Os of the pianissimo platform, for example to light up a user LED via pressing down a pushbutton.
I found the functions in the sdk runtime doc for configuring the gpio as a bus such as rt_gpio_init and rt_gpio_pin_configure etc, but I did not find any document mentioning the exact address/pin or registers that are corresponding to the LEDs or pushbuttons. I am wondering where to get the detailed info of such so that I can light up a user LED?
Thanks,
Mapletree
Hi Mapletree,
You can use the following example:
Code: /*
* This example shows how drive a GPIO as an output.
*/
#include "rt/rt_data.h"
#include <stdio.h>
#include <rt/rt_api.h>
#include <stdint.h>
#define GPIO 5 // LED0 on Genesys2 board
unsigned int __rt_iodev_uart_baudrate = 115200;
int __rt_fpga_fc_frequency = 20000000;
int __rt_fpga_periph_frequency = 10000000;
int main()
{
// GPIO initialization
rt_pad_set_function(GPIO, 1); //pad_func=1 means gpio functionality. pad_func=0 is default (e.g. in this case spim_csn1)
rt_gpio_init(0, GPIO);
// Configure GPIO as an outpout
rt_gpio_set_dir(0, 1<<GPIO, RT_GPIO_IS_OUT);
// Now set the output value
rt_gpio_set_pin_value(0, GPIO, 1);
return 0;
}
Unfortunately, the documentation on that regard is a little bit lacking. Here is a summary of the GPIO/Pad association currently in use:
Pad Name Assigned GPIO
---------------------------
spim_sdio0 GPIO 0
spim_sdio1 GPIO 1
spim_sdio2 GPIO 2
spim_sdio3 GPIO 3
spim_csn0 GPIO 4
spim_csn1 GPIO 5
spim_sck GPIO 6
uart_rx GPIO 7
uart_tx GPIO 8
cam_pclk GPIO 9
cam_hsync GPIO 10
cam_data0 GPIO 11
cam_data1 GPIO 12
cam_data2 GPIO 13
cam_data3 GPIO 14
cam_data4 GPIO 15
cam_data5 GPIO 16
cam_data6 GPIO 17
cam_data7 GPIO 18
cam_vsync GPIO 19
sdio_clk GPIO 20
sdio_cmd GPIO 21
sdio_data0 GPIO 22
sdio_data1 GPIO 23
sdio_data2 GPIO 24
sdio_data3 GPIO 25
i2c0_sda GPIO 26
i2c0_scl GPIO 27
i2s0_sck GPIO 28
i2s0_ws GPIO 29
i2s0_sdi GPIO 30
i2s1_sdi GPIO 31
You can find this information in the pulpissimo/pad_control.sv.
I hope this helps.
Greetings,
Manuel
Great! it is really helpful! Thanks a lot Manueal!
Mapletree Hello,mapletree, Now I encounter a problem about GPIO input.Would you like to share your C code which implements lighting up a user LED via pressing down a pushbutton?
Posts: 4
Threads: 1
Joined: May 2020
Hi bunohdwnl,
Did you manage to get the gpio input working?
Because I'm also failing in reading the correct values from an input pin.
I always receive the same input value, independent of the inputs I apply to the pins.
Thanks !
Posts: 9
Threads: 2
Joined: Dec 2019
10-18-2020, 03:57 AM
(This post was last modified: 10-18-2020, 05:02 AM by stefanct.)
(09-30-2019, 09:23 AM)meggiman Wrote: Code: ...
rt_pad_set_function(GPIO, 1); //pad_func=1 means gpio functionality. pad_func=0 is default (e.g. in this case spim_csn1)
...
Unfortunately, the documentation on that regard is a little bit lacking. Here is a summary of the GPIO/Pad association currently in use:
Pad Name Assigned GPIO
---------------------------
spim_sdio0 GPIO 0
...
You can find this information in the pulpissimo/pad_control.sv.
That helped me a lot in getting GPIOs at least somewhat running, thanks! The code in the SDK apparently has changed over time, and the pulp-rt-examples have not been updated.
For example, the more generic rt_pad_set_function() has replaced rt_gpio_init() in most CPU instances (where rt_gpio_init() has become a NOP).
After following the call tree and hardware modules up and down a bit I noticed that the input could never have worked as intended with the version 3 of the GPIO wrappers AFAICT... https://github.com/pulp-platform/hal/pull/20
The following program allows for testing all (polling) I/O functionality properly. I have left the rt_gpio_init() calls in there but they don't matter in my case - in fact, they are optimized away. The API clearly isn't that thought through so don't blame me for all the boiler plate code please :)
Code: /*
* Copyright (C) 2018 ETH Zurich and University of Bologna
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <stdio.h>
#include "rt/rt_api.h"
#define LED0 5
#define LED1 9
#define LED2 10
#define LED3 11
#define LED4 0
#define LED5 1
#define LED6 2
#define LED7 3
#define SW0 12
#define SW1 13
#define SW2 18
#define SW3 19
#define SW4 22
#define SW5 23
#define SW6 24
#define SW7 25
#define BTNU 14
#define BTNR 15
#define BTND 16
#define BTNL 17
int __rt_fpga_fc_frequency = 20000000;
int __rt_fpga_periph_frequency = 10000000;
unsigned int __rt_iodev_uart_baudrate = 115200;
int main() {
rt_pad_set_function(LED0, 1);
rt_pad_set_function(LED1, 1);
rt_pad_set_function(LED2, 1);
rt_pad_set_function(LED3, 1);
rt_pad_set_function(LED4, 1);
rt_pad_set_function(LED5, 1);
rt_pad_set_function(LED6, 1);
rt_pad_set_function(LED7, 1);
rt_pad_set_function(SW7, 1);
rt_pad_set_function(SW6, 1);
rt_pad_set_function(SW5, 1);
rt_pad_set_function(SW4, 1);
rt_pad_set_function(SW3, 1);
rt_pad_set_function(SW2, 1);
rt_pad_set_function(SW1, 1);
rt_pad_set_function(SW0, 1);
rt_pad_set_function(BTNU, 1);
rt_pad_set_function(BTNR, 1);
rt_pad_set_function(BTND, 1);
rt_pad_set_function(BTNL, 1);
rt_gpio_init(0, SW0);
rt_gpio_init(0, SW1);
rt_gpio_init(0, SW2);
rt_gpio_init(0, SW3);
rt_gpio_init(0, SW4);
rt_gpio_init(0, SW5);
rt_gpio_init(0, SW6);
rt_gpio_init(0, SW7);
rt_gpio_init(0, BTNU);
rt_gpio_init(0, BTNR);
rt_gpio_init(0, BTND);
rt_gpio_init(0, BTNL);
rt_gpio_init(0, LED0);
rt_gpio_init(0, LED1);
rt_gpio_init(0, LED2);
rt_gpio_init(0, LED3);
rt_gpio_init(0, LED4);
rt_gpio_init(0, LED5);
rt_gpio_init(0, LED6);
rt_gpio_init(0, LED7);
rt_gpio_set_dir(0, 1<<LED7 | 1<<LED6 | 1<<LED5 | 1<<LED4 | 1<<LED3 | 1<<LED2 | 1<<LED1 | 1<<LED0, RT_GPIO_IS_OUT);
rt_gpio_set_dir(0, 1<<BTNU | 1<<BTNR | 1<<BTND | 1<<BTNL, RT_GPIO_IS_IN);
rt_gpio_set_dir(0, 1<<SW7 | 1<<SW6 | 1<<SW5 | 1<<SW4 | 1<<SW3 | 1<<SW2 | 1<<SW1 | 1<<SW0, RT_GPIO_IS_IN);
while(1) {
unsigned int btn = 0 \
| (rt_gpio_get_pin_value(0, BTNL) << 3) \
| (rt_gpio_get_pin_value(0, BTNU) << 2) \
| (rt_gpio_get_pin_value(0, BTNR) << 1) \
| (rt_gpio_get_pin_value(0, BTND) << 0) \
;
unsigned int sw = 0 \
| (rt_gpio_get_pin_value(0, SW7) << 7) \
| (rt_gpio_get_pin_value(0, SW6) << 6) \
| (rt_gpio_get_pin_value(0, SW5) << 5) \
| (rt_gpio_get_pin_value(0, SW4) << 4) \
| (rt_gpio_get_pin_value(0, SW3) << 3) \
| (rt_gpio_get_pin_value(0, SW2) << 2) \
| (rt_gpio_get_pin_value(0, SW1) << 1) \
| (rt_gpio_get_pin_value(0, SW0) << 0) \
;
printf("Hello world! - 0x%02x - 0x%02x\n", btn, sw);
rt_gpio_set_pin_value(0, LED0, 1);
rt_gpio_set_pin_value(0, LED1, 1);
rt_gpio_set_pin_value(0, LED2, 1);
rt_gpio_set_pin_value(0, LED3, 1);
rt_gpio_set_pin_value(0, LED4, 1);
rt_gpio_set_pin_value(0, LED5, 1);
rt_gpio_set_pin_value(0, LED6, 1);
rt_gpio_set_pin_value(0, LED7, 1);
rt_time_wait_us(200*1000);
rt_gpio_set_pin_value(0, LED0, 0);
rt_gpio_set_pin_value(0, LED1, 0);
rt_gpio_set_pin_value(0, LED2, 0);
rt_gpio_set_pin_value(0, LED3, 0);
rt_gpio_set_pin_value(0, LED4, 0);
rt_gpio_set_pin_value(0, LED5, 0);
rt_gpio_set_pin_value(0, LED6, 0);
rt_gpio_set_pin_value(0, LED7, 0);
rt_time_wait_us(200*1000);
}
return 0;
}
Posts: 7
Threads: 0
Joined: Feb 2024
Hi @ stefanct and @meggiman,
Does the following code provided by you, works for zedboard too? I tried running this on my zedboard, and led0 goes off but then after that, I am not able to observe any changes. Could you please guide me? Thank you.
Code: /*
* Copyright (C) 2018 ETH Zurich and University of Bologna
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <stdio.h>
#include "rt/rt_api.h"
#define LED0 5
#define LED1 9
#define LED2 10
#define LED3 11
#define LED4 0
#define LED5 1
#define LED6 2
#define LED7 3
#define SW0 12
#define SW1 13
#define SW2 18
#define SW3 19
#define SW4 22
#define SW5 23
#define SW6 24
#define SW7 25
#define BTNU 14
#define BTNR 15
#define BTND 16
#define BTNL 17
int __rt_fpga_fc_frequency = 20000000;
int __rt_fpga_periph_frequency = 10000000;
unsigned int __rt_iodev_uart_baudrate = 115200;
int main() {
rt_pad_set_function(LED0, 1);
rt_pad_set_function(LED1, 1);
rt_pad_set_function(LED2, 1);
rt_pad_set_function(LED3, 1);
rt_pad_set_function(LED4, 1);
rt_pad_set_function(LED5, 1);
rt_pad_set_function(LED6, 1);
rt_pad_set_function(LED7, 1);
rt_pad_set_function(SW7, 1);
rt_pad_set_function(SW6, 1);
rt_pad_set_function(SW5, 1);
rt_pad_set_function(SW4, 1);
rt_pad_set_function(SW3, 1);
rt_pad_set_function(SW2, 1);
rt_pad_set_function(SW1, 1);
rt_pad_set_function(SW0, 1);
rt_pad_set_function(BTNU, 1);
rt_pad_set_function(BTNR, 1);
rt_pad_set_function(BTND, 1);
rt_pad_set_function(BTNL, 1);
rt_gpio_init(0, SW0);
rt_gpio_init(0, SW1);
rt_gpio_init(0, SW2);
rt_gpio_init(0, SW3);
rt_gpio_init(0, SW4);
rt_gpio_init(0, SW5);
rt_gpio_init(0, SW6);
rt_gpio_init(0, SW7);
rt_gpio_init(0, BTNU);
rt_gpio_init(0, BTNR);
rt_gpio_init(0, BTND);
rt_gpio_init(0, BTNL);
rt_gpio_init(0, LED0);
rt_gpio_init(0, LED1);
rt_gpio_init(0, LED2);
rt_gpio_init(0, LED3);
rt_gpio_init(0, LED4);
rt_gpio_init(0, LED5);
rt_gpio_init(0, LED6);
rt_gpio_init(0, LED7);
rt_gpio_set_dir(0, 1<<LED7 | 1<<LED6 | 1<<LED5 | 1<<LED4 | 1<<LED3 | 1<<LED2 | 1<<LED1 | 1<<LED0, RT_GPIO_IS_OUT);
rt_gpio_set_dir(0, 1<<BTNU | 1<<BTNR | 1<<BTND | 1<<BTNL, RT_GPIO_IS_IN);
rt_gpio_set_dir(0, 1<<SW7 | 1<<SW6 | 1<<SW5 | 1<<SW4 | 1<<SW3 | 1<<SW2 | 1<<SW1 | 1<<SW0, RT_GPIO_IS_IN);
while(1) {
unsigned int btn = 0 \
| (rt_gpio_get_pin_value(0, BTNL) << 3) \
| (rt_gpio_get_pin_value(0, BTNU) << 2) \
| (rt_gpio_get_pin_value(0, BTNR) << 1) \
| (rt_gpio_get_pin_value(0, BTND) << 0) \
;
unsigned int sw = 0 \
| (rt_gpio_get_pin_value(0, SW7) << 7) \
| (rt_gpio_get_pin_value(0, SW6) << 6) \
| (rt_gpio_get_pin_value(0, SW5) << 5) \
| (rt_gpio_get_pin_value(0, SW4) << 4) \
| (rt_gpio_get_pin_value(0, SW3) << 3) \
| (rt_gpio_get_pin_value(0, SW2) << 2) \
| (rt_gpio_get_pin_value(0, SW1) << 1) \
| (rt_gpio_get_pin_value(0, SW0) << 0) \
;
printf("Hello world! - 0x%02x - 0x%02x\n", btn, sw);
rt_gpio_set_pin_value(0, LED0, 1);
rt_gpio_set_pin_value(0, LED1, 1);
rt_gpio_set_pin_value(0, LED2, 1);
rt_gpio_set_pin_value(0, LED3, 1);
rt_gpio_set_pin_value(0, LED4, 1);
rt_gpio_set_pin_value(0, LED5, 1);
rt_gpio_set_pin_value(0, LED6, 1);
rt_gpio_set_pin_value(0, LED7, 1);
rt_time_wait_us(200*1000);
rt_gpio_set_pin_value(0, LED0, 0);
rt_gpio_set_pin_value(0, LED1, 0);
rt_gpio_set_pin_value(0, LED2, 0);
rt_gpio_set_pin_value(0, LED3, 0);
rt_gpio_set_pin_value(0, LED4, 0);
rt_gpio_set_pin_value(0, LED5, 0);
rt_gpio_set_pin_value(0, LED6, 0);
rt_gpio_set_pin_value(0, LED7, 0);
rt_time_wait_us(200*1000);
}
return 0;
}
|