aboutsummaryrefslogtreecommitdiffstats
path: root/os/hal
diff options
context:
space:
mode:
Diffstat (limited to 'os/hal')
-rw-r--r--os/hal/include/onewire.h164
-rw-r--r--os/hal/src/onewire.c26
2 files changed, 142 insertions, 48 deletions
diff --git a/os/hal/include/onewire.h b/os/hal/include/onewire.h
index a5ebaa4..290a9b3 100644
--- a/os/hal/include/onewire.h
+++ b/os/hal/include/onewire.h
@@ -27,8 +27,6 @@
#ifndef _ONEWIRE_H_
#define _ONEWIRE_H_
-#include "hal.h" //FIXME: delete this line when integration done
-
#if HAL_USE_ONEWIRE || defined(__DOXYGEN__)
/*===========================================================================*/
@@ -36,7 +34,7 @@
/*===========================================================================*/
/**
* @brief Enable synthetic test for 'search ROM' procedure.
- * @note Only for debugging/testing.
+ * @note Only for debugging/testing!
*/
#define ONEWIRE_SYNTH_SEARCH_TEST FALSE
@@ -58,6 +56,14 @@
/* Derived constants and error checks. */
/*===========================================================================*/
+#if !HAL_USE_PWM
+#error "1-wire Driver requires HAL_USE_PWM"
+#endif
+
+#if !HAL_USE_PAL
+#error "1-wire Driver requires HAL_USE_PAL"
+#endif
+
/*===========================================================================*/
/* Driver data structures and types. */
/*===========================================================================*/
@@ -83,11 +89,11 @@ typedef uint_fast8_t (*onewire_read_bit_t)(void);
* @brief Driver state machine possible states.
*/
typedef enum {
- ONEWIRE_UNINIT = 0,
- ONEWIRE_STOP = 1,
- ONEWIRE_READY = 2,
+ ONEWIRE_UNINIT = 0, /**< Not initialized. */
+ ONEWIRE_STOP = 1, /**< Stopped. */
+ ONEWIRE_READY = 2, /**< Ready. */
#if ONEWIRE_USE_STRONG_PULLUP
- ONEWIRE_PULL_UP
+ ONEWIRE_PULL_UP /**< Pull up asserted. */
#endif
} onewire_state_t;
@@ -95,87 +101,177 @@ typedef enum {
* @brief Search ROM procedure possible state.
*/
typedef enum {
- ONEWIRE_SEARCH_ROM_SUCCESS = 0,
- ONEWIRE_SEARCH_ROM_LAST,
- ONEWIRE_SEARCH_ROM_ERROR
+ ONEWIRE_SEARCH_ROM_SUCCESS = 0, /**< ROM successfully discovered. */
+ ONEWIRE_SEARCH_ROM_LAST = 1, /**< Last ROM successfully discovered. */
+ ONEWIRE_SEARCH_ROM_ERROR = 2 /**< Error happened during search. */
} search_rom_result_t;
/**
* @brief Search ROM procedure iteration enum.
*/
typedef enum {
- ONEWIRE_SEARCH_ROM_FIRST = 0,
- ONEWIRE_SEARCH_ROM_NEXT
+ ONEWIRE_SEARCH_ROM_FIRST = 0, /**< First search run. */
+ ONEWIRE_SEARCH_ROM_NEXT = 1 /**< Next search run. */
} search_iteration_t;
/**
* @brief Driver configuration structure.
*/
typedef struct {
+ /**
+ * @brief Pointer to @p PWM driver used for communication.
+ */
PWMDriver *pwmd;
+ /**
+ * @brief Number of PWM channel used as master pulse generator.
+ */
size_t master_channel;
+ /**
+ * @brief Number of PWM channel used as sample interrupt generator.
+ */
size_t sample_channel;
+ /**
+ * @brief Pointer to function performing read of single bit.
+ * @note It must be callable from any context.
+ */
onewire_read_bit_t readBitX;
#if ONEWIRE_USE_STRONG_PULLUP
+ /**
+ * @brief Pointer to function asserting of strong pull up.
+ */
onewire_pullup_assert_t pullup_assert;
+ /**
+ * @brief Pointer to function releasing of strong pull up.
+ */
onewire_pullup_release_t pullup_release;
#endif
} onewireConfig;
/**
- * @brief Some small variable used in 'search ROM' procedure combined
- * in single machine word to save RAM.
+ * @brief Search ROM registry. Contains small variables used
+ * in 'search ROM' procedure.
*/
typedef struct {
- uint32_t single_device: 1; /**< @brief Bool flag */
- uint32_t search_iter: 1; /**< @brief 0 - first, 1 - next */
- uint32_t result: 2; /**< @brief 0 - success, 1 - last, 2 - error.*/
- uint32_t bit_step: 2; /**< @brief 0 - direct, 1 - complemented, 2 - generated by master. */
- uint32_t bit_buf: 2; /**< @brief Acquired bits. 0s - direct, 1st - complement */
- uint32_t rombit: 7; /**< @brief Currently processing ROM bit. Must be big enough to store number 64.*/
- uint32_t devices_found: 8; /**< @brief Devices count discovered on bus .*/
+ /**
+ * @brief Bool flag. If @p true than only bus has only one slave device.
+ */
+ uint32_t single_device: 1;
+ /**
+ * @brief Search iteration (@p search_iteration_t enum).
+ */
+ uint32_t search_iter: 1;
+ /**
+ * @brief Result of discovery procedure (@p search_rom_result_t enum).
+ */
+ uint32_t result: 2;
+ /**
+ * @brief One of 3 steps of bit discovery.
+ * @details 0 - direct, 1 - complemented, 2 - generated by master.
+ */
+ uint32_t bit_step: 2;
+ /**
+ * @brief Values acquired during bit discovery.
+ */
+ uint32_t bit_buf: 2;
+ /**
+ * @brief Currently processing ROM bit.
+ * @note Must be big enough to store number 64.
+ */
+ uint32_t rombit: 7;
+ /**
+ * @brief Total device count discovered on bus.
+ * @note Maximum 256.
+ */
+ uint32_t devices_found: 8;
} search_rom_reg_t;
/**
* @brief Helper structure for 'search ROM' procedure
*/
typedef struct {
+ /**
+ * @brief Search ROM registry.
+ */
search_rom_reg_t reg;
- uint8_t *retbuf; /* buffer for currently discovering ROM */
+ /**
+ * @brief Pointer to buffer with currently discovering ROM
+ */
+ uint8_t *retbuf;
+ /**
+ * @brief Previously discovered ROM.
+ */
uint8_t prev_path[8];
- int8_t last_zero_branch; /* negative values uses to point out of tree root */
- int8_t prev_zero_branch; /* negative values uses to point out of tree root */
+ /**
+ * @brief Last zero turn branch.
+ * @note Negative values use to point out of device tree's root.
+ */
+ int8_t last_zero_branch;
+ /**
+ * @brief Previous zero turn branch.
+ * @note Negative values use to point out of device tree's root.
+ */
+ int8_t prev_zero_branch;
} onewire_search_rom_t;
/**
- * @brief Some small variable used in driver combined
+ * @brief Onewire registry. Some small variables combined
* in single machine word to save RAM.
*/
typedef struct {
#if ONEWIRE_USE_STRONG_PULLUP
/**
- * @brief This flag will be asserted by driver to signalize
- * ISR part when strong pullup needed.
+ * @brief This flag will be asserted by driver to signalizes
+ * ISR part when strong pull up needed.
*/
uint32_t need_pullup: 1;
#endif
- uint32_t slave_present: 1; /**< @brief Bool flag */
- uint32_t state: 2; /**< @brief Driver state */
- uint32_t bit: 4; /**< @brief Bit number in currently receiving byte. Must be big enough to store 8 */
- uint32_t final_timeslot: 1; /**< @brief bool flag for premature timer stop prevention */
- uint32_t bytes: 16; /**< @brief Bytes number to be processing in current transaction. */
+ /**
+ * @brief Bool flag. If @p true than at least one device presence on bus.
+ */
+ uint32_t slave_present: 1;
+ /**
+ * @brief Driver internal state (@p onewire_state_t enum).
+ */
+ uint32_t state: 2;
+ /**
+ * @brief Bit number in currently receiving/sending byte.
+ * @note Must be big enough to store 8.
+ */
+ uint32_t bit: 4;
+ /**
+ * @brief Bool flag for premature timer stop prevention.
+ */
+ uint32_t final_timeslot: 1;
+ /**
+ * @brief Bytes number to be processing in current transaction.
+ */
+ uint32_t bytes: 16;
} onewire_reg_t;
/**
- * @brief Structure representing an 1-wire driver.
+ * @brief Structure representing an 1-wire driver.
*/
typedef struct {
+ /**
+ * @brief Onewire registry.
+ */
onewire_reg_t reg;
+ /**
+ * @brief Onewire config.
+ */
const onewireConfig *config;
+ /**
+ * @brief Config for underlying PWM driver.
+ */
PWMConfig pwmcfg;
+ /**
+ * @brief Pointer to I/O data buffer.
+ */
uint8_t *buf;
+ /**
+ * @brief Search ROM helper structure.
+ */
onewire_search_rom_t search_rom;
-
/**
* @brief Thread waiting for I/O completion.
*/
diff --git a/os/hal/src/onewire.c b/os/hal/src/onewire.c
index 0717893..825bb63 100644
--- a/os/hal/src/onewire.c
+++ b/os/hal/src/onewire.c
@@ -18,19 +18,19 @@
/* Main ideas: */
/*===========================================================================
-1) switch PWM output pin it opendrain mode.
-2) start 2 channels simultaneously. First (master channel) generates
+1) switch PWM output pin it open drain mode.
+2) start 2 channels _simultaneously_. First (master channel) generates
pulses (read time slots) second (sample channel) generates interrupts
from where read pin function calls.
-- ---------------------------------------------- master channel
- | /
- ----
-- ------------------------------------ sample channel
- | |
- ------------------
- ^
- read interrupt here
+- --------------------------------------- master channel generates pulses
+ | /
+ --
+- ----------------------------- sample channel reads pad state
+ | |
+ ----------------
+ ^
+ | read interrupt fires here
For data write it is only master channel needed. Data bit width updates
on every timer overflow event.
@@ -39,8 +39,6 @@ on every timer overflow event.
/*===========================================================================*/
/* General recommendations for strong pull usage */
/*===========================================================================
- *
- *
* 1) Use separate power rail instead of strong pull up whenever possible.
* Driver's strong pull up feature is very interrupt jitter sensible.
* 2) Use special 1-wire bus master (DS2484 for example) if you are
@@ -101,7 +99,7 @@ onewireDriver OWD1;
/* Driver local variables and types. */
/*===========================================================================*/
/**
- * @brief Config for fast intialization of all fields
+ * @brief Config for fast initialization of all fields
*/
static const PWMConfig pwm_default_cfg = {
1000000,
@@ -837,7 +835,7 @@ size_t onewireSearchRom(onewireDriver *owp, uint8_t *result,
}
/*
- * Included (if enabled) test code
+ * Include test code (if enabled).
*/
#if ONEWIRE_SYNTH_SEARCH_TEST
#include "search_rom_synth.c"