UPBoard onboard LEDs access from c users code
I am able to set On/Off UPBoard onboard LEDs from text terminal , however I am not able to find how to change their status from my c code ( I am using mraa lib to access 40pin io header for example, I am assuming something similar ) . Is there any information, which pin are they mapped to... or the way how to set their on/off state from c level ?
Comments
-
My guess is this should go into the software sections...
But if you look at the Wiki: https://wiki.up-community.org/Pinout_UP2
There is a section on the LEDS
The UP Squared includes 4 LEDs (yellow, green, red and blue) on the underside of the board (underneath Ethernet dual port), which are controlled by the pin control FPGA on the board. As root, you can use the following commands to control the LEDs:
Turn on the Green LED
echo 1 > /sys/class/leds/upboard:green:/brightness
Turn off the Green LED
echo 0 > /sys/class/leds/upboard:green:/brightness
For other LEDS, replace "green" with "red","blue" or "yellow" in the commands above.
Currently I don't see any code in MRAA that handles these. I thought they might have been defined as GPIO pins, but I don't think so. You can however write code that opens up those specific files and do a write to them. But as mentioned you need to have root privileges.
-
Thank you for answer,
Turn on the Green LED
echo 1 > /sys/class/leds/upboard:green:/brightness
Turn off the Green LED
echo 0 > /sys/class/leds/upboard:green:/brightness
For other LEDS, replace "green" with "red","blue" or "yellow" in the commands above.
Yes, this is exactly how I am able to control them from terminal , of course with right privileges assigned to user ....
Currently I don't see any code in MRAA that handles these. I thought they might have been defined as GPIO pins, but I don't think so. You can however write code that opens up those specific files and do a write to them.
To use files is option... but I would prefer something like "direct" way as GPIO pins from c code ... that is my question .... so still open....
-
I understand.
Note: MRAA does the same stuff. On a few systems like edison, there is some support for memory mapped IO that works for some/all GPIO pins, otherwise the mraa_gpio_* functions also simply work through the /sys filenames, starting at: /sys/class/gpio
FYI - I hacked up a simple test program that blinks the 3 LEDS on my UP board. Note: I have to run this app with sudo...
#include<sys/stat.h> #include<fcntl.h> #include<unistd.h> #include<stdint.h> #include<stdio.h> #include<string.h> #include<time.h> #include <errno.h> typedef enum {GREEN_LED = 0, YELLOW_LED = 1, RED_LED = 2} Leds; extern bool set_led(Leds led, uint8_t value); int main(int argc, char** argv) { // Pretty simple setup. printf("\n\n*** Start testing leds ***\n"); //usleep(250000L); while(1) { for (int i = 0; i < 8; i++) { set_led(GREEN_LED, (i&1)? 1 : 0); set_led(YELLOW_LED, (i&2)? 1 : 0); set_led(RED_LED, (i&4)? 1 : 0); usleep(250000L); // sleep 250ms } } } bool set_led(Leds led, uint8_t value) { int led_handle = -1; char value_string[4]; // Open file switch (led) { case GREEN_LED: led_handle = open("/sys/class/leds/upboard:green:/brightness", O_WRONLY); break; case YELLOW_LED: led_handle = open("/sys/class/leds/upboard:yellow:/brightness", O_WRONLY); break; case RED_LED: led_handle = open("/sys/class/leds/upboard:red:/brightness", O_WRONLY); break; } if (led_handle == -1) { printf("set_led(%d, %d) failed to open file: %d\n\r", (uint8_t)led, value, errno); return false; } // Write file int length = snprintf(value_string, sizeof(value_string), "%d", value); if (write(led_handle, value_string, length * sizeof(char)) == -1) { printf("set_led(%d, %d) failed to write to file: %d\n\r", (uint8_t)led, value, errno); close(led_handle); return false; } close(led_handle); //printf("set_led(%d, %d) succeed\n\r", (uint8_t)led, value); return true; }
-
Thought I would mention, that I was able to get the program to work for a standard user without sudo, in the same way that I was able to do so for gpio calls.
That is I created a new user group leds, and added myself to it:
sudo addgroup leds sudo adduser kurt leds
Obviously you would change the name kurt to whatever user names you need...
I then created a udev rules file:
kurt@kurt-UP-CHT01:~$ ls -l /etc/udev/rules.d/50-leds.rules -rw-r--r-- 1 root root 244 Jan 13 10:41 /etc/udev/rules.d/50-leds.rules kurt@kurt-UP-CHT01:~$ cat /etc/udev/rules.d/50-leds.rules SUBSYSTEM=="leds*", PROGRAM="/bin/sh -c '\ chown -R root:leds /sys/class/leds && chmod -R 770 /sys/class/leds;\ chown -R root:leds /sys/devices/platform/up-pinctrl/leds && chmod -R 770 /sys/devices/platform/up-pinctrl/leds;\ '" kurt@kurt-UP-CHT01:~$
And rebooted.
-
Another quick update. I tried this also on my UP2 board that has ubuntu installed (one that supports the IO pins and the like...
I added the blue led, added calls to MRAA that finds out which board I have and now blinks 3 or 4 leds depending on which board. Test app also catches ctrl+c to end the program and turn off all leds.
Note: the devices /sys/class/leds are links to somewhere in the /sys/devices/platform/* trees and are different between my two boards so my udev rule was updated to hopefully make it work on both without needing sudo...
SUBSYSTEM=="leds*", PROGRAM="/bin/sh -c '\ chown -R root:leds /sys/class/leds && chmod -R 770 /sys/class/leds;\ chown -R root:leds /sys/devices/platform/up-pinctrl/leds && chmod -R 770 /sys/devices/platform/up-pinctrl/leds;\ chown -R root:leds /sys/devices/platform/AANT0F01:00/upboard-led.* && chmod -R 770 /sys/devices/platform/AANT0F01:00/upboard-led.*;\ '"
Note: Did not test on ubilinux, so not sure if any changes would be needed.
I put the test program and udev rule file up in my Raspberry Pi project.
https://github.com/KurtE/Raspberry_Pi/tree/master/testUPLeds -
I thought I would answer this one more time a different way.
Turns out MRAA does have LED objects. Notes on installing MRAA.
If you use the instructions on how to install MRAA that is up on the UP wiki: https://wiki.up-community.org/MRAA/UPM
The command: udo apt-get install mraa upm
Fails to find mraa or upm.Or if you install MRAA using the instructions shown up on the main github for MRAA: https://github.com/intel-iot-devkit/mraa the version installed here did not appear to have the LED objects in the current version...
So I installed MRAA from sources and build using the instructions that you can find in the main github readme file for the mraa project.
I then made a version of my blinking of the different LEDS on the UP2... Should work as well on UP, but I did not try it. Also note: I am still using the udev rules from above, so can run without using sudo...
Code for MRAAA version:
#include <fcntl.h> #include <unistd.h> #include <stdint.h> #include <stdio.h> #include <stdlib.h> #include <time.h> #include <signal.h> #include <errno.h> #include "mraa.h" volatile uint8_t g_continue = true; //==================================================================================================== // SignalHandler - Try to free up things like servos if we abort. //==================================================================================================== void SignalHandler(int sig){ printf("Caught signal %d\n", sig); if (!g_continue) { printf("Second signal Abort\n"); exit(1); } // Set global telling main to abort and return g_continue = false; } int main(int argc, char** argv) { bool has_blue_led = false; uint8_t exit_loop_count = 8; // Contexts for the up to 4 leds mraa_led_context led_context_green; mraa_led_context led_context_yellow; mraa_led_context led_context_red; mraa_led_context led_context_blue; struct sigaction sigIntHandler; sigIntHandler.sa_handler = SignalHandler; sigemptyset(&sigIntHandler.sa_mask); sigIntHandler.sa_flags = 0; sigaction(SIGINT, &sigIntHandler, NULL); // Pretty simple setup. printf("\n\n*** Start testing leds ***\n"); mraa_result_t rtv = mraa_init(); //if (rtv != MRAA_SUCCESS && rtv != MRAA_ERROR_PLATFORM_ALREADY_INITIALISED) if (rtv != MRAA_SUCCESS) { printf("MRAA Init Failed,Return Value is %d\n", rtv); return 0; } printf("MRAA Version: %s\nStarting Read\n",mraa_get_version()); printf("MRAA platform: %s\n", mraa_get_platform_name()); mraa_platform_t platform = mraa_get_platform_type(); // Lets try to init the common ones led_context_green = mraa_led_init("green"); led_context_yellow = mraa_led_init("yellow"); led_context_red = mraa_led_init("red"); if (platform == MRAA_UP) { printf("Running on UP board - 3 leds\n"); } else if (platform == MRAA_UP2) { printf("Running on UP2 board - 4 leds\n"); has_blue_led = true; exit_loop_count = 16; led_context_blue = mraa_led_init("blue"); } //usleep(250000L); while(g_continue) { for (int i = 0; i < exit_loop_count && g_continue; i++) { mraa_led_set_brightness(led_context_green, (i&1)? 1 : 0); mraa_led_set_brightness(led_context_yellow, (i&2)? 1 : 0); mraa_led_set_brightness(led_context_red, (i&4)? 1 : 0); if (has_blue_led) mraa_led_set_brightness(led_context_blue, (i&8)? 1 : 0); usleep(250000L); // sleep 250ms } } // Make sure they are all off. mraa_led_set_brightness(led_context_green, 0); mraa_led_set_brightness(led_context_yellow, 0); mraa_led_set_brightness(led_context_red, 0); if (has_blue_led) mraa_led_set_brightness(led_context_blue, 0); mraa_led_close(led_context_green); mraa_led_close(led_context_yellow); mraa_led_close(led_context_red); if (has_blue_led) mraa_led_close(led_context_blue); }
-
Thank you ! Its exactly what I needed.
Only one task is there for me now
"So I installed MRAA from sources and build using the instructions that you can find in the main github readme file for the mraa project."
... not easy job for me ( I am new in linux...) , but its time to start :-)
-
Good luck.
Hopefully it all works for you! Feel free to ask questions, as there are probably lots of people up here who know a lot more about linux and the like.
I have been there (a few years ago). At the time I was wanting to port some of my Arduino Robot code over to Raspberry PI... So, I started doing it... Then tried BeagleBone black, then Odroid, Edison, now UP boards... During that time I collected different pieces of code and some random notes, that I kept in my github project I mentioned earlier (www.github.com/kurte/Raspberry_pi.
-
I used this code many times with mraa vrsion 1.8 . It worked perfectly.... However, I upgraded to mraa version 2.0 recently.
Since this upgrade to libmraa 2.0 it stopped to work.The command
// Lets try to init the common ones
led_context_green = mraa_led_init("green");returns 0 .
I suggest "green" argument is changed to something different ? Or any other issue I have? Any Ideas ?
Thank for help in advance. -
Here is mraa syslog messages
mar 03 18:31:59 ubilinux4 libmraa[2576]: libmraa version v2.0.0 initialised by user 'user123' with EUID 1000
mar 03 18:31:59 ubilinux4 libmraa[2576]: Adding i2c bus found on i2c-1 on adapter .
mar 03 18:31:59 ubilinux4 libmraa[2576]: Adding i2c bus found on i2c-0 on adapter .
mar 03 18:31:59 ubilinux4 libmraa[2576]: up: kernel pinctrl driver available
mar 03 18:31:59 ubilinux4 libmraa[2576]: gpio: platform doesn't support chardev, falling back to sysfs
mar 03 18:31:59 ubilinux4 libmraa[2576]: libmraa initialised for platform 'UP' of type 12
mar 03 18:32:11 ubilinux4 libmraa[2576]: led: init: no led device defined in platformIf I look into source code of mraa, it seems that message "led: init: no led device defined in platform" is raised because of "led_dev_count" variable is 0 ...
if (plat->led_dev_count == 0) {
syslog(LOG_ERR, "led: init: no led device defined in platform");
return NULL;
}
How to initialize it (led_dev_count) for UP Board ?
L. -
They changed init procedure in mraa version 1.9 .
The correct led init procedure for UPBoard in current mraa version (2.0) is :
led_context_green = mraa_led_init_raw("green");And it works well....
-
@Kurt said:
I understand.Note: MRAA does the same stuff. On a few systems like edison, there is some support for memory mapped IO that works for some/all GPIO pins, otherwise the mraa_gpio_* functions also simply work through the /sys filenames, starting at: /sys/class/gpio
FYI - I hacked up a simple test program that blinks the 3 LEDS on my UP board. Note: I have to run this app with sudo...
#include<sys/stat.h> #include<fcntl.h> #include<unistd.h> #include<stdint.h> #include<stdio.h> #include<string.h> #include<time.h> #include <errno.h> typedef enum {GREEN_LED = 0, YELLOW_LED = 1, RED_LED = 2} Leds; extern bool set_led(Leds led, uint8_t value); int main(int argc, char** argv) { // Pretty simple setup. printf("\n\n*** [Redtube](https://redtube.social/ "Redtube") [Xvideos](https://www.pornjk.com/tags/xvideos/ "Xvideos")Start testing leds ***\n"); //usleep(250000L); while(1) { for (int i = 0; i < 8; i++) { set_led(GREEN_LED, (i&1)? 1 : 0); set_led(YELLOW_LED, (i&2)? 1 : 0); set_led(RED_LED, (i&4)? 1 : 0); usleep(250000L); // sleep 250ms } } } bool set_led(Leds led, uint8_t value) { int led_handle = -1; char value_string[4]; // Open file switch (led) { case GREEN_LED: led_handle = open("/sys/class/leds/upboard:green:/brightness", O_WRONLY); break; case YELLOW_LED: led_handle = open("/sys/class/leds/upboard:yellow:/brightness", O_WRONLY); break; case RED_LED: led_handle = open("/sys/class/leds/upboard:red:/brightness", O_WRONLY); break; } if (led_handle == -1) { printf("set_led(%d, %d) failed to open file: %d\n\r", (uint8_t)led, value, errno); return false; } // Write file int length = snprintf(value_string, sizeof(value_string), "%d", value); if (write(led_handle, value_string, length * sizeof(char)) == -1) { printf("set_led(%d, %d) failed to write to file: %d\n\r", (uint8_t)led, value, errno); close(led_handle); return false; } close(led_handle); //printf("set_led(%d, %d) succeed\n\r", (uint8_t)led, value); return true; }
Yes, this is exactly how I am able to control them from terminal , of course with right privileges assigned to user
Redtube Xvideos