Private
Public Access
2
0

imraa: add first version of IO pinmuxing and clean up

Signed-off-by: Longwei Su <lsu@ics.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
This commit is contained in:
longwei su
2016-03-15 23:37:40 -04:00
committed by Brendan Le Foll
parent 405e601387
commit 0fb2aed7af
2 changed files with 100 additions and 33 deletions

View File

@@ -35,6 +35,8 @@
#include <mraa/uart.h>
#include <mraa/gpio.h>
#include <mraa/i2c.h>
#include <mraa/pwm.h>
#include <mraa_internal.h>
@@ -44,7 +46,7 @@ typedef struct mraa_io_objects_t {
const char* type;
int index;
bool raw;
char* label;
const char* label;
} mraa_io_objects_t;
const char*
@@ -54,7 +56,7 @@ imraa_list_serialport()
struct udev_enumerate* enumerate;
struct udev_list_entry *devices, *dev_list_entry;
struct udev_device* dev;
const char* ret;
const char* ret = NULL;
udev = udev_new();
if (!udev) {
printf("Can't create udev, check libudev\n");
@@ -118,7 +120,7 @@ imraa_flash_101(const char* bin_path, const char* bin_file_name, const char* tty
int i;
// dfu list is still needed, as the time for reset and recognized is varies from platform to
// platform.
// one dfu able to query available device, then it is ready to flash
// once dfu able to query available devices, then it is ready to flash
for (i = 0; i < 10 && board_found == false; i++) {
printf("Waiting for device...\n");
// dfu-util -d,8087:0ABA -l
@@ -163,18 +165,19 @@ imraa_flash_101(const char* bin_path, const char* bin_file_name, const char* tty
strncat(full_dfu_upload, dfu_option, strlen(dfu_option));
printf("flash cmd: %s\n", full_dfu_upload);
int status = system(full_dfu_upload);
free(full_dfu_upload);
if (status != 0) {
printf("ERROR: Upload failed on %s\n", tty);
exit(1);
}
printf("SUCCESS: Sketch will execute in about 5 seconds.\n");
free(full_dfu_list);
free(full_dfu_upload);
sleep(5);
return 0;
}
void
imraa_write_lockfile(const char* lock_file_location)
imraa_write_lockfile(const char* lock_file_location, const char* serialport)
{
FILE* fh;
char str[10];
@@ -185,7 +188,7 @@ imraa_write_lockfile(const char* lock_file_location)
json_object* platform2 = json_object_new_object();
snprintf(str, 10, "%d", MRAA_GENERIC_FIRMATA);
json_object_object_add(platform2, "id", json_object_new_string(str));
json_object_object_add(platform2, "uart", json_object_new_string("/dev/ttyACM0"));
json_object_object_add(platform2, "uart", json_object_new_string(serialport));
json_object* platfroms = json_object_new_array();
json_object_array_add(platfroms, platform1);
@@ -196,7 +199,10 @@ imraa_write_lockfile(const char* lock_file_location)
if (fh != NULL) {
fputs(json_object_to_json_string_ext(lock_file, JSON_C_TO_STRING_PRETTY), fh);
fclose(fh);
} else {
fprintf(stderr, "can't write to lock file\n");
}
json_object_put(lock_file);
}
void
@@ -207,6 +213,7 @@ imraa_handle_subplatform(struct json_object* jobj)
const char* dfu_loc;
const char* lockfile_loc;
const char* flash_loc;
const char* usbserial;
struct json_object* dfu_location;
if (json_object_object_get_ex(jobj, "dfu-utils-location", &dfu_location) == true) {
@@ -244,61 +251,115 @@ imraa_handle_subplatform(struct json_object* jobj)
}
}
// got flash? do flash
if (access(lockfile_loc, F_OK) != -1) {
printf("already exist lock file, skip flashing\n");
printf("already exist a lock file, skip flashing\n");
printf("force upgrade? remove the lockfile first\n", lockfile_loc);
} else {
fprintf(stdout, "Starting to flash board\n");
// TODO define dfu location in conf?
// dfu_loc = "/usr/bin";
int flash_result = imraa_flash_101(dfu_loc, flash_loc, imraa_list_serialport());
imraa_write_lockfile(lockfile_loc);
//TODO flash img checksum, and serialport validation?
const char* serialport = (strcmp(usbserial, "auto") == 0)
? imraa_list_serialport() : usbserial;
if ( dfu_loc != NULL && flash_loc != NULL && serialport != NULL) {
if (imraa_flash_101(dfu_loc, flash_loc, serialport) == 0) {
imraa_write_lockfile(lockfile_loc, serialport);
} else {
fprintf(stderr, "Flash failed, push master reset and try again\n");
}
} else {
fprintf(stderr, "invalid flashing paramenters, please check agian\n");
fprintf(stderr, "DFU Util location: %s\n", dfu_loc);
fprintf(stderr, "Flash Img location: %s\n", dfu_loc);
fprintf(stderr, "USB Serial: %s\n", dfu_loc);
}
}
}
void
imraa_handle_IO(struct json_object* jobj)
{
struct mraa_io_objects_t* mraaobjs;
struct mraa_io_objects_t* mraa_io_obj;
struct json_object* ioarray;
int ionum = 0;
int i;
if (json_object_object_get_ex(jobj, "IO", &ioarray) == true) {
ionum = json_object_array_length(ioarray);
mraaobjs = malloc(sizeof(ioarray) * sizeof(mraa_io_objects_t));
mraa_io_obj = (mraa_io_objects_t*) malloc( ionum * sizeof(mraa_io_objects_t));
printf("Length of IO array is %d\n", ionum);
int index2 = -1;;//optional index for io configuration;
if (json_object_is_type(ioarray, json_type_array)) {
for (i = 0; i < ionum; i++) {
struct json_object* ioobj = json_object_array_get_idx(ioarray, i);
struct json_object* x;
if (json_object_object_get_ex(ioobj, "type", &x) == true) {
mraaobjs[i].type = json_object_get_string(x);
mraa_io_obj[i].type = json_object_get_string(x);
}
if (json_object_object_get_ex(ioobj, "index", &x) == true) {
mraaobjs[i].index = json_object_get_int(x);
mraa_io_obj[i].index = json_object_get_int(x);
}
if (json_object_object_get_ex(ioobj, "raw", &x) == true) {
mraaobjs[i].raw = json_object_get_boolean(x);
mraa_io_obj[i].raw = json_object_get_boolean(x);
}
if (json_object_object_get_ex(ioobj, "label", &x) == true) {
mraaobjs[i].index = json_object_get_int(x);
mraa_io_obj[i].label = json_object_get_string(x);
}
json_object_object_foreach(ioobj, key, val)
{
// fprintf(stderr, "key: %s\n", key);
// fprintf(stderr, "val: %s\n", json_object_get_string(val));
if (strncmp(key, "type", 4) == 0) {
if (strncmp(json_object_get_string(val), "gpio", 4) == 0) {
// mraa_gpio_context gpio = mraa_gpio_init(13);
// mraa_result_t r = mraa_gpio_owner(gpio, 0);
// if (r != MRAA_SUCCESS) {
// mraa_result_print(r);
// }
printf("set up gpio here\n");
} else if (strncmp(json_object_get_string(val), "i2c", 3) == 0) {
printf("set up i2c here\n");
}
if (json_object_object_get_ex(ioobj, "index2", &x) == true) {
index2 = json_object_get_int(x);
}
//starting io configuration
if(strcmp(mraa_io_obj[i].type, "gpio") == 0){
mraa_gpio_context gpio = NULL;
if(mraa_io_obj[i].raw){
printf("gpio raw init\n");
gpio = mraa_gpio_init_raw(mraa_io_obj[i].index);
} else {
printf("gpio init\n");
gpio = mraa_gpio_init(mraa_io_obj[i].index);
}
mraa_result_t r = mraa_gpio_owner(gpio, 0);
if (r != MRAA_SUCCESS) {
mraa_result_print(r);
}
} else if (strcmp(mraa_io_obj[i].type, "i2c") == 0) {
mraa_i2c_context i2c = NULL;
if(mraa_io_obj[i].raw){
printf("i2c raw init\n");
i2c = mraa_i2c_init_raw(mraa_io_obj[i].index);
} else {
printf("i2c init\n");
i2c = mraa_i2c_init(mraa_io_obj[i].index);
}
} else if (strcmp(mraa_io_obj[i].type, "pwm") == 0) {
mraa_pwm_context pwm = NULL;
if(mraa_io_obj[i].raw){
printf("pwm raw init\n");
pwm = mraa_pwm_init_raw(index2,mraa_io_obj[i].index);
} else {
printf("pwm init\n");
pwm = mraa_pwm_init(mraa_io_obj[i].index);
}
mraa_result_t r = mraa_pwm_owner(pwm, 0);
if (r != MRAA_SUCCESS) {
mraa_result_print(r);
}
} else if (strcmp(mraa_io_obj[i].type, "spi") == 0) {
mraa_spi_context spi = NULL;
if(mraa_io_obj[i].raw){
printf("spi raw init\n");
spi = mraa_spi_init_raw(mraa_io_obj[i].index, index2);
} else {
printf("spi init\n");
spi = mraa_spi_init(mraa_io_obj[i].index);
}
} else if (strcmp(mraa_io_obj[i].type, "uart") == 0) {
mraa_uart_context uart = NULL;
if(mraa_io_obj[i].raw){
printf("uart raw init\n");
uart = mraa_uart_init_raw(mraa_io_obj[i].label);
} else {
printf("uart init\n");
uart = mraa_uart_init(mraa_io_obj[i].index);
}
}
}
@@ -306,6 +367,7 @@ imraa_handle_IO(struct json_object* jobj)
fprintf(stderr, "IO array incorrectly parsed\n");
}
}
free(mraa_io_obj);
}
int
@@ -320,6 +382,8 @@ check_version(struct json_object* jobj)
fprintf(stderr, "version string incorrectly parsed\n");
return -1;
}
} else {
fprintf(stderr, "no version specified\n");
}
return 0;
}
@@ -391,5 +455,7 @@ main(int argc, char** argv)
imraa_handle_IO(jobj);
}
fclose(fh);
json_object_put(jobj);
free(buffer);
return EXIT_SUCCESS;
}

View File

@@ -1036,6 +1036,7 @@ mraa_add_from_lockfile(const char* imraa_lock_file) {
} else {
fprintf(stderr, "lockfile string incorrectly parsed\n");
}
json_object_put(jobj_lock);
free(buffer);
return subplat_num;
}