Private
Public Access
2
0

intel_edison_fab: enable support for vanilla kernels >= 4 for serial

This disables changing pinmux as this is envisioned to be done through acpi
provided by u-boot

Signed-off-by: Ferry Toth <ftoth@exalondelft.nl>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
This commit is contained in:
Ferry Toth
2017-06-30 23:34:41 +02:00
committed by Brendan Le Foll
parent c2787441b4
commit 6a1ed23246

View File

@@ -31,6 +31,7 @@
#include <linux/spi/spidev.h>
#include <errno.h>
#include <time.h>
#include <sys/utsname.h>
#include "common.h"
#include "x86/intel_edison_fab_c.h"
@@ -45,7 +46,7 @@
// Might not always be correct. First thing to check if mmap stops
// working. Check the device for 0x1199 and Intel Vendor (0x8086)
#define MMAP_PATH "/sys/devices/pci0000:00/0000:00:0c.0/resource0"
#define UART_DEV_PATH "/dev/ttyMFD1"
#define UART_DEV_PATH ((vanilla_kernel == 0)?"/dev/ttyMFD1":"/dev/ttyS1")
typedef struct {
int sysfs;
@@ -70,6 +71,7 @@ static mraa_gpio_context agpioOutputen[sizeof(outputen) / sizeof(outputen[0])];
static unsigned int pullup_map[] = { 216, 217, 218, 219, 220, 221, 222, 223, 224, 225,
226, 227, 228, 229, 208, 209, 210, 211, 212, 213 };
static int miniboard = 0;
static int vanilla_kernel = 0;
// MMAP
static uint8_t* mmap_reg = NULL;
@@ -115,6 +117,11 @@ mraa_intel_edison_pinmode_change(int sysfs, int mode)
return MRAA_SUCCESS;
}
if (vanilla_kernel != 0) {
syslog(LOG_NOTICE, "edison: Vanilla kernel does not support setting pinmux %d", sysfs);
return MRAA_SUCCESS;
}
char buffer[MAX_SIZE];
int useDebugFS = 0;
@@ -140,7 +147,7 @@ mraa_intel_edison_pinmode_change(int sysfs, int mode)
mraa_result_t ret = MRAA_SUCCESS;
char mode_buf[MAX_MODE_SIZE];
int length = snprintf(mode_buf, MAX_MODE_SIZE, "%s%u", useDebugFS ? "mode" : "", mode);
int length = sprintf(mode_buf, "%s%u", useDebugFS ? "mode" : "", mode);
if (write(modef, mode_buf, length * sizeof(char)) == -1) {
ret = MRAA_ERROR_INVALID_RESOURCE;
}
@@ -233,6 +240,7 @@ mraa_intel_edison_i2c_init_pre(unsigned int bus)
if (miniboard == 0) {
if (bus != 6) {
syslog(LOG_ERR, "edison: You can't use that bus, switching to bus 6");
bus = 6;
}
mraa_gpio_write(tristate, 0);
mraa_gpio_context io18_gpio = mraa_gpio_init_raw(14);
@@ -659,19 +667,38 @@ mraa_intel_edison_uart_init_pre(int index)
mraa_gpio_context io0_pullup = mraa_gpio_init_raw(216);
mraa_gpio_context io1_output = mraa_gpio_init_raw(249);
mraa_gpio_context io1_pullup = mraa_gpio_init_raw(217);
mraa_gpio_context io2_output = mraa_gpio_init_raw(250); /* CTS */
mraa_gpio_context io2_pullup = mraa_gpio_init_raw(218);
mraa_gpio_context io4_output = mraa_gpio_init_raw(252); /* RTS */
mraa_gpio_context io4_pullup = mraa_gpio_init_raw(220);
mraa_gpio_dir(io0_output, MRAA_GPIO_OUT);
mraa_gpio_dir(io0_pullup, MRAA_GPIO_OUT);
mraa_gpio_dir(io1_output, MRAA_GPIO_OUT);
mraa_gpio_dir(io1_pullup, MRAA_GPIO_IN);
mraa_gpio_dir(io2_output, MRAA_GPIO_OUT);
mraa_gpio_dir(io2_pullup, MRAA_GPIO_OUT);
mraa_gpio_dir(io4_output, MRAA_GPIO_OUT);
mraa_gpio_dir(io4_pullup, MRAA_GPIO_IN);
mraa_gpio_write(io0_output, 0);
mraa_gpio_write(io0_pullup, 0);
mraa_gpio_write(io1_output, 1);
mraa_gpio_write(io2_output, 0);
mraa_gpio_write(io2_pullup, 0);
mraa_gpio_write(io4_output, 1);
mraa_gpio_close(io0_output);
mraa_gpio_close(io0_pullup);
mraa_gpio_close(io1_output);
mraa_gpio_close(io1_pullup);
mraa_gpio_close(io2_output);
mraa_gpio_close(io2_pullup);
mraa_gpio_close(io4_output);
mraa_gpio_close(io4_pullup);
}
mraa_result_t ret;
@@ -681,10 +708,8 @@ mraa_intel_edison_uart_init_pre(int index)
return ret;
}
ret = mraa_intel_edison_pinmode_change(131, 1); // IO1 TX
if (ret != MRAA_SUCCESS) {
syslog(LOG_ERR, "edison: Failed to preinit UART TX pin");
}
ret = mraa_intel_edison_pinmode_change(128, 1); // IO2 CTS
ret = mraa_intel_edison_pinmode_change(129, 1); // IO4 RTS
return ret;
}
@@ -1289,6 +1314,9 @@ mraa_board_t*
mraa_intel_edison_fab_c()
{
mraa_gpio_dir_t tristate_dir;
struct utsname name;
int major, minor, release;
int ret;
mraa_board_t* b = (mraa_board_t*) calloc(1, sizeof(mraa_board_t));
if (b == NULL) {
return NULL;
@@ -1296,6 +1324,25 @@ mraa_intel_edison_fab_c()
b->platform_name = PLATFORM_NAME;
if (uname(&name) != 0) {
goto error;
}
ret = sscanf(name.release, "%d.%d.%d", &major, &minor, &release);
if (ret == 2) {
ret++;
release = 0;
}
if (ret < 2) {
goto error;
}
if (major >= 4) {
vanilla_kernel = 1;
syslog(LOG_NOTICE,
"edison: Linux version 4 or higher detected, assuming Vanilla kernel");
};
if (is_arduino_board() == 0) {
syslog(LOG_NOTICE,
"edison: Arduino board not detected, assuming Intel Edison Miniboard");