From 68269179800f3f90bf70dda889e752ff1952b04f Mon Sep 17 00:00:00 2001
From: Sergi Hernandez Juan <shernand@iri.upc.edu>
Date: Thu, 15 Feb 2018 17:27:12 +0100
Subject: [PATCH] Modified the ADC module to use the TMemory data structures.

---
 Makefile                    |   2 +-
 include/adc_dma.h           |   7 ++-
 include/adc_dma_registers.h |  30 +++++++++++
 include/darwin_conf.h       |   3 ++
 include/darwin_registers.h  |  33 ------------
 src/adc_dma.c               | 103 ++++++++++++++++++++----------------
 src/cm730_fw.c              |   3 +-
 7 files changed, 96 insertions(+), 85 deletions(-)
 create mode 100644 include/adc_dma_registers.h

diff --git a/Makefile b/Makefile
index c603cfd..cfd15ca 100755
--- a/Makefile
+++ b/Makefile
@@ -12,7 +12,7 @@ TARGET_FILES+=src/system_stm32f1xx.c
 TARGET_FILES+=src/gpio.c
 #TARGET_FILES+=src/darwin_time.c
 TARGET_FILES+=src/eeprom.c
-#TARGET_FILES+=src/adc_dma.c
+TARGET_FILES+=src/adc_dma.c
 #TARGET_FILES+=src/imu.c
 #TARGET_FILES+=src/darwin_dyn_slave.c
 #TARGET_FILES+=src/darwin_dyn_master.c
diff --git a/include/adc_dma.h b/include/adc_dma.h
index db29c8d..674171f 100755
--- a/include/adc_dma.h
+++ b/include/adc_dma.h
@@ -6,13 +6,15 @@ extern "C" {
 #endif
 
 #include "stm32f1xx.h"
+#include "adc_dma_registers.h"
+#include "memory.h"
 
 #define      ADC_NUM_CHANNELS      12
 
 typedef enum {ADC_CH1=0,ADC_CH2=1,ADC_CH3=2,ADC_CH4=3,ADC_CH5=4,ADC_CH6=5,ADC_CH7=6,ADC_CH8=7,
               ADC_CH9=8,ADC_CH10=9,ADC_CH12=10} adc_ch_t;
 
-void adc_init(void);
+uint8_t adc_init(TMemory *memory);
 void adc_start(void);
 void adc_set_period(uint8_t period_ms);
 inline uint8_t adc_get_period(void);
@@ -20,9 +22,6 @@ unsigned short adc_get_channel(adc_ch_t channel);
 unsigned short adc_get_channel_raw(adc_ch_t channel);
 unsigned short adc_get_temperature(void);
 void adc_stop(void);
-// operation functions
-uint8_t adc_in_range(unsigned short int address,unsigned short int length);
-void adc_process_write_cmd(unsigned short int address,unsigned short int length,unsigned char *data);
 
 #ifdef __cplusplus
 }
diff --git a/include/adc_dma_registers.h b/include/adc_dma_registers.h
new file mode 100644
index 0000000..a0a6366
--- /dev/null
+++ b/include/adc_dma_registers.h
@@ -0,0 +1,30 @@
+#ifndef _ADC_DMA_REGISTERS_H
+#define _ADC_DMA_REGISTERS_H
+
+#ifndef RAM_ADC_DMA_BASE_ADDRESS
+  #define RAM_ADC_DMA_BASE_ADDRESS            ((unsigned short int)0x0000)
+#endif
+
+#define RAM_ADC_DMA_LENGTH                    26
+
+#define ADC_CNTRL                             RAM_ADC_DMA_BASE_ADDRESS// bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2 | bit 1 | bit 0
+                                                                      //       |       |       |       |       |       |       | Enable
+#define ADC_PERIOD                            (RAM_ADC_DMA_BASE_ADDRESS+1)
+#define ADC_CH1_VOLTAGE                       (RAM_ADC_DMA_BASE_ADDRESS+2)
+#define ADC_CH2_VOLTAGE                       (RAM_ADC_DMA_BASE_ADDRESS+4)
+#define ADC_CH3_VOLTAGE                       (RAM_ADC_DMA_BASE_ADDRESS+6)
+#define ADC_CH4_VOLTAGE                       (RAM_ADC_DMA_BASE_ADDRESS+8)
+#define ADC_CH5_VOLTAGE                       (RAM_ADC_DMA_BASE_ADDRESS+10)
+#define ADC_CH6_VOLTAGE                       (RAM_ADC_DMA_BASE_ADDRESS+12)
+#define ADC_CH7_VOLTAGE                       (RAM_ADC_DMA_BASE_ADDRESS+14)
+#define ADC_CH8_VOLTAGE                       (RAM_ADC_DMA_BASE_ADDRESS+16)
+#define ADC_CH9_VOLTAGE                       (RAM_ADC_DMA_BASE_ADDRESS+18)
+#define ADC_CH10_VOLTAGE                      (RAM_ADC_DMA_BASE_ADDRESS+20)
+#define ADC_TEMP                              (RAM_ADC_DMA_BASE_ADDRESS+22)
+#define ADC_CH12_VOLTAGE                      (RAM_ADC_DMA_BASE_ADDRESS+24)
+
+#define ADC_START                             0x01
+#define ADC_STOP                              0x02
+#define ADC_RUNNING                           0x10
+
+#endif
diff --git a/include/darwin_conf.h b/include/darwin_conf.h
index f88b914..e0a776b 100644
--- a/include/darwin_conf.h
+++ b/include/darwin_conf.h
@@ -7,4 +7,7 @@
 /* GPIO configuration */
 #define RAM_GPIO_BASE_ADDRESS                 ((unsigned short int)0x0100)
 
+/* ADC configuration */
+#define RAM_ADC_DMA_BASE_ADDRESS              ((unsigned short int)0x0115)
+
 #endif
diff --git a/include/darwin_registers.h b/include/darwin_registers.h
index bd2cc32..7ae3534 100644
--- a/include/darwin_registers.h
+++ b/include/darwin_registers.h
@@ -254,33 +254,6 @@ typedef enum {
   DARWIN_STAIRS_X_SHIFT_BODY           = STAIRS_X_SHIFT_BODY,
 
 //RAM  
-  DARWIN_ADC_CNTRL                 = 0x0115, // bit 7 | bit 6 | bit 5 |  bit 4  | bit 3 | bit 2 | bit 1 | bit 0
-                                             //       |       |       | running |       |       | start | stop
-  DARWIN_ADC_PERIOD                = 0x0116,
-  DARWIN_ADC_CH1_L                 = 0x0117,
-  DARWIN_ADC_CH1_H                 = 0x0118,
-  DARWIN_ADC_CH2_L                 = 0x0119,
-  DARWIN_ADC_CH2_H                 = 0x011A,
-  DARWIN_ADC_CH3_L                 = 0x011B,
-  DARWIN_ADC_CH3_H                 = 0x011C,
-  DARWIN_ADC_CH4_L                 = 0x011D,
-  DARWIN_ADC_CH4_H                 = 0x011E,
-  DARWIN_ADC_CH5_L                 = 0x011F,
-  DARWIN_ADC_CH5_H                 = 0x0120,
-  DARWIN_ADC_CH6_L                 = 0x0121,
-  DARWIN_ADC_CH6_H                 = 0x0122,
-  DARWIN_ADC_CH7_L                 = 0x0123,
-  DARWIN_ADC_CH7_H                 = 0x0124,
-  DARWIN_ADC_CH8_L                 = 0x0125,
-  DARWIN_ADC_CH8_H                 = 0x0126,
-  DARWIN_ADC_CH9_L                 = 0x0127,
-  DARWIN_ADC_CH9_H                 = 0x0128,
-  DARWIN_ADC_CH10_L                = 0x0129,
-  DARWIN_ADC_CH10_H                = 0x012A,
-  DARWIN_ADC_TEMP_L                = 0x012B,
-  DARWIN_ADC_TEMP_H                = 0x012C,
-  DARWIN_ADC_CH12_L                = 0x012D,
-  DARWIN_ADC_CH12_H                = 0x012E,
   DARWIN_IMU_CNTRL                 = 0x013B, //   bit 7   |   bit 6  |    bit 5    |  bit 4  | bit 3 |    bit 2   | bit 1 | bit 0
                                              // accel_det | gyro_det | calibrating | running |       | start_cal  | stop  | start
   DARWIN_IMU_CAL_SAMPLES_L         = 0x013C,
@@ -613,12 +586,6 @@ typedef enum {
                                                    //          current phase        | climbing | stop stairs  | start stairs down | start stairs up
 }darwin_registers;
 
-#define      ADC_BASE_ADDRESS        0x0115
-#define      ADC_MEM_LENGTH          30
-#define      ADC_START               0x01
-#define      ADC_STOP                0x02
-#define      ADC_RUNNING             0x10
-
 #define      IMU_BASE_ADDRESS        0x013B
 #define      IMU_MEM_LENGTH          15
 #define      IMU_START               0x01
diff --git a/src/adc_dma.c b/src/adc_dma.c
index eb0f821..cef91c3 100755
--- a/src/adc_dma.c
+++ b/src/adc_dma.c
@@ -77,6 +77,9 @@ ADC_HandleTypeDef hadc2;
 DMA_HandleTypeDef hdma_adc1; 
 TIM_HandleTypeDef ADC_TIM_Handle;
 
+/* memory module */
+TMemModule adc_mem_module;
+
 uint32_t adc_data[6];// temporal buffer to store ADC data before conversion
 uint16_t adc_period_ms;
 
@@ -99,6 +102,24 @@ uint16_t adc_convert_voltage(uint16_t value)
   return conv_value*(1<<12);
 }
 
+void adc_write_cmd(void *module,unsigned short int address,unsigned short int length,unsigned char *data)
+{
+  if(ram_in_range(ADC_CNTRL,address,length))
+  {
+    if(data[ADC_CNTRL-address]&ADC_START)
+      adc_start();
+    else if(data[ADC_CNTRL-address]&ADC_STOP)
+      adc_stop();
+  }
+  if(ram_in_range(ADC_PERIOD,address,length))
+    adc_set_period(data[ADC_PERIOD-address]);
+}
+
+void adc_read_cmd(void *module,unsigned short int address,unsigned short int length,unsigned char *data)
+{
+  ram_read_table(address,length,data);
+}
+
 // interrupt handlers
 void ADC_TIMER_IRQHandler(void)
 {
@@ -153,24 +174,24 @@ void ADC_DMA_IRQHandler(void)
         if(i==5)
         {
           value=adc_convert_temperature(adc_data[i]&0x0000FFFF);
-          ram_data[DARWIN_ADC_TEMP_L]=value%256;
-          ram_data[DARWIN_ADC_TEMP_H]=value/256;
+          ram_data[ADC_TEMP]=value%256;
+          ram_data[ADC_TEMP+1]=value/256;
         }
         else
         {
           value=adc_convert_voltage(adc_data[i]&0x0000FFFF);
-          ram_data[DARWIN_ADC_CH1_L+i*4]=value%256;
-          ram_data[DARWIN_ADC_CH1_H+i*4]=value/256;
+          ram_data[ADC_CH1_VOLTAGE+i*4]=value%256;
+          ram_data[ADC_CH1_VOLTAGE+1+i*4]=value/256;
         }
         value=adc_convert_voltage((adc_data[i]&0xFFFF0000)>>16);
-        ram_data[DARWIN_ADC_CH2_L+i*4]=value%256;
-        ram_data[DARWIN_ADC_CH2_H+i*4]=value/256;
+        ram_data[ADC_CH2_VOLTAGE+i*4]=value%256;
+        ram_data[ADC_CH2_VOLTAGE+1+i*4]=value/256;
       }
     }
 }
 
 // public functions
-void adc_init(void)
+uint8_t adc_init(TMemory *memory)
 {
   GPIO_InitTypeDef GPIO_InitStruct; 	
   ADC_MultiModeTypeDef multimode;
@@ -183,7 +204,7 @@ void adc_init(void)
 
   /* initialize the internal variables */
   adc_period_ms=360;// equivalent to 10 ms
-  ram_data[DARWIN_ADC_PERIOD]=10;
+  ram_data[ADC_PERIOD]=10;
 
   /* enable clocks */
   ADC1_CH1_ENABLE_PORT_CLK;
@@ -353,22 +374,33 @@ void adc_init(void)
 
   HAL_ADC_Start(&hadc2);
   HAL_ADCEx_MultiModeStart_DMA(&hadc1,adc_data,6);
+
+  /* initialize memory module */
+  mem_module_init(&adc_mem_module);
+  adc_mem_module.write_cmd=adc_write_cmd;
+  adc_mem_module.read_cmd=adc_read_cmd;
+  if(!mem_module_add_ram_segment(&adc_mem_module,RAM_ADC_DMA_BASE_ADDRESS,RAM_ADC_DMA_LENGTH))
+    return 0x00;
+  if(!mem_add_module(memory,&adc_mem_module))
+    return 0x00;
+
+  return 0x01;
 }
 
 void adc_start(void)
 {
-  if((ram_data[DARWIN_ADC_CNTRL]&ADC_RUNNING)==0x00)
+  if((ram_data[ADC_CNTRL]&ADC_RUNNING)==0x00)
   {
-    ram_data[DARWIN_ADC_CNTRL]|=ADC_RUNNING;
+    ram_data[ADC_CNTRL]|=ADC_RUNNING;
     HAL_TIM_OC_Start_IT(&ADC_TIM_Handle, TIM_CHANNEL_1);
   }
 }
 
 void adc_stop(void)
 {
-  if(ram_data[DARWIN_ADC_CNTRL]&ADC_RUNNING)
+  if(ram_data[ADC_CNTRL]&ADC_RUNNING)
   {
-    ram_data[DARWIN_ADC_CNTRL]&=(~ADC_RUNNING);
+    ram_data[ADC_CNTRL]&=(~ADC_RUNNING);
     HAL_TIM_OC_Stop_IT(&ADC_TIM_Handle, TIM_CHANNEL_1);
   }
 }
@@ -376,12 +408,12 @@ void adc_stop(void)
 void adc_set_period(uint8_t period_ms)
 {
   adc_period_ms=period_ms*36;
-  ram_data[DARWIN_ADC_PERIOD]=period_ms;
+  ram_data[ADC_PERIOD]=period_ms;
 }
 
 inline uint8_t adc_get_period(void)
 {
-  return ram_data[DARWIN_ADC_PERIOD];
+  return ram_data[ADC_PERIOD];
 }
 
 uint16_t adc_get_channel(adc_ch_t channel)
@@ -390,27 +422,27 @@ uint16_t adc_get_channel(adc_ch_t channel)
 
   switch(channel)
   {
-    case ADC_CH1: value=ram_data[DARWIN_ADC_CH1_L]+ram_data[DARWIN_ADC_CH1_H]*256;
+    case ADC_CH1: value=ram_data[ADC_CH1_VOLTAGE]+ram_data[ADC_CH1_VOLTAGE+1]*256;
                   break;
-    case ADC_CH2: value=ram_data[DARWIN_ADC_CH2_L]+ram_data[DARWIN_ADC_CH2_H]*256;
+    case ADC_CH2: value=ram_data[ADC_CH2_VOLTAGE]+ram_data[ADC_CH2_VOLTAGE+1]*256;
                   break;
-    case ADC_CH3: value=ram_data[DARWIN_ADC_CH3_L]+ram_data[DARWIN_ADC_CH3_H]*256;
+    case ADC_CH3: value=ram_data[ADC_CH3_VOLTAGE]+ram_data[ADC_CH3_VOLTAGE+1]*256;
                   break;
-    case ADC_CH4: value=ram_data[DARWIN_ADC_CH4_L]+ram_data[DARWIN_ADC_CH4_H]*256;
+    case ADC_CH4: value=ram_data[ADC_CH4_VOLTAGE]+ram_data[ADC_CH4_VOLTAGE+1]*256;
                   break;
-    case ADC_CH5: value=ram_data[DARWIN_ADC_CH5_L]+ram_data[DARWIN_ADC_CH5_H]*256;
+    case ADC_CH5: value=ram_data[ADC_CH5_VOLTAGE]+ram_data[ADC_CH5_VOLTAGE+1]*256;
                   break;
-    case ADC_CH6: value=ram_data[DARWIN_ADC_CH6_L]+ram_data[DARWIN_ADC_CH6_H]*256;
+    case ADC_CH6: value=ram_data[ADC_CH6_VOLTAGE]+ram_data[ADC_CH6_VOLTAGE+1]*256;
                   break;
-    case ADC_CH7: value=ram_data[DARWIN_ADC_CH7_L]+ram_data[DARWIN_ADC_CH7_H]*256;
+    case ADC_CH7: value=ram_data[ADC_CH7_VOLTAGE]+ram_data[ADC_CH7_VOLTAGE+1]*256;
                   break;
-    case ADC_CH8: value=ram_data[DARWIN_ADC_CH8_L]+ram_data[DARWIN_ADC_CH8_H]*256;
+    case ADC_CH8: value=ram_data[ADC_CH8_VOLTAGE]+ram_data[ADC_CH8_VOLTAGE+1]*256;
                   break;
-    case ADC_CH9: value=ram_data[DARWIN_ADC_CH9_L]+ram_data[DARWIN_ADC_CH9_H]*256;
+    case ADC_CH9: value=ram_data[ADC_CH9_VOLTAGE]+ram_data[ADC_CH9_VOLTAGE+1]*256;
                   break;
-    case ADC_CH10: value=ram_data[DARWIN_ADC_CH10_L]+ram_data[DARWIN_ADC_CH10_H]*256;
+    case ADC_CH10: value=ram_data[ADC_CH10_VOLTAGE]+ram_data[ADC_CH10_VOLTAGE+1]*256;
                    break;
-    case ADC_CH12: value=ram_data[DARWIN_ADC_CH12_L]+ram_data[DARWIN_ADC_CH12_H]*256;
+    case ADC_CH12: value=ram_data[ADC_CH12_VOLTAGE]+ram_data[ADC_CH12_VOLTAGE+1]*256;
                    break;
     default: value=0x0000;
   }
@@ -454,25 +486,6 @@ uint16_t adc_get_channel_raw(adc_ch_t channel)
 
 uint16_t adc_get_temperature(void)
 {
-  return ram_data[DARWIN_ADC_TEMP_L]+ram_data[DARWIN_ADC_TEMP_H]*256;
-}
-
-// operation functions
-uint8_t adc_in_range(unsigned short int address,unsigned short int length)
-{
-  return ram_in_window(ADC_BASE_ADDRESS,ADC_MEM_LENGTH,address,length);
-}
-
-void adc_process_write_cmd(unsigned short int address,unsigned short int length,unsigned char *data)
-{
-  if(ram_in_range(DARWIN_ADC_CNTRL,address,length))
-  {
-    if(data[DARWIN_ADC_CNTRL-address]&ADC_START)
-      adc_start();
-    else if(data[DARWIN_ADC_CNTRL-address]&ADC_STOP)
-      adc_stop();
-  }
-  if(ram_in_range(DARWIN_ADC_PERIOD,address,length))
-    adc_set_period(data[DARWIN_ADC_PERIOD-address]);
+  return ram_data[ADC_TEMP]+ram_data[ADC_TEMP+1]*256;
 }
 
diff --git a/src/cm730_fw.c b/src/cm730_fw.c
index 6514ca2..f8ba5f2 100755
--- a/src/cm730_fw.c
+++ b/src/cm730_fw.c
@@ -1,6 +1,5 @@
 #include "stm32f1xx_hal.h"
 #include "darwin_conf.h"
-#include "darwin_registers.h"
 #include "memory.h"
 #include "gpio.h"
 #include "eeprom.h"
@@ -31,7 +30,7 @@ int main(void)
   /* initialize the GPIO module */
   gpio_init(&darwin_memory);
   // initialize adc
-//  adc_init();
+  adc_init(&darwin_memory);
   // initialize imu
 //  imu_init();
   // initialize time module
-- 
GitLab