-
Fork of MODSERIAL by
Revision 28:76793a84f9e5, committed 2013-07-12
- Comitter:
- Sissors
- Date:
- Fri Jul 12 15:27:07 2013 +0000
- Parent:
- 27:9c93ce7cb9d8
- Child:
- 29:9a41078f0488
- Commit message:
- Refactoring + KL25Z support v1.0
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Device/MODSERIAL_KL25Z.cpp Fri Jul 12 15:27:07 2013 +0000 @@ -0,0 +1,20 @@ +#ifdef TARGET_KL25Z +#include "MODSERIAL.h" + +void MODSERIAL::setBase(void ) { +switch( _serial.index ) { + case 0: _base = UART0; _IRQ = UART0_IRQn; break; + case 1: _base = UART1; _IRQ = UART1_IRQn; break; + case 2: _base = UART2; _IRQ = UART2_IRQn; break; + default: _base = NULL; _IRQ = (IRQn_Type)NULL; break; + } +} + +void MODSERIAL::initDevice(void) {}; + +bool MODSERIAL::txIsBusy( void ) +{ + return ( ((UART_Type*)_base)->S1 & ( 1UL << 6 ) == 0 ) ? true : false; +} +#endif +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Device/MODSERIAL_KL25Z.h Fri Jul 12 15:27:07 2013 +0000 @@ -0,0 +1,20 @@ +#if defined(TARGET_KL25Z) + +#define MODSERIAL_IRQ_REG ((UART_Type*)_base)->C2 +#define DISABLE_TX_IRQ MODSERIAL_IRQ_REG &= ~(1UL << UART_C2_TIE_SHIFT) +#define DISABLE_RX_IRQ MODSERIAL_IRQ_REG &= ~(1UL << UART_C2_RIE_SHIFT) +#define ENABLE_TX_IRQ MODSERIAL_IRQ_REG |= (1UL << UART_C2_TIE_SHIFT) +#define ENABLE_RX_IRQ MODSERIAL_IRQ_REG |= (1UL << UART_C2_RIE_SHIFT) + +#define RESET_TX_FIFO while(0 == 1) +#define RESET_RX_FIFO while(MODSERIAL_READABLE) char dummy = MODSERIAL_READ_REG + +#define MODSERIAL_READ_REG ((UART_Type*)_base)->D +#define MODSERIAL_WRITE_REG ((UART_Type*)_base)->D +#define MODSERIAL_READABLE ((((UART_Type*)_base)->S1 & (1UL<<5)) != 0) +#define MODSERIAL_WRITABLE ((((UART_Type*)_base)->S1 & (1UL<<7)) != 0) + +#define RX_IRQ_ENABLED ((MODSERIAL_IRQ_REG & (1UL << UART_C2_RIE_SHIFT)) != 0 ) +#define TX_IRQ_ENABLED ((MODSERIAL_IRQ_REG & (1UL << UART_C2_TIE_SHIFT)) != 0 ) + +#endif \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Device/MODSERIAL_LPC11U24.cpp Fri Jul 12 15:27:07 2013 +0000 @@ -0,0 +1,17 @@ +#ifdef TARGET_LPC11U24 +#include "MODSERIAL.h" + +void MODSERIAL::setBase(void ) { + _base = LPC_USART; + _IRQ = UART_IRQn; +} + +void MODSERIAL::initDevice(void) { + ((LPC_USART_Type*)_base)->FCR = (1UL<<0) + (1UL<<1) + (1UL<<2); + } + +bool MODSERIAL::txIsBusy( void ) +{ + return ( ((LPC_USART_Type*)_base)->LSR & ( 3UL << 5 ) == 0 ) ? true : false; +} +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Device/MODSERIAL_LPC11U24.h Fri Jul 12 15:27:07 2013 +0000 @@ -0,0 +1,20 @@ +#if defined(TARGET_LPC11U24) + +#define MODSERIAL_IRQ_REG ((LPC_USART_Type*)_base)->IER +#define DISABLE_TX_IRQ MODSERIAL_IRQ_REG &= ~(1UL << 1) +#define DISABLE_RX_IRQ MODSERIAL_IRQ_REG &= ~(1UL << 0) +#define ENABLE_TX_IRQ MODSERIAL_IRQ_REG |= (1UL << 1) +#define ENABLE_RX_IRQ MODSERIAL_IRQ_REG |= (1UL << 0) + +#define RESET_TX_FIFO ((LPC_USART_Type*)_base)->FCR |= (1UL<<2) +#define RESET_RX_FIFO ((LPC_USART_Type*)_base)->FCR |= (1UL<<1) + +#define MODSERIAL_READ_REG ((LPC_USART_Type*)_base)->RBR +#define MODSERIAL_WRITE_REG ((LPC_USART_Type*)_base)->THR +#define MODSERIAL_READABLE ((((LPC_USART_Type*)_base)->LSR & (1UL<<0)) != 0) +#define MODSERIAL_WRITABLE ((((LPC_USART_Type*)_base)->LSR & (1UL<<5)) != 0) + +#define RX_IRQ_ENABLED true +#define TX_IRQ_ENABLED true + +#endif \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Device/MODSERIAL_LPC1768.cpp Fri Jul 12 15:27:07 2013 +0000 @@ -0,0 +1,24 @@ +#ifdef TARGET_LPC1768 +#include "MODSERIAL.h" + + +void MODSERIAL::setBase(void ) { +switch( _serial.index ) { + case 0: _base = LPC_UART0; _IRQ = UART0_IRQn; break; + case 1: _base = LPC_UART1; _IRQ = UART1_IRQn; break; + case 2: _base = LPC_UART2; _IRQ = UART2_IRQn; break; + case 3: _base = LPC_UART3; _IRQ = UART3_IRQn; break; + default: _base = NULL; _IRQ = (IRQn_Type)NULL; break; + } +} + +void MODSERIAL::initDevice(void) { + ((LPC_UART_TypeDef*)_base)->FCR = (1UL<<0) + (1UL<<1) + (1UL<<2); + } + +bool MODSERIAL::txIsBusy( void ) +{ + return ( ((LPC_UART_TypeDef*)_base)->LSR & ( 3UL << 5 ) == 0 ) ? true : false; +} + +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Device/MODSERIAL_LPC1768.h Fri Jul 12 15:27:07 2013 +0000 @@ -0,0 +1,20 @@ +#if defined(TARGET_LPC1768) + +#define MODSERIAL_IRQ_REG ((LPC_UART_TypeDef*)_base)->IER +#define DISABLE_TX_IRQ MODSERIAL_IRQ_REG &= ~(1UL << 1) +#define DISABLE_RX_IRQ MODSERIAL_IRQ_REG &= ~(1UL << 0) +#define ENABLE_TX_IRQ MODSERIAL_IRQ_REG |= (1UL << 1) +#define ENABLE_RX_IRQ MODSERIAL_IRQ_REG |= (1UL << 0) + +#define RESET_TX_FIFO ((LPC_UART_TypeDef*)_base)->FCR |= (1UL<<2) +#define RESET_RX_FIFO ((LPC_UART_TypeDef*)_base)->FCR |= (1UL<<1) + +#define MODSERIAL_READ_REG ((LPC_UART_TypeDef*)_base)->RBR +#define MODSERIAL_WRITE_REG ((LPC_UART_TypeDef*)_base)->THR +#define MODSERIAL_READABLE ((((LPC_UART_TypeDef*)_base)->LSR & (1UL<<0)) != 0) +#define MODSERIAL_WRITABLE ((((LPC_UART_TypeDef*)_base)->LSR & (1UL<<5)) != 0) + +#define RX_IRQ_ENABLED true +#define TX_IRQ_ENABLED true + +#endif \ No newline at end of file
--- a/FLUSH.cpp Thu Jul 11 13:34:53 2013 +0000 +++ b/FLUSH.cpp Fri Jul 12 15:27:07 2013 +0000 @@ -39,7 +39,7 @@ buffer_overflow[type] = 0; switch(type) { case TxIrq: RESET_TX_FIFO; break; - case RxIrq: RESET_RX_FIFO; break; + case RxIrq: while(MODSERIAL_READABLE) char dummy = MODSERIAL_READ_REG; break; } MODSERIAL_IRQ_REG = irq_req; }
--- a/INIT.cpp Thu Jul 11 13:34:53 2013 +0000 +++ b/INIT.cpp Fri Jul 12 15:27:07 2013 +0000 @@ -66,7 +66,7 @@ } - ENABLE_FIFO; + initDevice(); //_FCR = MODSERIAL_FIFO_ENABLE | MODSERIAL_FIFO_RX_RESET | MODSERIAL_FIFO_TX_RESET;
--- a/ISR_RX.cpp Thu Jul 11 13:34:53 2013 +0000 +++ b/ISR_RX.cpp Fri Jul 12 15:27:07 2013 +0000 @@ -28,6 +28,7 @@ void MODSERIAL::isr_rx(void) { + if (RX_IRQ_ENABLED) { DigitalOut led(LED2); led = 1; if (! _base || buffer_size[RxIrq] == 0 || buffer[RxIrq] == (char *)NULL) { @@ -55,7 +56,8 @@ if (auto_detect_char == rxc) { _isr[RxAutoDetect].call(&this->callbackInfo); } - } + } + } } }; // namespace AjK ends
--- a/ISR_TX.cpp Thu Jul 11 13:34:53 2013 +0000 +++ b/ISR_TX.cpp Fri Jul 12 15:27:07 2013 +0000 @@ -1,16 +1,16 @@ /* Copyright (c) 2010 Andy Kirkham - + Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - + The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE @@ -23,32 +23,33 @@ #include "MODSERIAL.h" #include "MACROS.h" -namespace AjK { - -void -MODSERIAL::isr_tx(bool doCallback) +namespace AjK { - if (! _base || buffer_size[TxIrq] == 0 || buffer[TxIrq] == (char *)NULL) { - _isr[TxIrq].call(&this->callbackInfo); - return; - } - - while (! MODSERIAL_TX_BUFFER_EMPTY && MODSERIAL_WRITABLE ) { - MODSERIAL_WRITE_REG = txc = (uint8_t)(buffer[TxIrq][buffer_out[TxIrq]]); - buffer_count[TxIrq]--; - buffer_out[TxIrq]++; - if (buffer_out[TxIrq] >= buffer_size[TxIrq]) { - buffer_out[TxIrq] = 0; + +void MODSERIAL::isr_tx(bool doCallback) +{ + if (TX_IRQ_ENABLED || MODSERIAL_TX_BUFFER_FULL ) { + if (! _base || buffer_size[TxIrq] == 0 || buffer[TxIrq] == (char *)NULL) { + _isr[TxIrq].call(&this->callbackInfo); + return; } - if (doCallback) _isr[TxIrq].call(&this->callbackInfo); - } - - if ( MODSERIAL_TX_BUFFER_EMPTY ) { - DISABLE_TX_IRQ; - _isr[TxEmpty].call(&this->callbackInfo); - } + + while (! MODSERIAL_TX_BUFFER_EMPTY && MODSERIAL_WRITABLE ) { + MODSERIAL_WRITE_REG = txc = (uint8_t)(buffer[TxIrq][buffer_out[TxIrq]]); + buffer_count[TxIrq]--; + buffer_out[TxIrq]++; + if (buffer_out[TxIrq] >= buffer_size[TxIrq]) { + buffer_out[TxIrq] = 0; + } + if (doCallback) _isr[TxIrq].call(&this->callbackInfo); + } + + if ( MODSERIAL_TX_BUFFER_EMPTY ) { + DISABLE_TX_IRQ; + _isr[TxEmpty].call(&this->callbackInfo); + } } - +} }; // namespace AjK ends - +
--- a/MACROS.h Thu Jul 11 13:34:53 2013 +0000 +++ b/MACROS.h Fri Jul 12 15:27:07 2013 +0000 @@ -23,69 +23,13 @@ #ifndef MODSERIAL_MACROS_H #define MODSERIAL_MACROS_H +#include "MODSERIAL_LPC1768.h" +#include "MODSERIAL_LPC11U24.h" +#include "MODSERIAL_KL25Z.h" #define MODSERIAL_TX_BUFFER_EMPTY (buffer_count[TxIrq]==0) #define MODSERIAL_RX_BUFFER_EMPTY (buffer_count[RxIrq]==0) #define MODSERIAL_TX_BUFFER_FULL (buffer_count[TxIrq]==buffer_size[TxIrq]) #define MODSERIAL_RX_BUFFER_FULL (buffer_count[RxIrq]==buffer_size[RxIrq]) - -#ifdef TARGET_LPC1768 - -#define MODSERIAL_IRQ_REG ((LPC_UART_TypeDef*)_base)->IER -#define DISABLE_TX_IRQ MODSERIAL_IRQ_REG &= ~(1UL << 1) -#define DISABLE_RX_IRQ MODSERIAL_IRQ_REG &= ~(1UL << 0) -#define ENABLE_TX_IRQ MODSERIAL_IRQ_REG |= (1UL << 1) -#define ENABLE_RX_IRQ MODSERIAL_IRQ_REG |= (1UL << 0) - -#define RESET_TX_FIFO ((LPC_UART_TypeDef*)_base)->FCR |= (1UL<<2) -#define RESET_RX_FIFO ((LPC_UART_TypeDef*)_base)->FCR |= (1UL<<1) -#define ENABLE_FIFO ((LPC_UART_TypeDef*)_base)->FCR = (1UL<<0) + (1UL<<1) + (1UL<<2) - -#define MODSERIAL_READ_REG ((LPC_UART_TypeDef*)_base)->RBR -#define MODSERIAL_WRITE_REG ((LPC_UART_TypeDef*)_base)->THR -#define MODSERIAL_READABLE ((((LPC_UART_TypeDef*)_base)->LSR & (1UL<<0)) != 0) -#define MODSERIAL_WRITABLE ((((LPC_UART_TypeDef*)_base)->LSR & (1UL<<5)) != 0) - - -#endif - -#ifdef TARGET_LPC11U24 - -#define MODSERIAL_IRQ_REG ((LPC_UART_TypeDef*)_base)->IER -#define DISABLE_TX_IRQ MODSERIAL_IRQ_REG &= ~(1UL << 1) -#define DISABLE_RX_IRQ MODSERIAL_IRQ_REG &= ~(1UL << 0) -#define ENABLE_TX_IRQ MODSERIAL_IRQ_REG |= (1UL << 1) -#define ENABLE_RX_IRQ MODSERIAL_IRQ_REG |= (1UL << 0) - -#define RESET_TX_FIFO ((LPC_UART_TypeDef*)_base)->FCR |= (1UL<<2) -#define RESET_RX_FIFO ((LPC_UART_TypeDef*)_base)->FCR |= (1UL<<1) -#define ENABLE_FIFO ((LPC_UART_TypeDef*)_base)->FCR = (1UL<<0) + (1UL<<1) + (1UL<<2) - -#define MODSERIAL_READ_REG ((LPC_UART_TypeDef*)_base)->RBR -#define MODSERIAL_WRITE_REG ((LPC_UART_TypeDef*)_base)->THR -#define MODSERIAL_READABLE ((((LPC_UART_TypeDef*)_base)->LSR & (1UL<<0)) != 0) -#define MODSERIAL_WRITABLE ((((LPC_UART_TypeDef*)_base)->LSR & (1UL<<5)) != 0) - -#endif - -#ifdef TARGET_KL25Z - -#define MODSERIAL_IRQ_REG ((UART_Type*)_base)->C2 -#define DISABLE_TX_IRQ MODSERIAL_IRQ_REG &= ~(1UL << UART_C2_TIE_SHIFT) -#define DISABLE_RX_IRQ MODSERIAL_IRQ_REG &= ~(1UL << UART_C2_RIE_SHIFT) -#define ENABLE_TX_IRQ MODSERIAL_IRQ_REG |= (1UL << UART_C2_TIE_SHIFT) -#define ENABLE_RX_IRQ MODSERIAL_IRQ_REG |= (1UL << UART_C2_RIE_SHIFT) - -#define RESET_TX_FIFO while(0 == 1) -#define RESET_RX_FIFO while(0 == 1) -#define ENABLE_FIFO while(0 == 1) - -#define MODSERIAL_READ_REG ((UART_Type*)_base)->D -#define MODSERIAL_WRITE_REG ((UART_Type*)_base)->D -#define MODSERIAL_READABLE ((((UART_Type*)_base)->S1 & (1UL<<5)) != 0) -#define MODSERIAL_WRITABLE ((((UART_Type*)_base)->S1 & (1UL<<7)) != 0) - -#endif - -#endif +#endif \ No newline at end of file
--- a/MODSERIAL.h Thu Jul 11 13:34:53 2013 +0000 +++ b/MODSERIAL.h Fri Jul 12 15:27:07 2013 +0000 @@ -1061,8 +1061,17 @@ //DEVICE SPECIFIC FUNCTIONS: + private: + /** + * Set pointers to UART and IRQ + */ void setBase( void ); + /** + * If required, allows for adding specific settings + */ + void initDevice( void ); + IRQn_Type _IRQ; public: @@ -1077,7 +1086,6 @@ */ bool txIsBusy(void); - };
--- a/MODSERIAL_KL25Z.cpp Thu Jul 11 13:34:53 2013 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,18 +0,0 @@ -#ifdef TARGET_KL25Z -#include "MODSERIAL.h" - -void MODSERIAL::setBase(void ) { -switch( _serial.index ) { - case 0: _base = UART0; _IRQ = UART0_IRQn; break; - case 1: _base = UART1; _IRQ = UART1_IRQn; break; - case 2: _base = UART2; _IRQ = UART2_IRQn; break; - default: _base = NULL; _IRQ = (IRQn_Type)NULL; break; - } -} - -bool MODSERIAL::txIsBusy( void ) -{ - return ( ((UART_Type*)_base)->S1 & ( 1UL << 6 ) == 0 ) ? true : false; -} -#endif -
--- a/MODSERIAL_LPC11U24.cpp Thu Jul 11 13:34:53 2013 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,13 +0,0 @@ -#ifdef TARGET_LPC11U24 -#include "MODSERIAL.h" - -void MODSERIAL::setBase(void ) { - _base = LPC_USART; - _IRQ = UART_IRQn; -} - -bool MODSERIAL::txIsBusy( void ) -{ - return ( ((LPC_USART_Type*)_base)->LSR & ( 3UL << 5 ) == 0 ) ? true : false; -} -#endif
--- a/MODSERIAL_LPC1768.cpp Thu Jul 11 13:34:53 2013 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,20 +0,0 @@ -#ifdef TARGET_LPC1768 -#include "MODSERIAL.h" - - -void MODSERIAL::setBase(void ) { -switch( _serial.index ) { - case 0: _base = LPC_UART0; _IRQ = UART0_IRQn; break; - case 1: _base = LPC_UART1; _IRQ = UART1_IRQn; break; - case 2: _base = LPC_UART2; _IRQ = UART2_IRQn; break; - case 3: _base = LPC_UART3; _IRQ = UART3_IRQn; break; - default: _base = NULL; _IRQ = (IRQn_Type)NULL; break; - } -} - -bool MODSERIAL::txIsBusy( void ) -{ - return ( ((LPC_UART_TypeDef*)_base)->LSR & ( 3UL << 5 ) == 0 ) ? true : false; -} - -#endif
--- a/example1.cpp Thu Jul 11 13:34:53 2013 +0000 +++ b/example1.cpp Fri Jul 12 15:27:07 2013 +0000 @@ -10,7 +10,7 @@ DigitalOut led1(LED1); DigitalOut led2(LED2); -DigitalOut led3(LED2); +DigitalOut led3(LED3); DigitalOut led4(LED4); MODSERIAL pc(USBTX, USBRX); @@ -57,7 +57,7 @@ pc.baud(PC_BAUD); // Use a deliberatly slow baud to fill up the TX buffer - uart.baud(300); + uart.baud(1200); uart.attach(&txCallback, MODSERIAL::TxIrq); uart.attach(&rxCallback, MODSERIAL::RxIrq); @@ -68,19 +68,18 @@ led1 = 1; // Show start of sending with LED1. - for (int loop = 0; loop < 2; loop++) { + for (int loop = 0; loop < 512; loop++) { uart.printf("%c", c); c++; if (c > 'Z') c = 'A'; } - pc.printf("%c", '!'); + led1 = 0; // Show the end of sending by switching off LED1. // End program. Flash LED4. Notice how LED 2 and 3 continue // to flash for a short period while the interrupt system // continues to send the characters left in the TX buffer. - wait(2); - pc.printf("\n\n\r%02X", UART2->C2); + while(1) { led4 = !led4; wait(0.25);