aboutsummaryrefslogtreecommitdiff
path: root/apps/px4io/i2c.c
diff options
context:
space:
mode:
authorpx4dev <px4@purgatory.org>2013-01-23 18:56:58 -0800
committerpx4dev <px4@purgatory.org>2013-01-23 18:56:58 -0800
commitb34311915a04e9ec4d301930e4342f285b5c6cb4 (patch)
treec6462a4db7fc037592b01c1c6b62b10c590b56d5 /apps/px4io/i2c.c
parent3244bb83ea2656a20cc486205dd77d48f525c05c (diff)
downloadpx4-firmware-b34311915a04e9ec4d301930e4342f285b5c6cb4.tar.gz
px4-firmware-b34311915a04e9ec4d301930e4342f285b5c6cb4.tar.bz2
px4-firmware-b34311915a04e9ec4d301930e4342f285b5c6cb4.zip
Safeguard against back-to-back transactions while setting up to handle a register read request.
Diffstat (limited to 'apps/px4io/i2c.c')
-rw-r--r--apps/px4io/i2c.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/apps/px4io/i2c.c b/apps/px4io/i2c.c
index cf6921179..174ec2813 100644
--- a/apps/px4io/i2c.c
+++ b/apps/px4io/i2c.c
@@ -242,6 +242,7 @@ i2c_rx_complete(void)
uint16_t *regs;
unsigned reg_count;
+ /* work out which registers are being addressed */
int ret = registers_get(selected_page, selected_offset, &regs, &reg_count);
if (ret == 0) {
tx_buf = (uint8_t *)regs;
@@ -250,6 +251,14 @@ i2c_rx_complete(void)
tx_buf = junk_buf;
tx_len = sizeof(junk_buf);
}
+
+ /* disable interrupts while reconfiguring DMA for the selected registers */
+ irqstate_t flags = irqsave();
+
+ stm32_dmastop(tx_dma);
+ i2c_tx_setup();
+
+ irqrestore(flags);
}
}