diff --git a/include/grisp.h b/include/grisp.h index 868df85..c3d61f1 100644 --- a/include/grisp.h +++ b/include/grisp.h @@ -36,11 +36,24 @@ extern "C" { #define GRISP #define GRISP_PLATFORM_GRISP_BASE #define GRISP_PLATFORM "grisp_base" +#define grisp_is_industrialgrisp() false #endif #if defined LIBBSP_ARM_IMX_BSP_H #define GRISP #define GRISP_PLATFORM_GRISP2 #define GRISP_PLATFORM "grisp2" + +#include +#include + +static inline bool grisp_is_industrialgrisp(void) +{ + const void *fdt = bsp_fdt_get(); + const int node = fdt_path_offset(fdt, "/"); + const char igrisp_compat[] = "embeddedbrains,industrialgrisp"; + + return (fdt_node_check_compatible(fdt, node, igrisp_compat) == 0); +} #endif #ifdef __cplusplus diff --git a/include/grisp/init.h b/include/grisp/init.h index e27552c..cab3bde 100644 --- a/include/grisp/init.h +++ b/include/grisp/init.h @@ -50,13 +50,17 @@ extern "C" { #define GRISP_I2C0_DEVICE "/dev/i2c-0" #define GRISP_I2C1_FDT_ALIAS "i2c1" #define GRISP_I2C1_DEVICE "/dev/i2c-1" + +#define GRISP_INDUSTRIAL_SPI_ONBOARD_FDT_ALIAS "spi0" +#define GRISP_INDUSTRIAL_SPI_PMOD_FDT_ALIAS "spi2" +#define GRISP_INDUSTRIAL_I2C_FDT_ALIAS "i2c0" #endif typedef void (*grisp_check_and_create_wlandev)(void); void grisp_init_buses(void); void grisp_init_libbsd(void); -void grisp_init_sd_card(void); +void grisp_init_sd_card(const char *rootdir); void grisp_init_lower_self_prio(void); rtems_status_code grisp_init_wait_for_sd(void); void grisp_saf1761_basic_init(void); diff --git a/src/init.c b/src/init.c index fe299b3..f4f8a1c 100644 --- a/src/init.c +++ b/src/init.c @@ -88,8 +88,10 @@ static rtems_id wait_mounted_task_id = RTEMS_INVALID_ID; static rtems_status_code media_listener(rtems_media_event event, rtems_media_state state, - const char *src, const char *dest, void *arg) + const char *src, const char *dest, const char *arg) { + char fdt_target[192] = ""; + printf( "media listener: event = %s, state = %s, src = %s", rtems_media_event_description(event), @@ -102,13 +104,20 @@ media_listener(rtems_media_event event, rtems_media_state state, } if (arg != NULL) { - printf(", arg = %p\n", arg); + strlcpy(fdt_target, arg, 192); + size_t length = strlen(arg); + if (fdt_target[length - 1] == '/') { + fdt_target[length - 1] = '\0'; + } + printf(", fdt_target = %s\n", fdt_target); } printf("\n"); if (event == RTEMS_MEDIA_EVENT_MOUNT && - state == RTEMS_MEDIA_STATE_SUCCESS) { + state == RTEMS_MEDIA_STATE_SUCCESS && + dest != NULL && arg != NULL && + strcmp(dest, fdt_target) == 0) { rtems_event_send(wait_mounted_task_id, EVT_MOUNTED); } @@ -168,7 +177,7 @@ grisp_init_lower_self_prio(void) } void -grisp_init_sd_card(void) +grisp_init_sd_card(const char *rootdir) { rtems_status_code sc; @@ -180,7 +189,7 @@ grisp_init_sd_card(void) sc = rtems_media_initialize(); assert(sc == RTEMS_SUCCESSFUL); - sc = rtems_media_listener_add(media_listener, NULL); + sc = rtems_media_listener_add(media_listener, rootdir); assert(sc == RTEMS_SUCCESSFUL); sc = rtems_media_server_initialize( diff --git a/src/led.c b/src/led.c index c425078..0d86bff 100644 --- a/src/led.c +++ b/src/led.c @@ -32,6 +32,7 @@ #include #include +#include #include #ifdef LIBBSP_ARM_ATSAM_BSP_H @@ -109,7 +110,8 @@ static struct { struct imx_gpio_pin green; struct imx_gpio_pin blue; } leds[2]; -struct imx_gpio_pin led_som; +static struct imx_gpio_pin led_som; +static bool only_green_led; static void grisp2_init_led_by_fdt( @@ -133,12 +135,19 @@ grisp2_init_leds(void) const void *fdt; fdt = bsp_fdt_get(); - grisp2_init_led_by_fdt(&leds[0].red, fdt, "/leds/grisp-rgb1-red"); - grisp2_init_led_by_fdt(&leds[0].green, fdt, "/leds/grisp-rgb1-green"); - grisp2_init_led_by_fdt(&leds[0].blue, fdt, "/leds/grisp-rgb1-blue"); - grisp2_init_led_by_fdt(&leds[1].red, fdt, "/leds/grisp-rgb2-red"); - grisp2_init_led_by_fdt(&leds[1].green, fdt, "/leds/grisp-rgb2-green"); - grisp2_init_led_by_fdt(&leds[1].blue, fdt, "/leds/grisp-rgb2-blue"); + if (grisp_is_industrialgrisp()) { + grisp2_init_led_by_fdt(&leds[0].green, fdt, "/leds/igrisp-mcu-led"); + grisp2_init_led_by_fdt(&leds[1].green, fdt, "/leds/igrisp-rfid-led"); + only_green_led = true; + } else { + grisp2_init_led_by_fdt(&leds[0].red, fdt, "/leds/grisp-rgb1-red"); + grisp2_init_led_by_fdt(&leds[0].green, fdt, "/leds/grisp-rgb1-green"); + grisp2_init_led_by_fdt(&leds[0].blue, fdt, "/leds/grisp-rgb1-blue"); + grisp2_init_led_by_fdt(&leds[1].red, fdt, "/leds/grisp-rgb2-red"); + grisp2_init_led_by_fdt(&leds[1].green, fdt, "/leds/grisp-rgb2-green"); + grisp2_init_led_by_fdt(&leds[1].blue, fdt, "/leds/grisp-rgb2-blue"); + only_green_led = false; + } grisp2_init_led_by_fdt(&led_som, fdt, "/leds/phycore-green"); } @@ -149,9 +158,11 @@ grisp_led_set(int led_nr, bool r, bool g, bool b) pthread_once(&once, grisp2_init_leds); if (led_nr != LED_SOM) { - imx_gpio_set_output(&leds[led_nr-1].red, r ? 1 : 0); + if (!only_green_led) { + imx_gpio_set_output(&leds[led_nr-1].red, r ? 1 : 0); + imx_gpio_set_output(&leds[led_nr-1].blue, b ? 1 : 0); + } imx_gpio_set_output(&leds[led_nr-1].green, g ? 1 : 0); - imx_gpio_set_output(&leds[led_nr-1].blue, b ? 1 : 0); } else { imx_gpio_set_output(&led_som, g ? 1 : 0); }