Debian 10 (Buster) has gcc 8.2 which warns about: error: ‘%s’ directive output may be truncated writing up to 19 bytes into a region of size between 10 and 59 [-Werror=format-truncation=] snprintf(path, sizeof(path), "%s/%s/state", ocp_dir, pinmux_dir);
57 lines
1.6 KiB
C
57 lines
1.6 KiB
C
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <syslog.h>
|
|
|
|
#include "c_pinmux.h"
|
|
#include "common.h"
|
|
|
|
|
|
BBIO_err set_pin_mode(const char *key, const char *mode)
|
|
{
|
|
// char ocp_dir[] defined in common.h
|
|
char path[100]; // "/sys/devices/platform/ocp/ocp:P#_##_pinmux/state"
|
|
char pinmux_dir[20]; // "ocp:P#_##_pinmux"
|
|
char pin[6]; //"P#_##"
|
|
FILE *f = NULL;
|
|
|
|
// pin mode can not be set for the built-in USRn LEDs
|
|
if (strncmp(key, "USR", 3) == 0) {
|
|
return BBIO_OK;
|
|
}
|
|
|
|
if (strlen(key) == 4) // Key P#_# format, must inject '0' to be P#_0#
|
|
snprintf(pin, sizeof(pin), "%.3s0%c", key,key[3]);
|
|
else //copy string
|
|
snprintf(pin, sizeof(pin), "%s", key);
|
|
|
|
#ifndef BBBVERSION41
|
|
BBIO_err err;
|
|
err = build_path("/sys/devices/platform", "ocp", ocp_dir, sizeof(ocp_dir));
|
|
if (err != BBIO_OK) {
|
|
return err;
|
|
}
|
|
#else
|
|
strncpy(ocp_dir, "/sys/devices/platform/ocp", sizeof(ocp_dir));
|
|
#endif
|
|
|
|
snprintf(pinmux_dir, sizeof(pinmux_dir), "ocp:%s_pinmux", pin);
|
|
snprintf(path, sizeof(path), "%s/%s/state", ocp_dir, pinmux_dir);
|
|
|
|
/* beaglebone blue has complete dtb file and does not need overlays */
|
|
if(beaglebone_blue()) {
|
|
fprintf(stderr, "DEBUG: Adafruit_BBIO: set_pin_mode() :: Pinmux file: %s, mode: %s", path, mode);
|
|
fprintf(stderr, "DEBUG: Adafruit_BBIO: set_pin_mode(): beaglebone_blue() is TRUE; return BBIO_OK\n");
|
|
return BBIO_OK;
|
|
}
|
|
|
|
|
|
f = fopen(path, "w");
|
|
if (NULL == f) {
|
|
return BBIO_ACCESS;
|
|
}
|
|
syslog(LOG_DEBUG, "Adafruit_BBIO: set_pin_mode() :: Pinmux file %s access OK", path);
|
|
fprintf(f, "%s", mode);
|
|
fclose(f);
|
|
syslog(LOG_DEBUG, "Adafruit_BBIO: set_pin_mode() :: Set pinmux mode to %s for %s", mode, pin);
|
|
return BBIO_OK;
|
|
}
|