From 71ec65ccabe66f2dabf0fceb2fb51eee8c6b673f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Cl=C3=A9ment=20Foucher?= <cfoucher@laas.fr>
Date: Tue, 29 Mar 2022 14:13:10 +0200
Subject: [PATCH] Add capability for finer configuration of HRTIM ADC event
 generation; Separate event generation postscaler.

---
 .../zephyr/src/hrtim_common.c                 |  7 ++-
 .../src/voltage_mode/hrtim_voltage_mode.c     | 55 ++++++++++++++++---
 .../src/voltage_mode/hrtim_voltage_mode.h     | 21 +++++--
 3 files changed, 69 insertions(+), 14 deletions(-)

diff --git a/zephyr/modules/owntech_hrtim_driver/zephyr/src/hrtim_common.c b/zephyr/modules/owntech_hrtim_driver/zephyr/src/hrtim_common.c
index 8629b66..f3c9281 100644
--- a/zephyr/modules/owntech_hrtim_driver/zephyr/src/hrtim_common.c
+++ b/zephyr/modules/owntech_hrtim_driver/zephyr/src/hrtim_common.c
@@ -18,10 +18,14 @@
  */
 
 /**
+ * @date   2022
+ *
  * @author Clément Foucher <clement.foucher@laas.fr>
  * @author Luiz Villa <luiz.villa@laas.fr>
  */
 
+#include <stm32_ll_hrtim.h>
+
 #include "voltage_mode/hrtim_voltage_mode.h"
 #include "current_mode/hrtim_current_mode.h"
 #include "leg.h"
@@ -29,7 +33,8 @@
 
 void _hrtim_init_events()
 {
-	hrtim_adc_trigger_en(0, ADC1R, AD13_TAC3);
+	hrtim_adc_trigger_set_postscaler(0, 9);
+	hrtim_adc_trigger_en(1, 1, LL_HRTIM_ADCTRIG_SRC13_TIMACMP3);
 	hrtim_cmp_set(0, TIMA, CMP3xR, 1);
 }
 
diff --git a/zephyr/modules/owntech_hrtim_driver/zephyr/src/voltage_mode/hrtim_voltage_mode.c b/zephyr/modules/owntech_hrtim_driver/zephyr/src/voltage_mode/hrtim_voltage_mode.c
index e59163c..b3b7b0b 100644
--- a/zephyr/modules/owntech_hrtim_driver/zephyr/src/voltage_mode/hrtim_voltage_mode.c
+++ b/zephyr/modules/owntech_hrtim_driver/zephyr/src/voltage_mode/hrtim_voltage_mode.c
@@ -18,6 +18,8 @@
  */
 
 /**
+ * @date        2022
+ *
  * @ingroup     cpu_stm32
  * @ingroup     drivers_periph_hrtim
 
@@ -31,6 +33,7 @@
  */
 
 #include <stm32_ll_rcc.h>
+#include <stm32_ll_hrtim.h>
 
 #include "hrtim_voltage_mode.h"
 #include "assert.h"
@@ -524,16 +527,50 @@ void hrtim_pwm_dt(hrtim_t hrtim, hrtim_tu_t tu, uint16_t ns)
     * set) or if its outputs are enabled and set/reset by another timer. */
 }
 
-void hrtim_adc_trigger_en(hrtim_t hrtim, hrtim_adc_t adc, hrtim_adc_trigger_t evt)
+void hrtim_adc_trigger_set_postscaler(hrtim_t hrtim, uint32_t ps_ratio)
 {
-    dev(hrtim)->sCommonRegs.CR1 |= HRTIM_CR1_ADC1USRC_0; // ADC trigger 1 update source
-    dev(hrtim)->sCommonRegs.ADCPS1 |= 9;
-    switch (adc) {
-        case ADC1R: dev(hrtim)->sCommonRegs.ADC1R |= evt; break;
-        case ADC2R: dev(hrtim)->sCommonRegs.ADC2R |= evt; break;
-        case ADC3R: dev(hrtim)->sCommonRegs.ADC3R |= evt; break;
-        case ADC4R: dev(hrtim)->sCommonRegs.ADC4R |= evt; break;
-    }
+	dev(hrtim)->sCommonRegs.ADCPS1 |= ps_ratio;
+}
+
+void hrtim_adc_trigger_en(uint32_t event_number, uint32_t source_timer, uint32_t event)
+{
+	uint32_t adcTrig = LL_HRTIM_ADCTRIG_1;
+	uint32_t update = LL_HRTIM_ADCTRIG_UPDATE_MASTER;
+
+	switch (event_number)
+	{
+		case 1:
+			adcTrig = LL_HRTIM_ADCTRIG_1;
+			break;
+		case 2:
+			adcTrig = LL_HRTIM_ADCTRIG_2;
+			break;
+		case 3:
+			adcTrig = LL_HRTIM_ADCTRIG_3;
+			break;
+		case 4:
+			adcTrig = LL_HRTIM_ADCTRIG_4;
+			break;
+	}
+
+	switch (source_timer)
+	{
+		case 1:
+			update = LL_HRTIM_ADCTRIG_UPDATE_TIMER_A;
+			break;
+		case 2:
+			update = LL_HRTIM_ADCTRIG_UPDATE_TIMER_B;
+			break;
+		case 3:
+			update = LL_HRTIM_ADCTRIG_UPDATE_TIMER_C;
+			break;
+		case 4:
+			update = LL_HRTIM_ADCTRIG_UPDATE_TIMER_D;
+			break;
+	}
+
+	LL_HRTIM_SetADCTrigSrc(HRTIM1, adcTrig, event);
+	LL_HRTIM_SetADCTrigUpdate(HRTIM1, adcTrig, update);
 }
 
 void hrtim_adc_trigger_dis(hrtim_t hrtim, hrtim_adc_t adc, hrtim_adc_trigger_t evt)
diff --git a/zephyr/modules/owntech_hrtim_driver/zephyr/src/voltage_mode/hrtim_voltage_mode.h b/zephyr/modules/owntech_hrtim_driver/zephyr/src/voltage_mode/hrtim_voltage_mode.h
index 4de4e49..cc3d861 100644
--- a/zephyr/modules/owntech_hrtim_driver/zephyr/src/voltage_mode/hrtim_voltage_mode.h
+++ b/zephyr/modules/owntech_hrtim_driver/zephyr/src/voltage_mode/hrtim_voltage_mode.h
@@ -18,6 +18,8 @@
  */
 
 /**
+ * @date        2022
+ *
  * @defgroup    drivers_periph_hrtim OwnTech's hrtim module
  * @ingroup     drivers_periph
  * @brief       Low-level HRTIM peripheral driver
@@ -522,13 +524,24 @@ void hrtim_out_dis(hrtim_t dev, hrtim_tu_t tu, hrtim_out_t out);
 void hrtim_pwm_dt(hrtim_t dev, hrtim_tu_t tu, uint16_t ns);
 
 /**
- * @brief   Enable an ADCx trigger event
+ * @brief   Set the HRTIM event postsaler. Postscaler ratio indicates
+ *          how many potential events will be ignored between two
+ *          events which are effectively generated.
  *
  * @param[in] dev           HRTIM device
- * @param[in] adc           ADC trigger register from ADC1R to ADC4R
- * @param[in] evt           Trigger event
+ * @param[in] ps_ratio      Post scaler ratio (0 = no post scaler, default)
+ */
+void hrtim_adc_trigger_set_postscaler(hrtim_t dev, uint32_t ps_ratio);
+
+/**
+ * @brief   Configures and enables an ADC trigger event.
+ *
+ * @param[in] event_number  Number of the event to configure
+ * @param[in] source_timer  Source timer of the event. 0 = Master timer, 1 = Timer A, 2 = Timer B, etc.
+ * @param[in] event         Event as defined in stm32g4xx_ll_hrtim.h 'ADC TRIGGER X/X SOURCE'
  */
-void hrtim_adc_trigger_en(hrtim_t dev, hrtim_adc_t adc, hrtim_adc_trigger_t evt);
+void hrtim_adc_trigger_en(uint32_t event_number, uint32_t source_timer, uint32_t event);
+
 
 /**
  * @brief   Disbable a ADCx trigger event
-- 
GitLab