aboutsummaryrefslogtreecommitdiffstats
path: root/os/hal
diff options
context:
space:
mode:
authorbarthess <barthess@yandex.ru>2014-12-09 11:31:46 +0300
committerbarthess <barthess@yandex.ru>2014-12-14 14:14:45 +0300
commit99505cdea68069a3873e670ccc95cdc0f94d2319 (patch)
treee85759dd4b3b806544b19196233d917f6265a2f1 /os/hal
parent97be1351afc84c9b1cef5c89f6c04013a0709cb1 (diff)
downloadChibiOS-Contrib-99505cdea68069a3873e670ccc95cdc0f94d2319.tar.gz
ChibiOS-Contrib-99505cdea68069a3873e670ccc95cdc0f94d2319.tar.bz2
ChibiOS-Contrib-99505cdea68069a3873e670ccc95cdc0f94d2319.zip
1-wire. Added workaround form F1xx MCUs
Diffstat (limited to 'os/hal')
-rw-r--r--os/hal/src/onewire.c23
1 files changed, 17 insertions, 6 deletions
diff --git a/os/hal/src/onewire.c b/os/hal/src/onewire.c
index f1fb7a8..724ff2f 100644
--- a/os/hal/src/onewire.c
+++ b/os/hal/src/onewire.c
@@ -108,10 +108,10 @@ static const PWMConfig pwm_default_cfg = {
ONEWIRE_RESET_TOTAL_WIDTH,
NULL,
{
- {PWM_OUTPUT_DISABLED, NULL},
- {PWM_OUTPUT_DISABLED, NULL},
- {PWM_OUTPUT_DISABLED, NULL},
- {PWM_OUTPUT_DISABLED, NULL}
+ {PWM_OUTPUT_ACTIVE_LOW, NULL},
+ {PWM_OUTPUT_ACTIVE_LOW, NULL},
+ {PWM_OUTPUT_ACTIVE_LOW, NULL},
+ {PWM_OUTPUT_ACTIVE_LOW, NULL}
},
0,
0
@@ -582,6 +582,7 @@ void onewireStart(onewireDriver *owp, const onewireConfig *config) {
#endif
owp->config = config;
+ pwmStart(owp->config->pwmd, &pwm_default_cfg);
owp->reg.state = ONEWIRE_READY;
}
@@ -617,9 +618,11 @@ bool onewireReset(onewireDriver *owp) {
osalDbgAssert(owp->reg.state == ONEWIRE_READY, "Invalid state");
/* short circuit on bus or any other device transmit data */
- if (0 == owp->config->readBitX())
+ if (PAL_LOW == owp->config->readBitX())
return false;
+ palSetPad(GPIOC, GPIOC_LED);
+
pwmd = owp->config->pwmd;
owp->pwmcfg.period = ONEWIRE_RESET_LOW_WIDTH + ONEWIRE_RESET_SAMPLE_WIDTH;
@@ -630,6 +633,7 @@ bool onewireReset(onewireDriver *owp) {
owp->pwmcfg.channels[owp->config->sample_channel].mode = PWM_OUTPUT_ACTIVE_LOW;
pwmStart(pwmd, &owp->pwmcfg);
+ palSetPadMode(GPIOB, 8, PAL_MODE_STM32_ALTERNATE_OPENDRAIN);
pwmEnableChannel(pwmd, owp->config->master_channel, ONEWIRE_RESET_LOW_WIDTH);
pwmEnableChannel(pwmd, owp->config->sample_channel, ONEWIRE_RESET_SAMPLE_WIDTH);
pwmEnableChannelNotification(pwmd, owp->config->sample_channel);
@@ -638,11 +642,12 @@ bool onewireReset(onewireDriver *owp) {
osalThreadSuspendS(&owp->thread);
osalSysUnlock();
+ palSetPadMode(GPIOB, 8, PAL_MODE_INPUT);
pwmStop(pwmd);
/* wait until slave release bus to discriminate short circuit condition */
osalThreadSleepMicroseconds(500);
- return (1 == owp->config->readBitX()) && (true == owp->reg.slave_present);
+ return (PAL_HIGH == owp->config->readBitX()) && (true == owp->reg.slave_present);
}
/**
@@ -678,6 +683,7 @@ void onewireRead(onewireDriver *owp, uint8_t *rxbuf, size_t rxbytes) {
owp->pwmcfg.channels[owp->config->sample_channel].mode = PWM_OUTPUT_ACTIVE_LOW;
pwmStart(pwmd, &owp->pwmcfg);
+ palSetPadMode(GPIOB, 8, PAL_MODE_STM32_ALTERNATE_OPENDRAIN);
pwmEnableChannel(pwmd, owp->config->master_channel, ONEWIRE_ONE_WIDTH);
pwmEnableChannel(pwmd, owp->config->sample_channel, ONEWIRE_SAMPLE_WIDTH);
pwmEnableChannelNotification(pwmd, owp->config->sample_channel);
@@ -686,6 +692,7 @@ void onewireRead(onewireDriver *owp, uint8_t *rxbuf, size_t rxbytes) {
osalThreadSuspendS(&owp->thread);
osalSysUnlock();
+ palSetPadMode(GPIOB, 8, PAL_MODE_INPUT);
pwmStop(pwmd);
}
@@ -732,6 +739,7 @@ void onewireWrite(onewireDriver *owp, uint8_t *txbuf,
#endif
pwmStart(pwmd, &owp->pwmcfg);
+ palSetPadMode(GPIOB, 8, PAL_MODE_STM32_ALTERNATE_OPENDRAIN);
pwmEnablePeriodicNotification(pwmd);
osalSysLock();
@@ -739,6 +747,7 @@ void onewireWrite(onewireDriver *owp, uint8_t *txbuf,
osalSysUnlock();
pwmDisablePeriodicNotification(pwmd);
+ palSetPadMode(GPIOB, 8, PAL_MODE_INPUT);
pwmStop(pwmd);
#if ONEWIRE_USE_STRONG_PULLUP
@@ -803,6 +812,7 @@ size_t onewireSearchRom(onewireDriver *owp, uint8_t *result,
owp->pwmcfg.channels[owp->config->sample_channel].callback = pwm_search_rom_cb;
owp->pwmcfg.channels[owp->config->sample_channel].mode = PWM_OUTPUT_ACTIVE_LOW;
pwmStart(pwmd, &owp->pwmcfg);
+ palSetPadMode(GPIOB, 8, PAL_MODE_STM32_ALTERNATE_OPENDRAIN);
pwmEnableChannel(pwmd, owp->config->master_channel, ONEWIRE_ONE_WIDTH);
pwmEnableChannel(pwmd, owp->config->sample_channel, ONEWIRE_SAMPLE_WIDTH);
pwmEnableChannelNotification(pwmd, owp->config->sample_channel);
@@ -811,6 +821,7 @@ size_t onewireSearchRom(onewireDriver *owp, uint8_t *result,
osalThreadSuspendS(&owp->thread);
osalSysUnlock();
+ palSetPadMode(GPIOB, 8, PAL_MODE_INPUT);
pwmStop(pwmd);
if (ONEWIRE_SEARCH_ROM_ERROR != owp->search_rom.reg.result) {