authorNathael Pajani <nathael.pajani@ed3l.fr>
Tue, 22 Sep 2015 18:39:08 +0000 (20:39 +0200)
committerNathael Pajani <nathael.pajani@ed3l.fr>
Tue, 22 Sep 2015 18:39:08 +0000 (20:39 +0200)
Still to be tested as I2C is not yet functionnal

include/lib/dt_mod_identification.h
lib/dt_mod_identification.c

index 2ca9d4a..9e2cc7e 100644 (file)
 
 #include <stdint.h>
 
-#define MODULES_I2C_BUS  2 /* FIXME */
+#define MODULES_I2C_BUS  1
+
+#define NB_MODULES_MAX 4
+
+#define MODULE_SELECT_0  LPC_GPIO_1_25
+#define MODULE_SELECT_1  LPC_GPIO_1_26
+#define MODULE_SELECT_2  LPC_GPIO_1_28
+#define MODULE_SELECT_3  LPC_GPIO_1_29
 
-#define NB_MODULES_MAX 5
-#define CPL_MODULE_NUM 4
 
 #define UEXT_MOD_HAS_NONE  0
 #define UEXT_MOD_HAS_UART (1 << 0)
@@ -57,13 +62,34 @@ struct module_desc {
 } __attribute__ ((packed));
 
 struct module {
-       uint8_t slot; /* 0 .. 4 : position on UEXT connectors or CPL module */
+       uint8_t slot; /* 0 .. 3 : position on UEXT connectors */
        uint8_t type; /* EEPROM_TYPE_* */
        struct module_desc desc;
        char* name;
 };
 
 
+/* Module "mutex" for Module access using SPI / I2C.
+ * These functions return 0 upon success, or -1 upon error (one module already active or
+ *   invalid module number)
+ */
+/* Get hold of a module and activate I2C clock
+ * This selects a module for I2C eeprom reading for identification process.
+ * This function will set the module select signal low.
+ * Use this function for I2C access to the module.
+ */
+int module_select(uint32_t module_num);
+/* Get hold of a module, but do not activate I2C clock / SPI Chip select
+ * Use this function for SPI access to the module.
+ */
+int module_get(uint32_t module_num);
+/* Release a module
+ * This function will set the module select signal high.
+ */
+int module_release(uint32_t module_num);
+
+
+
 /* Probe for module presence in 'slot' UEXT connector.
  *  returns 1 if a module eeprom has been found, 0 if not, and -1 on error.
  */
index 406e859..213ea4f 100644 (file)
@@ -67,44 +67,62 @@ int set_system_uart(uint32_t uart_num)
 static uint32_t active_module = NO_MODULES_SELECTED;
 /* These are the pins used on the DTPlug for the modules chip select */
 static struct pio modules_cs_pins[NB_MODULES_MAX] = {
-       LPC_GPIO_1_25,
-       LPC_GPIO_1_26,
-       LPC_GPIO_1_28,
-       LPC_GPIO_1_29,
-       LPC_GPIO_2_6,
+       MODULE_SELECT_0,
+       MODULE_SELECT_1,
+       MODULE_SELECT_2,
+       MODULE_SELECT_3,
 };
-/* This one is the "i2c detect" pin to be used wuth the chip select signals */
-static struct pio modules_i2c_select = LPC_GPIO_1_19;
 
-/* Select a module (activate I2C clock) */
+
+/***************************************************************************** */
+/* Module "mutex" for Module access using SPI / I2C.
+ * These functions return 0 upon success, or -1 upon error (one module already active or
+ *   invalid module number)
+ */
+
+/* Get hold of a module and activate I2C clock
+ * This selects a module for I2C eeprom reading for identification process.
+ * This function will set the module select signal low.
+ * Use this function for I2C access to the module.
+ */
 int module_select(uint32_t module_num)
 {
        if ((active_module != NO_MODULES_SELECTED) || (module_num >= NB_MODULES_MAX))
                return -1;
        
-       if (module_num != CPL_MODULE_NUM) {
-               gpio_clear(modules_i2c_select);
-       }
+       msleep(1);
        gpio_clear(modules_cs_pins[module_num]);
 
        active_module = module_num;
        return 0;
 }
-/* Release a module */
+/* Get hold of a module, but do not activate I2C clock / SPI Chip select
+ * Use this function for SPI access to the module.
+ */
+int module_get(uint32_t module_num)
+{
+       if ((active_module != NO_MODULES_SELECTED) || (module_num >= NB_MODULES_MAX))
+               return -1;
+       active_module = module_num;
+       return 0;
+}
+/* Release a module
+ * This function will set the module select signal high.
+ */
 int module_release(uint32_t module_num)
 {
        if (module_num != active_module)
                return -1;
 
-       if (module_num != CPL_MODULE_NUM) {
-               gpio_set(modules_i2c_select);
-       }
        gpio_set(modules_cs_pins[module_num]);
+       msleep(1);
 
        active_module = NO_MODULES_SELECTED;
        return 0;
 }
 
+
+/***************************************************************************** */
 /* Probe for module presence in 'slot' UEXT connector.
  *  Return value :
  *   EEPROM_TYPE_SMALL if a module eeprom has been found at address A0 (1kbytes or 2kbytes eeproms)
@@ -171,13 +189,21 @@ int modules_probe(void)
        int found = 0;
 
        for (i = 0; i < NB_MODULES_MAX; i++) {
-               int ret = check_module_presence(i);
+               int ret = 0;
+
+               /* Configure slave select pin as GPIO and set initial level to 1 (not selected) */
+               config_gpio(&(modules_cs_pins[i]), LPC_IO_MODE_PULL_UP, GPIO_DIR_OUT, 1);
+
+               /* Check for module presence by reading the identification EEPROM */
+               ret = check_module_presence(i);
                if (ret <= EEPROM_TYPE_NONE) {
                        continue;
                }
+               /* Update module information */
                modules[i].slot = i;
                modules[i].type = ret;
                module_get_header(i, &(modules[i].desc));
+               found++;
        }
        return found;
 }