diff options
Diffstat (limited to 'testhal/STM32/STM32F0xx/onewire')
-rw-r--r-- | testhal/STM32/STM32F0xx/onewire/.project | 5 | ||||
-rw-r--r-- | testhal/STM32/STM32F0xx/onewire/Makefile | 10 | ||||
-rw-r--r-- | testhal/STM32/STM32F0xx/onewire/boarddef.h (renamed from testhal/STM32/STM32F0xx/onewire/onewire_test.h) | 22 | ||||
-rw-r--r-- | testhal/STM32/STM32F0xx/onewire/chconf.h | 1 | ||||
-rw-r--r-- | testhal/STM32/STM32F0xx/onewire/halconf.h | 64 | ||||
-rw-r--r-- | testhal/STM32/STM32F0xx/onewire/halconf_community.h | 6 | ||||
-rw-r--r-- | testhal/STM32/STM32F0xx/onewire/main.c | 2 | ||||
-rw-r--r-- | testhal/STM32/STM32F0xx/onewire/mcuconf.h | 12 | ||||
-rw-r--r-- | testhal/STM32/STM32F0xx/onewire/onewire_test.c | 257 | ||||
-rw-r--r-- | testhal/STM32/STM32F0xx/onewire/real_roms.txt | 27 | ||||
-rw-r--r-- | testhal/STM32/STM32F0xx/onewire/search_rom_synth.c | 370 |
11 files changed, 90 insertions, 686 deletions
diff --git a/testhal/STM32/STM32F0xx/onewire/.project b/testhal/STM32/STM32F0xx/onewire/.project index 6599a83..8776e6e 100644 --- a/testhal/STM32/STM32F0xx/onewire/.project +++ b/testhal/STM32/STM32F0xx/onewire/.project @@ -25,6 +25,11 @@ </natures>
<linkedResources>
<link>
+ <name>hw_abstracted</name>
+ <type>2</type>
+ <locationURI>PARENT-3-PROJECT_LOC/hw_abstracted</locationURI>
+ </link>
+ <link>
<name>os-community</name>
<type>2</type>
<locationURI>PARENT-4-PROJECT_LOC/os</locationURI>
diff --git a/testhal/STM32/STM32F0xx/onewire/Makefile b/testhal/STM32/STM32F0xx/onewire/Makefile index d121cee..de965e3 100644 --- a/testhal/STM32/STM32F0xx/onewire/Makefile +++ b/testhal/STM32/STM32F0xx/onewire/Makefile @@ -75,8 +75,9 @@ endif PROJECT = ch
# Imported source files and paths
-CHIBIOS = ../../../../../ChibiOS-RT +CHIBIOS = ../../../../../ChibiOS-RT
CHIBIOS_CONTRIB = $(CHIBIOS)/../ChibiOS-Contrib
+TESTHAL = $(CHIBIOS_CONTRIB)/testhal/common/onewire
# Startup files.
include $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk/startup_stm32f0xx.mk
# HAL-OSAL files (optional).
@@ -102,8 +103,8 @@ CSRC = $(STARTUPSRC) \ $(BOARDSRC) \
$(TESTSRC) \
main.c \
- onewire_test.c
-
+ $(TESTHAL)/testhal_onewire.c
+
# C++ sources that can be compiled in ARM or THUMB mode depending on the global
# setting.
CPPSRC =
@@ -135,7 +136,8 @@ ASMXSRC = $(STARTUPASM) $(PORTASM) $(OSALASM) INCDIR = $(CHIBIOS)/os/license \
$(STARTUPINC) $(KERNINC) $(PORTINC) $(OSALINC) \
$(HALINC) $(PLATFORMINC) $(BOARDINC) $(TESTINC) \
- $(CHIBIOS)/os/various
+ $(CHIBIOS)/os/various \
+ $(TESTHAL)
#
# Project, sources and paths
diff --git a/testhal/STM32/STM32F0xx/onewire/onewire_test.h b/testhal/STM32/STM32F0xx/onewire/boarddef.h index 1bec2d0..fd9842b 100644 --- a/testhal/STM32/STM32F0xx/onewire/onewire_test.h +++ b/testhal/STM32/STM32F0xx/onewire/boarddef.h @@ -1,5 +1,5 @@ /* - ChibiOS/RT - Copyright (C) 2014 Uladzimir Pylinsky aka barthess + ChibiOS/RT - Copyright (C) 2016 Uladzimir Pylinsky aka barthess Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -14,15 +14,15 @@ limitations under the License. */ -#ifndef ONEWIRE_TEST_H_ -#define ONEWIRE_TEST_H_ +#ifndef BOARDDEF_H_ +#define BOARDDEF_H_ -#ifdef __cplusplus -extern "C" { -#endif - void onewireTest(void); -#ifdef __cplusplus -} -#endif +#define ONEWIRE_PORT GPIOB +#define ONEWIRE_PIN GPIOB_PIN0 +#define ONEWIRE_PAD_MODE_ACTIVE (PAL_MODE_ALTERNATE(1) | PAL_STM32_OTYPE_OPENDRAIN) +#define search_led_off() (palClearPad(GPIOC, GPIOC_LED4)) +#define search_led_on() (palSetPad(GPIOC, GPIOC_LED4)) +#define ONEWIRE_MASTER_CHANNEL 2 +#define ONEWIRE_SAMPLE_CHANNEL 3 -#endif /* ONEWIRE_TEST_H_ */ +#endif /* BOARDDEF_H_ */ diff --git a/testhal/STM32/STM32F0xx/onewire/chconf.h b/testhal/STM32/STM32F0xx/onewire/chconf.h index 724dc02..4b2d922 100644 --- a/testhal/STM32/STM32F0xx/onewire/chconf.h +++ b/testhal/STM32/STM32F0xx/onewire/chconf.h @@ -29,6 +29,7 @@ #define CHCONF_H
#define _CHIBIOS_RT_CONF_
+#define _CHIBIOS_RT_CONF_VER_5_0_
/*===========================================================================*/
/**
diff --git a/testhal/STM32/STM32F0xx/onewire/halconf.h b/testhal/STM32/STM32F0xx/onewire/halconf.h index c3b1671..64811a5 100644 --- a/testhal/STM32/STM32F0xx/onewire/halconf.h +++ b/testhal/STM32/STM32F0xx/onewire/halconf.h @@ -1,5 +1,5 @@ /*
- ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio
+ ChibiOS - Copyright (C) 2006..2016 Giovanni Di Sirio
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -25,8 +25,8 @@ * @{
*/
-#ifndef _HALCONF_H_
-#define _HALCONF_H_
+#ifndef HALCONF_H
+#define HALCONF_H
#include "mcuconf.h"
@@ -45,17 +45,17 @@ #endif
/**
- * @brief Enables the DAC subsystem.
+ * @brief Enables the CAN subsystem.
*/
-#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__)
-#define HAL_USE_DAC FALSE
+#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__)
+#define HAL_USE_CAN FALSE
#endif
/**
- * @brief Enables the CAN subsystem.
+ * @brief Enables the DAC subsystem.
*/
-#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__)
-#define HAL_USE_CAN FALSE
+#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__)
+#define HAL_USE_DAC FALSE
#endif
/**
@@ -294,7 +294,7 @@ * @brief Serial buffers size.
* @details Configuration parameter, you can change the depth of the queue
* buffers depending on the requirements of your application.
- * @note The default is 64 bytes for both the transmission and receive
+ * @note The default is 16 bytes for both the transmission and receive
* buffers.
*/
#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__)
@@ -309,13 +309,21 @@ * @brief Serial over USB buffers size.
* @details Configuration parameter, the buffer size must be a multiple of
* the USB data endpoint maximum packet size.
- * @note The default is 64 bytes for both the transmission and receive
+ * @note The default is 256 bytes for both the transmission and receive
* buffers.
*/
#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__)
#define SERIAL_USB_BUFFERS_SIZE 256
#endif
+/**
+ * @brief Serial over USB number of buffers.
+ * @note The default is 2 buffers.
+ */
+#if !defined(SERIAL_USB_BUFFERS_NUMBER) || defined(__DOXYGEN__)
+#define SERIAL_USB_BUFFERS_NUMBER 2
+#endif
+
/*===========================================================================*/
/* SPI driver related settings. */
/*===========================================================================*/
@@ -337,11 +345,43 @@ #endif
/*===========================================================================*/
+/* UART driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables synchronous APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(UART_USE_WAIT) || defined(__DOXYGEN__)
+#define UART_USE_WAIT FALSE
+#endif
+
+/**
+ * @brief Enables the @p uartAcquireBus() and @p uartReleaseBus() APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(UART_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
+#define UART_USE_MUTUAL_EXCLUSION FALSE
+#endif
+
+/*===========================================================================*/
+/* USB driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables synchronous APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__)
+#define USB_USE_WAIT FALSE
+#endif
+
+/*===========================================================================*/
/* Community drivers's includes */
/*===========================================================================*/
#include "halconf_community.h"
-#endif /* _HALCONF_H_ */
+#endif /* HALCONF_H */
/** @} */
diff --git a/testhal/STM32/STM32F0xx/onewire/halconf_community.h b/testhal/STM32/STM32F0xx/onewire/halconf_community.h index 91dbfbc..0621fdb 100644 --- a/testhal/STM32/STM32F0xx/onewire/halconf_community.h +++ b/testhal/STM32/STM32F0xx/onewire/halconf_community.h @@ -14,8 +14,8 @@ limitations under the License.
*/
-#ifndef _HALCONF_COMMUNITY_H_
-#define _HALCONF_COMMUNITY_H_
+#ifndef HALCONF_COMMUNITY_H
+#define HALCONF_COMMUNITY_H
/**
* @brief Enables the community overlay.
@@ -93,6 +93,6 @@ */
#define ONEWIRE_USE_SEARCH_ROM TRUE
-#endif /* _HALCONF_COMMUNITY_H_ */
+#endif /* HALCONF_COMMUNITY_H */
/** @} */
diff --git a/testhal/STM32/STM32F0xx/onewire/main.c b/testhal/STM32/STM32F0xx/onewire/main.c index 793bffe..5265edc 100644 --- a/testhal/STM32/STM32F0xx/onewire/main.c +++ b/testhal/STM32/STM32F0xx/onewire/main.c @@ -17,7 +17,7 @@ #include "ch.h"
#include "hal.h"
-#include "onewire_test.h"
+#include "testhal_onewire.h"
/*
* Application entry point.
diff --git a/testhal/STM32/STM32F0xx/onewire/mcuconf.h b/testhal/STM32/STM32F0xx/onewire/mcuconf.h index 89b0fd1..7773406 100644 --- a/testhal/STM32/STM32F0xx/onewire/mcuconf.h +++ b/testhal/STM32/STM32F0xx/onewire/mcuconf.h @@ -1,5 +1,5 @@ /*
- ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio
+ ChibiOS - Copyright (C) 2006..2016 Giovanni Di Sirio
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -14,6 +14,9 @@ limitations under the License.
*/
+#ifndef MCUCONF_H
+#define MCUCONF_H
+
/*
* STM32F0xx drivers configuration.
* The following settings override the default settings present in
@@ -156,6 +159,13 @@ #define STM32_UART_DMA_ERROR_HOOK(uartp) osalSysHalt("DMA failure")
/*
+ * WDG driver system settings.
+ */
+#define STM32_WDG_USE_IWDG FALSE
+
+/*
* header for community drivers.
*/
#include "mcuconf_community.h"
+
+#endif /* MCUCONF_H */
diff --git a/testhal/STM32/STM32F0xx/onewire/onewire_test.c b/testhal/STM32/STM32F0xx/onewire/onewire_test.c deleted file mode 100644 index be20dbc..0000000 --- a/testhal/STM32/STM32F0xx/onewire/onewire_test.c +++ /dev/null @@ -1,257 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2014 Uladzimir Pylinsky aka barthess - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include <string.h> - -#include "hal.h" - -/* - ****************************************************************************** - * DEFINES - ****************************************************************************** - */ - -#if defined(BOARD_ST_STM32F4_DISCOVERY) || \ - defined(BOARD_ST_STM32F0_DISCOVERY) || \ - defined(BOARD_ST_STM32F0308_DISCOVERY) - #if ONEWIRE_USE_STRONG_PULLUP - #error "This board has not enough voltage for this feature" - #endif -#endif - -#if defined(BOARD_ST_STM32F0308_DISCOVERY) - #define ONEWIRE_PORT GPIOB - #define ONEWIRE_PIN GPIOB_PIN0 - #define ONEWIRE_PAD_MODE_ACTIVE (PAL_MODE_ALTERNATE(1) | PAL_STM32_OTYPE_OPENDRAIN) - #define search_led_off() (palClearPad(GPIOC, GPIOC_LED4)) - #define search_led_on() (palSetPad(GPIOC, GPIOC_LED4)) - #define ONEWIRE_MASTER_CHANNEL 2 - #define ONEWIRE_SAMPLE_CHANNEL 3 -#elif defined(BOARD_ST_STM32F4_DISCOVERY) - #define ONEWIRE_PORT GPIOB - #define ONEWIRE_PIN GPIOB_PIN0 - #define ONEWIRE_PAD_MODE_ACTIVE (PAL_MODE_ALTERNATE(2) | PAL_STM32_OTYPE_OPENDRAIN) - #define search_led_off() (palClearPad(GPIOD, GPIOD_LED4)) - #define search_led_on() (palSetPad(GPIOD, GPIOD_LED4)) - #define ONEWIRE_MASTER_CHANNEL 2 - #define ONEWIRE_SAMPLE_CHANNEL 3 -#elif defined(BOARD_OLIMEX_STM32_103STK) - #define ONEWIRE_PORT GPIOB - #define ONEWIRE_PIN 0 - #define ONEWIRE_PAD_MODE_IDLE PAL_MODE_INPUT - #define ONEWIRE_PAD_MODE_ACTIVE PAL_MODE_STM32_ALTERNATE_OPENDRAIN - #define search_led_on() (palClearPad(GPIOC, GPIOC_LED)) - #define search_led_off() (palSetPad(GPIOC, GPIOC_LED)) - #define ONEWIRE_MASTER_CHANNEL 2 - #define ONEWIRE_SAMPLE_CHANNEL 3 -#else - #define ONEWIRE_PORT GPIOB - #define ONEWIRE_PIN GPIOB_TACHOMETER - #include "pads.h" - #define ONEWIRE_PAD_MODE_ACTIVE (PAL_MODE_ALTERNATE(2) | PAL_STM32_OTYPE_OPENDRAIN) - #define search_led_on red_led_on - #define search_led_off red_led_off - #define ONEWIRE_MASTER_CHANNEL 2 - #define ONEWIRE_SAMPLE_CHANNEL 3 -#endif - -/* - ****************************************************************************** - * EXTERNS - ****************************************************************************** - */ - -/* - ****************************************************************************** - * PROTOTYPES - ****************************************************************************** - */ -/* - * Forward declarations - */ -#if ONEWIRE_USE_STRONG_PULLUP -static void strong_pullup_assert(void); -static void strong_pullup_release(void); -#endif - -/* - ****************************************************************************** - * GLOBAL VARIABLES - ****************************************************************************** - */ - -static uint8_t testbuf[12]; - -/* stores 3 temperature values in millicelsius */ -static int32_t temperature[3]; - -/* - * Config for underlied PWM driver. - * Note! It is NOT constant because 1-wire driver needs to change them - * during functioning. - */ -static PWMConfig pwm_cfg = { - 0, - 0, - NULL, - { - {PWM_OUTPUT_DISABLED, NULL}, - {PWM_OUTPUT_DISABLED, NULL}, - {PWM_OUTPUT_DISABLED, NULL}, - {PWM_OUTPUT_DISABLED, NULL} - }, - 0, -#if STM32_PWM_USE_ADVANCED - 0, -#endif - 0 -}; - -/* - * - */ -static const onewireConfig ow_cfg = { - &PWMD3, - &pwm_cfg, - PWM_OUTPUT_ACTIVE_LOW, - ONEWIRE_MASTER_CHANNEL, - ONEWIRE_SAMPLE_CHANNEL, - ONEWIRE_PORT, - ONEWIRE_PIN, -#if defined(STM32F1XX) - ONEWIRE_PAD_MODE_IDLE, -#endif - ONEWIRE_PAD_MODE_ACTIVE, -#if ONEWIRE_USE_STRONG_PULLUP - strong_pullup_assert, - strong_pullup_release -#endif -}; - -/* - ****************************************************************************** - ****************************************************************************** - * LOCAL FUNCTIONS - ****************************************************************************** - ****************************************************************************** - */ - -#if ONEWIRE_USE_STRONG_PULLUP -/** - * - */ -static void strong_pullup_assert(void) { - palSetPadMode(ONEWIRE_PORT, ONEWIRE_PIN, PAL_MODE_STM32_ALTERNATE_PUSHPULL); -} - -/** - * - */ -static void strong_pullup_release(void) { - palSetPadMode(ONEWIRE_PORT, ONEWIRE_PIN, PAL_MODE_STM32_ALTERNATE_OPENDRAIN); -} -#endif /* ONEWIRE_USE_STRONG_PULLUP */ - -/* - ****************************************************************************** - * EXPORTED FUNCTIONS - ****************************************************************************** - */ - -/** - * - */ -void onewireTest(void) { - - int16_t tmp; - uint8_t rombuf[24]; - size_t devices_on_bus = 0; - size_t i = 0; - bool presence; - - onewireObjectInit(&OWD1); - onewireStart(&OWD1, &ow_cfg); - -#if ONEWIRE_SYNTH_SEARCH_TEST - synthSearchRomTest(&OWD1); -#endif - - for (i=0; i<3; i++) - temperature[i] = -666; - - while (true) { - if (true == onewireReset(&OWD1)){ - - memset(rombuf, 0x55, sizeof(rombuf)); - search_led_on(); - devices_on_bus = onewireSearchRom(&OWD1, rombuf, 3); - search_led_off(); - osalDbgCheck(devices_on_bus <= 3); - osalDbgCheck(devices_on_bus > 0); - - if (1 == devices_on_bus){ - /* test read rom command */ - presence = onewireReset(&OWD1); - osalDbgCheck(true == presence); - testbuf[0] = ONEWIRE_CMD_READ_ROM; - onewireWrite(&OWD1, testbuf, 1, 0); - onewireRead(&OWD1, testbuf, 8); - osalDbgCheck(testbuf[7] == onewireCRC(testbuf, 7)); - osalDbgCheck(0 == memcmp(rombuf, testbuf, 8)); - } - - /* start temperature measurement on all connected devices at once */ - presence = onewireReset(&OWD1); - osalDbgCheck(true == presence); - testbuf[0] = ONEWIRE_CMD_SKIP_ROM; - testbuf[1] = ONEWIRE_CMD_CONVERT_TEMP; - -#if ONEWIRE_USE_STRONG_PULLUP - onewireWrite(&OWD1, testbuf, 2, MS2ST(750)); -#else - onewireWrite(&OWD1, testbuf, 2, 0); - /* poll bus waiting ready signal from all connected devices */ - testbuf[0] = 0; - while (testbuf[0] == 0){ - osalThreadSleepMilliseconds(50); - onewireRead(&OWD1, testbuf, 1); - } -#endif - - for (i=0; i<devices_on_bus; i++) { - /* read temperature device by device from their scratchpads */ - presence = onewireReset(&OWD1); - osalDbgCheck(true == presence); - - testbuf[0] = ONEWIRE_CMD_MATCH_ROM; - memcpy(&testbuf[1], &rombuf[i*8], 8); - testbuf[9] = ONEWIRE_CMD_READ_SCRATCHPAD; - onewireWrite(&OWD1, testbuf, 10, 0); - - onewireRead(&OWD1, testbuf, 9); - osalDbgCheck(testbuf[8] == onewireCRC(testbuf, 8)); - memcpy(&tmp, &testbuf, 2); - temperature[i] = ((int32_t)tmp * 625) / 10; - } - } - else { - osalSysHalt("No devices found"); - } - osalThreadSleep(1); /* enforce ChibiOS's stack overflow check */ - } - - onewireStop(&OWD1); -} diff --git a/testhal/STM32/STM32F0xx/onewire/real_roms.txt b/testhal/STM32/STM32F0xx/onewire/real_roms.txt deleted file mode 100644 index ea19c1a..0000000 --- a/testhal/STM32/STM32F0xx/onewire/real_roms.txt +++ /dev/null @@ -1,27 +0,0 @@ -rombuf[0] 0x28 -rombuf[1] 0xec -rombuf[2] 0xf5 -rombuf[3] 0x67 -rombuf[4] 0x5 -rombuf[5] 0x0 -rombuf[6] 0x0 -rombuf[7] 0x1d - -rombuf[8] 0x28 -rombuf[9] 0xbd -rombuf[10] 0x1a -rombuf[11] 0x60 -rombuf[12] 0x5 -rombuf[13] 0x0 -rombuf[14] 0x0 -rombuf[15] 0x37 - -rombuf[16] 0x28 -rombuf[17] 0x83 -rombuf[18] 0x7d -rombuf[19] 0x67 -rombuf[20] 0x5 -rombuf[21] 0x0 -rombuf[22] 0x0 -rombuf[23] 0xf - diff --git a/testhal/STM32/STM32F0xx/onewire/search_rom_synth.c b/testhal/STM32/STM32F0xx/onewire/search_rom_synth.c deleted file mode 100644 index cd2528f..0000000 --- a/testhal/STM32/STM32F0xx/onewire/search_rom_synth.c +++ /dev/null @@ -1,370 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2014 Uladzimir Pylinsky aka barthess - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include <stdlib.h> - -/* - ****************************************************************************** - * DEFINES - ****************************************************************************** - */ - -/* do not set it more than 64 because of some fill_pattern functions - * will be broken.*/ -#define SYNTH_DEVICES_MAX 64 - -/* - * synthetic device - */ -typedef struct { - bool active; - uint64_t id; -} OWSynthDevice; - -/* - * synthetic bus - */ -typedef struct { - OWSynthDevice devices[SYNTH_DEVICES_MAX]; - size_t dev_present; - bool complement_bit; - ioline_t rom_bit; -} OWSynthBus; - -/* - ****************************************************************************** - * EXTERNS - ****************************************************************************** - */ - -/* - ****************************************************************************** - * PROTOTYPES - ****************************************************************************** - */ - -/* - ****************************************************************************** - * GLOBAL VARIABLES - ****************************************************************************** - */ - -static OWSynthBus synth_bus; - -/* - * local buffer for discovered ROMs - */ -static uint64_t detected_devices[SYNTH_DEVICES_MAX]; - -/* - ****************************************************************************** - ****************************************************************************** - * LOCAL FUNCTIONS - ****************************************************************************** - ****************************************************************************** - */ - -/* - ****************************************************************************** - * EXPORTED FUNCTIONS - ****************************************************************************** - */ - -/** - * - */ -void _synth_ow_write_bit(onewireDriver *owp, ioline_t bit) { - (void)owp; - size_t i; - - for (i=0; i<SYNTH_DEVICES_MAX; i++) { - if (((synth_bus.devices[i].id >> synth_bus.rom_bit) & 1U) != bit) { - synth_bus.devices[i].active = false; - } - } - synth_bus.rom_bit++; -} - -/** - * - */ -ioline_t _synth_ow_read_bit(void) { - ioline_t ret = 0xFF; - size_t i; - ioline_t bit; - - for (i=0; i<SYNTH_DEVICES_MAX; i++) { - if (synth_bus.devices[i].active){ - bit = (synth_bus.devices[i].id >> synth_bus.rom_bit) & 1U; - if (synth_bus.complement_bit){ - bit ^= 1U; - } - if (0xFF == ret) - ret = bit; - else - ret &= bit; - } - } - synth_bus.complement_bit = !synth_bus.complement_bit; - return ret; -} - -/** - * - */ -static void synth_reset_pulse(void){ - size_t i; - - for (i=0; i<synth_bus.dev_present; i++){ - synth_bus.devices[i].active = true; - } -} - -/** - * - */ -static size_t synth_search_rom(onewireDriver *owp, uint8_t *result, size_t max_rom_cnt) { - - size_t i; - - search_clean_start(&owp->search_rom); - - do { - /* initialize buffer to store result */ - if (owp->search_rom.reg.devices_found >= max_rom_cnt) - owp->search_rom.retbuf = result + 8*(max_rom_cnt-1); - else - owp->search_rom.retbuf = result + 8*owp->search_rom.reg.devices_found; - memset(owp->search_rom.retbuf, 0, 8); - - /* clean iteration state */ - search_clean_iteration(&owp->search_rom); - - /**/ - synth_reset_pulse(); - synth_bus.rom_bit = 0; - synth_bus.complement_bit = false; - for (i=0; i<64*3 - 1; i++){ - ow_search_rom_cb(NULL, owp); - } - - if (ONEWIRE_SEARCH_ROM_ERROR != owp->search_rom.reg.result) { - /* store cached result for usage in next iteration */ - memcpy(owp->search_rom.prev_path, owp->search_rom.retbuf, 8); - } - } - while (ONEWIRE_SEARCH_ROM_SUCCESS == owp->search_rom.reg.result); - - /**/ - if (ONEWIRE_SEARCH_ROM_ERROR == owp->search_rom.reg.result) - return 0; - else - return owp->search_rom.reg.devices_found; -} - -/** - * - */ -static void fill_pattern_real_devices(void) { - size_t i; - - for (i=0; i<SYNTH_DEVICES_MAX; i++) - synth_bus.devices[i].active = false; - - synth_bus.devices[0].active = true; - synth_bus.devices[0].id = 0x1d00000567f5ec28; - - synth_bus.devices[1].active = true; - synth_bus.devices[1].id = 0x37000005601abd28; - - synth_bus.devices[2].active = true; - synth_bus.devices[2].id = 0x0f000005677d8328; -} - -/** - * - */ -static void fill_pattern_00(size_t devices, size_t start) { - size_t i; - - for (i=0; i<SYNTH_DEVICES_MAX; i++) - synth_bus.devices[i].active = false; - - for (i=0; i<devices; i++){ - synth_bus.devices[i].active = true; - synth_bus.devices[i].id = (start + i); - } -} - -/** - * - */ -static void fill_pattern_01(size_t devices) { - size_t i; - - for (i=0; i<SYNTH_DEVICES_MAX; i++) - synth_bus.devices[i].active = false; - - for (i=0; i<devices; i++){ - synth_bus.devices[i].active = true; - synth_bus.devices[i].id = (devices - i); - } -} - -/** - * - */ -static void fill_pattern_02(size_t devices) { - size_t i; - - for (i=0; i<SYNTH_DEVICES_MAX; i++) - synth_bus.devices[i].active = false; - - for (i=0; i<devices; i++){ - synth_bus.devices[i].active = true; - synth_bus.devices[i].id = ((uint64_t)1 << i); - } -} - -/** - * - */ -static void fill_pattern_03(size_t devices) { - size_t i; - - for (i=0; i<SYNTH_DEVICES_MAX; i++) - synth_bus.devices[i].active = false; - - for (i=0; i<devices; i++){ - synth_bus.devices[i].active = true; - synth_bus.devices[i].id = ((uint64_t)0x8000000000000000 >> i); - } -} - -/** - * @brief random pattern helper - */ -static bool is_id_uniq(const OWSynthDevice *dev, size_t n, uint64_t id) { - size_t i; - - for (i=0; i<n; i++) { - if (dev[i].id == id) - return false; - } - return true; -} - -/** - * - */ -static void fill_pattern_rand(size_t devices) { - size_t i; - uint64_t new_id; - - for (i=0; i<SYNTH_DEVICES_MAX; i++){ - synth_bus.devices[i].active = false; - synth_bus.devices[i].id = 0; - } - - for (i=0; i<devices; i++) { - do { - new_id = rand(); - new_id = (new_id << 32) | rand(); - } while (true != is_id_uniq(synth_bus.devices, i, new_id)); - - synth_bus.devices[i].id = new_id; - synth_bus.devices[i].active = true; - } -} - -/** - * - */ -static bool check_result(size_t detected) { - - size_t i,j; - bool match = false; - - for (i=0; i<detected; i++){ - match = false; - for (j=0; j<detected; j++){ - if (synth_bus.devices[i].id == detected_devices[j]){ - match = true; - break; - } - } - if (false == match) - return OSAL_FAILED; - } - return OSAL_SUCCESS; -} - -/** - * - */ -void synthSearchRomTest(onewireDriver *owp) { - - size_t detected = 0; - size_t i; - - synth_bus.dev_present = 3; - fill_pattern_real_devices(); - detected = synth_search_rom(owp, (uint8_t *)detected_devices, SYNTH_DEVICES_MAX); - osalDbgCheck(synth_bus.dev_present == detected); - osalDbgCheck(OSAL_SUCCESS == check_result(detected)); - - for (i=1; i<=SYNTH_DEVICES_MAX; i++){ - synth_bus.dev_present = i; - - fill_pattern_00(synth_bus.dev_present, 0); - detected = synth_search_rom(owp, (uint8_t *)detected_devices, SYNTH_DEVICES_MAX); - osalDbgCheck(synth_bus.dev_present == detected); - osalDbgCheck(OSAL_SUCCESS == check_result(detected)); - - fill_pattern_00(synth_bus.dev_present, 1); - detected = synth_search_rom(owp, (uint8_t *)detected_devices, SYNTH_DEVICES_MAX); - osalDbgCheck(synth_bus.dev_present == detected); - osalDbgCheck(OSAL_SUCCESS == check_result(detected)); - - fill_pattern_01(synth_bus.dev_present); - detected = synth_search_rom(owp, (uint8_t *)detected_devices, SYNTH_DEVICES_MAX); - osalDbgCheck(synth_bus.dev_present == detected); - osalDbgCheck(OSAL_SUCCESS == check_result(detected)); - - fill_pattern_02(synth_bus.dev_present); - detected = synth_search_rom(owp, (uint8_t *)detected_devices, SYNTH_DEVICES_MAX); - osalDbgCheck(synth_bus.dev_present == detected); - osalDbgCheck(OSAL_SUCCESS == check_result(detected)); - - fill_pattern_03(synth_bus.dev_present); - detected = synth_search_rom(owp, (uint8_t *)detected_devices, SYNTH_DEVICES_MAX); - osalDbgCheck(synth_bus.dev_present == detected); - osalDbgCheck(OSAL_SUCCESS == check_result(detected)); - } - - i = 0; - while (i < 1000) { - synth_bus.dev_present = 1 + (rand() & 63); - - fill_pattern_rand(synth_bus.dev_present); - detected = synth_search_rom(owp, (uint8_t *)detected_devices, SYNTH_DEVICES_MAX); - osalDbgCheck(synth_bus.dev_present == detected); - osalDbgCheck(OSAL_SUCCESS == check_result(detected)); - i++; - } -} - - |