aboutsummaryrefslogtreecommitdiffstats
path: root/os/hal
diff options
context:
space:
mode:
authorbarthess <barthess@yandex.ru>2015-03-05 15:59:32 +0300
committerbarthess <barthess@yandex.ru>2015-03-05 15:59:32 +0300
commitae1ce0ea2bcad5962831dae78afde8575b9d7675 (patch)
treec2f112006a506b32dac0d98e0f0d5db8aa833b96 /os/hal
parente75668f53b3347044e5029d296ee6a7915627063 (diff)
downloadChibiOS-Contrib-ae1ce0ea2bcad5962831dae78afde8575b9d7675.tar.gz
ChibiOS-Contrib-ae1ce0ea2bcad5962831dae78afde8575b9d7675.tar.bz2
ChibiOS-Contrib-ae1ce0ea2bcad5962831dae78afde8575b9d7675.zip
EICU. Timer widht (16-32 bits) now stored in driver field and detected durign startup
Diffstat (limited to 'os/hal')
-rw-r--r--os/hal/ports/STM32/LLD/eicu_lld.c20
-rw-r--r--os/hal/ports/STM32/LLD/eicu_lld.h12
2 files changed, 26 insertions, 6 deletions
diff --git a/os/hal/ports/STM32/LLD/eicu_lld.c b/os/hal/ports/STM32/LLD/eicu_lld.c
index 0245128..415a649 100644
--- a/os/hal/ports/STM32/LLD/eicu_lld.c
+++ b/os/hal/ports/STM32/LLD/eicu_lld.c
@@ -149,7 +149,7 @@ static eicuresult_t get_time_both(EICUDriver *eicup,
unsigned subtraction math.*/
/* 16-bit timer */
- if (0xFFFF == eicup->tim->ARR) {
+ if (EICU_WIDTH_16 == eicup->width) {
uint16_t cmp = compare;
uint16_t la = chp->last_active;
uint16_t li = chp->last_idle;
@@ -159,7 +159,7 @@ static eicuresult_t get_time_both(EICUDriver *eicup,
ret.period = p;
}
/* 32-bit timer */
- else if (0xFFFFFFFF == eicup->tim->ARR) {
+ else if (EICU_WIDTH_32 == eicup->width) {
ret.width = chp->last_idle - chp->last_active;
ret.period = compare - chp->last_active;
return ret;
@@ -193,14 +193,14 @@ static eicucnt_t get_time_width(EICUDriver *eicup,
unsigned subtraction math.*/
/* 16-bit timer */
- if (0xFFFF == eicup->tim->ARR) {
+ if (EICU_WIDTH_16 == eicup->width) {
uint16_t cmp = compare;
uint16_t la = chp->last_active;
uint16_t ret = cmp - la;
return ret;
}
/* 32-bit timer */
- else if (0xFFFFFFFF == eicup->tim->ARR) {
+ else if (EICU_WIDTH_32 == eicup->width) {
return compare - chp->last_active;
}
/* error trap */
@@ -231,14 +231,14 @@ static eicucnt_t get_time_period(EICUDriver *eicup,
unsigned subtraction math.*/
/* 16-bit timer */
- if (0xFFFF == eicup->tim->ARR) {
+ if (EICU_WIDTH_16 == eicup->width) {
uint16_t cmp = compare;
uint16_t li = chp->last_idle;
uint16_t ret = cmp - li;
return ret;
}
/* 32-bit timer */
- else if (0xFFFFFFFF == eicup->tim->ARR) {
+ else if (EICU_WIDTH_32 == eicup->width) {
return compare - chp->last_idle;
}
/* error trap */
@@ -807,6 +807,14 @@ void eicu_lld_start(EICUDriver *eicup) {
eicup->tim->PSC = (uint16_t)psc;
eicup->tim->ARR = (eicucnt_t)-1;
+ /* Detect width.*/
+ if (0xFFFFFFFF == eicup->tim->ARR)
+ eicup->width = EICU_WIDTH_32;
+ else if (0xFFFF == eicup->tim->ARR)
+ eicup->width = EICU_WIDTH_16;
+ else
+ osalSysHalt("Unsupported width");
+
/* Reset registers */
eicup->tim->SMCR = 0;
eicup->tim->CCMR1 = 0;
diff --git a/os/hal/ports/STM32/LLD/eicu_lld.h b/os/hal/ports/STM32/LLD/eicu_lld.h
index 4f10893..9b04ab2 100644
--- a/os/hal/ports/STM32/LLD/eicu_lld.h
+++ b/os/hal/ports/STM32/LLD/eicu_lld.h
@@ -282,6 +282,14 @@ typedef enum {
} eicucapturemode_t;
/**
+ * @brief Timer registers width in bits.
+ */
+typedef enum {
+ EICU_WIDTH_16,
+ EICU_WIDTH_32
+} eicutimerwidth_t;
+
+/**
* @brief EICU frequency type.
*/
typedef uint32_t eicufreq_t;
@@ -391,6 +399,10 @@ struct EICUDriver {
*/
uint32_t clock;
/**
+ * @brief Timer registers width in bits.
+ */
+ eicutimerwidth_t width;
+ /**
* @brief Pointer to configuration for the driver.
*/
const EICUConfig *config;