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:
committed by
Brendan Le Foll
parent
c2787441b4
commit
6a1ed23246
@@ -31,6 +31,7 @@
|
|||||||
#include <linux/spi/spidev.h>
|
#include <linux/spi/spidev.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
#include <sys/utsname.h>
|
||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "x86/intel_edison_fab_c.h"
|
#include "x86/intel_edison_fab_c.h"
|
||||||
@@ -45,7 +46,7 @@
|
|||||||
// Might not always be correct. First thing to check if mmap stops
|
// Might not always be correct. First thing to check if mmap stops
|
||||||
// working. Check the device for 0x1199 and Intel Vendor (0x8086)
|
// working. Check the device for 0x1199 and Intel Vendor (0x8086)
|
||||||
#define MMAP_PATH "/sys/devices/pci0000:00/0000:00:0c.0/resource0"
|
#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 {
|
typedef struct {
|
||||||
int sysfs;
|
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,
|
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 };
|
226, 227, 228, 229, 208, 209, 210, 211, 212, 213 };
|
||||||
static int miniboard = 0;
|
static int miniboard = 0;
|
||||||
|
static int vanilla_kernel = 0;
|
||||||
|
|
||||||
// MMAP
|
// MMAP
|
||||||
static uint8_t* mmap_reg = NULL;
|
static uint8_t* mmap_reg = NULL;
|
||||||
@@ -115,6 +117,11 @@ mraa_intel_edison_pinmode_change(int sysfs, int mode)
|
|||||||
return MRAA_SUCCESS;
|
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];
|
char buffer[MAX_SIZE];
|
||||||
int useDebugFS = 0;
|
int useDebugFS = 0;
|
||||||
|
|
||||||
@@ -140,7 +147,7 @@ mraa_intel_edison_pinmode_change(int sysfs, int mode)
|
|||||||
|
|
||||||
mraa_result_t ret = MRAA_SUCCESS;
|
mraa_result_t ret = MRAA_SUCCESS;
|
||||||
char mode_buf[MAX_MODE_SIZE];
|
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) {
|
if (write(modef, mode_buf, length * sizeof(char)) == -1) {
|
||||||
ret = MRAA_ERROR_INVALID_RESOURCE;
|
ret = MRAA_ERROR_INVALID_RESOURCE;
|
||||||
}
|
}
|
||||||
@@ -233,6 +240,7 @@ mraa_intel_edison_i2c_init_pre(unsigned int bus)
|
|||||||
if (miniboard == 0) {
|
if (miniboard == 0) {
|
||||||
if (bus != 6) {
|
if (bus != 6) {
|
||||||
syslog(LOG_ERR, "edison: You can't use that bus, switching to 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_write(tristate, 0);
|
||||||
mraa_gpio_context io18_gpio = mraa_gpio_init_raw(14);
|
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 io0_pullup = mraa_gpio_init_raw(216);
|
||||||
mraa_gpio_context io1_output = mraa_gpio_init_raw(249);
|
mraa_gpio_context io1_output = mraa_gpio_init_raw(249);
|
||||||
mraa_gpio_context io1_pullup = mraa_gpio_init_raw(217);
|
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_output, MRAA_GPIO_OUT);
|
||||||
mraa_gpio_dir(io0_pullup, MRAA_GPIO_OUT);
|
mraa_gpio_dir(io0_pullup, MRAA_GPIO_OUT);
|
||||||
mraa_gpio_dir(io1_output, MRAA_GPIO_OUT);
|
mraa_gpio_dir(io1_output, MRAA_GPIO_OUT);
|
||||||
mraa_gpio_dir(io1_pullup, MRAA_GPIO_IN);
|
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_output, 0);
|
||||||
mraa_gpio_write(io0_pullup, 0);
|
mraa_gpio_write(io0_pullup, 0);
|
||||||
mraa_gpio_write(io1_output, 1);
|
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_output);
|
||||||
mraa_gpio_close(io0_pullup);
|
mraa_gpio_close(io0_pullup);
|
||||||
mraa_gpio_close(io1_output);
|
mraa_gpio_close(io1_output);
|
||||||
mraa_gpio_close(io1_pullup);
|
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;
|
mraa_result_t ret;
|
||||||
@@ -681,10 +708,8 @@ mraa_intel_edison_uart_init_pre(int index)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
ret = mraa_intel_edison_pinmode_change(131, 1); // IO1 TX
|
ret = mraa_intel_edison_pinmode_change(131, 1); // IO1 TX
|
||||||
if (ret != MRAA_SUCCESS) {
|
ret = mraa_intel_edison_pinmode_change(128, 1); // IO2 CTS
|
||||||
syslog(LOG_ERR, "edison: Failed to preinit UART TX pin");
|
ret = mraa_intel_edison_pinmode_change(129, 1); // IO4 RTS
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1289,6 +1314,9 @@ mraa_board_t*
|
|||||||
mraa_intel_edison_fab_c()
|
mraa_intel_edison_fab_c()
|
||||||
{
|
{
|
||||||
mraa_gpio_dir_t tristate_dir;
|
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));
|
mraa_board_t* b = (mraa_board_t*) calloc(1, sizeof(mraa_board_t));
|
||||||
if (b == NULL) {
|
if (b == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -1296,6 +1324,25 @@ mraa_intel_edison_fab_c()
|
|||||||
|
|
||||||
b->platform_name = PLATFORM_NAME;
|
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) {
|
if (is_arduino_board() == 0) {
|
||||||
syslog(LOG_NOTICE,
|
syslog(LOG_NOTICE,
|
||||||
"edison: Arduino board not detected, assuming Intel Edison Miniboard");
|
"edison: Arduino board not detected, assuming Intel Edison Miniboard");
|
||||||
|
|||||||
Reference in New Issue
Block a user