aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorgdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4>2011-01-30 16:18:24 +0000
committergdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4>2011-01-30 16:18:24 +0000
commitcee541cfa399a3b5c7df6548f2456a832f1cbacf (patch)
tree5f980a1acfd69efa1c5448bf22a746e0e37b0013
parentae9a53c8021b3fc416018b33f501a31ca9788b0d (diff)
downloadChibiOS-cee541cfa399a3b5c7df6548f2456a832f1cbacf.tar.gz
ChibiOS-cee541cfa399a3b5c7df6548f2456a832f1cbacf.tar.bz2
ChibiOS-cee541cfa399a3b5c7df6548f2456a832f1cbacf.zip
Implemented transmission end event.
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@2693 35acf78f-673a-0410-8e92-d51de3d6d3f4
-rw-r--r--os/hal/include/serial.h10
-rw-r--r--os/hal/platforms/STM32/serial_lld.c27
-rw-r--r--os/kernel/include/chioch.h2
-rw-r--r--readme.txt2
4 files changed, 29 insertions, 12 deletions
diff --git a/os/hal/include/serial.h b/os/hal/include/serial.h
index f7798e682..535dffc1f 100644
--- a/os/hal/include/serial.h
+++ b/os/hal/include/serial.h
@@ -35,15 +35,15 @@
/*===========================================================================*/
/** @brief Parity error happened.*/
-#define SD_PARITY_ERROR 16
+#define SD_PARITY_ERROR 32
/** @brief Framing error happened.*/
-#define SD_FRAMING_ERROR 32
+#define SD_FRAMING_ERROR 64
/** @brief Overflow happened.*/
-#define SD_OVERRUN_ERROR 64
+#define SD_OVERRUN_ERROR 128
/** @brief Noise on the line.*/
-#define SD_NOISE_ERROR 128
+#define SD_NOISE_ERROR 256
/** @brief Break detected.*/
-#define SD_BREAK_DETECTED 256
+#define SD_BREAK_DETECTED 512
/*===========================================================================*/
/* Driver pre-compile time settings. */
diff --git a/os/hal/platforms/STM32/serial_lld.c b/os/hal/platforms/STM32/serial_lld.c
index 1096efecd..94fd0cae2 100644
--- a/os/hal/platforms/STM32/serial_lld.c
+++ b/os/hal/platforms/STM32/serial_lld.c
@@ -140,8 +140,6 @@ static void set_error(SerialDriver *sdp, uint16_t sr) {
sts |= SD_FRAMING_ERROR;
if (sr & USART_SR_NE)
sts |= SD_NOISE_ERROR;
- if (sr & USART_SR_LBD)
- sts |= SD_BREAK_DETECTED;
chSysLockFromIsr();
chIOAddFlagsI(sdp, sts);
chSysUnlockFromIsr();
@@ -158,16 +156,23 @@ static void serve_interrupt(SerialDriver *sdp) {
uint16_t sr = u->SR; /* SR reset step 1.*/
uint16_t dr = u->DR; /* SR reset step 2.*/
- if (sr & (USART_SR_LBD | USART_SR_ORE | USART_SR_NE |
- USART_SR_FE | USART_SR_PE)) {
+ /* Error condition detection.*/
+ if (sr & (USART_SR_ORE | USART_SR_NE | USART_SR_FE | USART_SR_PE))
set_error(sdp, sr);
- u->SR = 0; /* Clears the LBD bit in the SR.*/
+ /* Special case, LIN break detection.*/
+ if (sr & USART_SR_LBD) {
+ chSysLockFromIsr();
+ chIOAddFlagsI(sdp, SD_BREAK_DETECTED);
+ chSysUnlockFromIsr();
+ u->SR &= ~USART_SR_LBD;
}
+ /* Data available.*/
if (sr & USART_SR_RXNE) {
chSysLockFromIsr();
sdIncomingDataI(sdp, (uint8_t)dr);
chSysUnlockFromIsr();
}
+ /* Transmission buffer empty.*/
if ((cr1 & USART_CR1_TXEIE) && (sr & USART_SR_TXE)) {
msg_t b;
chSysLockFromIsr();
@@ -180,6 +185,14 @@ static void serve_interrupt(SerialDriver *sdp) {
u->DR = b;
chSysUnlockFromIsr();
}
+ /* Physical transmission end.*/
+ if (sr & USART_SR_TC) {
+ chSysLockFromIsr();
+ chIOAddFlagsI(sdp, IO_TRANSMISSION_END);
+ chSysUnlockFromIsr();
+ u->CR1 = cr1 & ~USART_CR1_TCIE;
+ u->SR &= ~USART_SR_TC;
+ }
}
#endif
@@ -187,7 +200,7 @@ static void serve_interrupt(SerialDriver *sdp) {
static void notify1(GenericQueue *qp) {
(void)qp;
- USART1->CR1 |= USART_CR1_TXEIE;
+ USART1->CR1 |= USART_CR1_TXEIE | USART_CR1_TCIE;
}
#endif
@@ -195,7 +208,7 @@ static void notify1(GenericQueue *qp) {
static void notify2(GenericQueue *qp) {
(void)qp;
- USART2->CR1 |= USART_CR1_TXEIE;
+ USART2->CR1 |= USART_CR1_TXEIE | USART_CR1_TCIE;
}
#endif
diff --git a/os/kernel/include/chioch.h b/os/kernel/include/chioch.h
index bf97c3f6f..f5741fcec 100644
--- a/os/kernel/include/chioch.h
+++ b/os/kernel/include/chioch.h
@@ -239,6 +239,8 @@ typedef struct {
#define IO_INPUT_AVAILABLE 4
/** @brief Output queue empty.*/
#define IO_OUTPUT_EMPTY 8
+/** @brief Transmission end.*/
+#define IO_TRANSMISSION_END 16
/**
* @brief Type of an I/O condition flags mask.
diff --git a/readme.txt b/readme.txt
index d6d3449f3..18ad73c67 100644
--- a/readme.txt
+++ b/readme.txt
@@ -69,6 +69,8 @@
*****************************************************************************
*** 2.3.0 ***
+- NEW: Implemented new event IO_TRANSMISSION_END in the generic serial
+ driver. This event marks the physical transmission end of a data stream.
*** 2.1.8 ***
- FIX: Fixed error in STM32 ADC driver macro names (bug 3160306)(backported