From: klueska Date: Wed, 21 May 2008 22:11:57 +0000 (+0000) Subject: Update to include paramaterization of the UartStream interface as well as push Resour... X-Git-Tag: release_tinyos_2_1_0_0~388 X-Git-Url: https://oss.titaniummirror.com/gitweb/?p=tinyos-2.x.git;a=commitdiff_plain;h=27a4057b502642e6d503124114d7047a6576d751 Update to include paramaterization of the UartStream interface as well as push ResourceRequested out to the top level components such as Msp430Spi0C and Msp430Uart0C, etc. --- diff --git a/tos/chips/msp430/usart/Msp430I2CC.nc b/tos/chips/msp430/usart/Msp430I2CC.nc index 7c5727bc..d36e2fa5 100644 --- a/tos/chips/msp430/usart/Msp430I2CC.nc +++ b/tos/chips/msp430/usart/Msp430I2CC.nc @@ -40,6 +40,7 @@ generic configuration Msp430I2CC() { provides interface Resource; + provides interface ResourceRequested; provides interface I2CPacket as I2CBasicAddr; uses interface Msp430I2CConfigure; @@ -58,6 +59,7 @@ implementation { Msp430I2CConfigure = I2CP.Msp430I2CConfigure[ CLIENT_ID ]; components new Msp430Usart0C() as UsartC; + ResourceRequested = UsartC; I2CP.ResourceConfigure[ CLIENT_ID ] <- UsartC.ResourceConfigure; I2CP.UsartResource[ CLIENT_ID ] -> UsartC.Resource; I2CP.I2CInterrupts -> UsartC.HplMsp430I2CInterrupts; diff --git a/tos/chips/msp430/usart/Msp430Spi0C.nc b/tos/chips/msp430/usart/Msp430Spi0C.nc index cf226223..fe87e862 100644 --- a/tos/chips/msp430/usart/Msp430Spi0C.nc +++ b/tos/chips/msp430/usart/Msp430Spi0C.nc @@ -45,6 +45,7 @@ generic configuration Msp430Spi0C() { provides interface Resource; + provides interface ResourceRequested; provides interface SpiByte; provides interface SpiPacket; @@ -70,6 +71,7 @@ implementation { Msp430SpiConfigure = SpiP.Msp430SpiConfigure[ CLIENT_ID ]; components new Msp430Usart0C() as UsartC; + ResourceRequested = UsartC; SpiP.ResourceConfigure[ CLIENT_ID ] <- UsartC.ResourceConfigure; SpiP.UsartResource[ CLIENT_ID ] -> UsartC.Resource; SpiP.UsartInterrupts -> UsartC.HplMsp430UsartInterrupts; diff --git a/tos/chips/msp430/usart/Msp430Spi1C.nc b/tos/chips/msp430/usart/Msp430Spi1C.nc index 61363f33..110d7470 100644 --- a/tos/chips/msp430/usart/Msp430Spi1C.nc +++ b/tos/chips/msp430/usart/Msp430Spi1C.nc @@ -45,6 +45,7 @@ generic configuration Msp430Spi1C() { provides interface Resource; + provides interface ResourceRequested; provides interface SpiByte; provides interface SpiPacket; @@ -70,6 +71,7 @@ implementation { Msp430SpiConfigure = SpiP.Msp430SpiConfigure[ CLIENT_ID ]; components new Msp430Usart1C() as UsartC; + ResourceReqeusted = UsartC; SpiP.ResourceConfigure[ CLIENT_ID ] <- UsartC.ResourceConfigure; SpiP.UsartResource[ CLIENT_ID ] -> UsartC.Resource; SpiP.UsartInterrupts -> UsartC.HplMsp430UsartInterrupts; diff --git a/tos/chips/msp430/usart/Msp430Uart0C.nc b/tos/chips/msp430/usart/Msp430Uart0C.nc index 6079a94d..0aa80336 100644 --- a/tos/chips/msp430/usart/Msp430Uart0C.nc +++ b/tos/chips/msp430/usart/Msp430Uart0C.nc @@ -33,6 +33,7 @@ * An implementation of the UART on USART0 for the MSP430. * @author Vlado Handziski * @author Jonathan Hui + * @author Eric B. Decker * @version $Revision$ $Date$ */ @@ -41,6 +42,7 @@ generic configuration Msp430Uart0C() { provides interface Resource; + provides interface ResourceRequested; provides interface UartStream; provides interface UartByte; @@ -55,13 +57,13 @@ implementation { components Msp430Uart0P as UartP; Resource = UartP.Resource[ CLIENT_ID ]; - UartStream = UartP.UartStream; - UartByte = UartP.UartByte; + UartStream = UartP.UartStream[ CLIENT_ID ]; + UartByte = UartP.UartByte[ CLIENT_ID ]; Msp430UartConfigure = UartP.Msp430UartConfigure[ CLIENT_ID ]; components new Msp430Usart0C() as UsartC; + ResourceRequested = UsartC; UartP.ResourceConfigure[ CLIENT_ID ] <- UsartC.ResourceConfigure; UartP.UsartResource[ CLIENT_ID ] -> UsartC.Resource; - UartP.UsartInterrupts -> UsartC.HplMsp430UsartInterrupts; - + UartP.UsartInterrupts[ CLIENT_ID ] -> UsartC.HplMsp430UsartInterrupts; } diff --git a/tos/chips/msp430/usart/Msp430Uart0P.nc b/tos/chips/msp430/usart/Msp430Uart0P.nc index b61f8004..bce4f7fb 100644 --- a/tos/chips/msp430/usart/Msp430Uart0P.nc +++ b/tos/chips/msp430/usart/Msp430Uart0P.nc @@ -32,24 +32,23 @@ /** * @author Jonathan Hui * @author Vlado Handziski + * @author Eric B. Decker * @version $Revision$ $Date$ */ configuration Msp430Uart0P { provides interface Resource[ uint8_t id ]; - provides interface ResourceConfigure[uint8_t id ]; - provides interface UartStream; - provides interface UartByte; + provides interface ResourceConfigure[ uint8_t id ]; + provides interface UartStream[ uint8_t id ]; + provides interface UartByte[ uint8_t id ]; uses interface Resource as UsartResource[ uint8_t id ]; uses interface Msp430UartConfigure[ uint8_t id ]; - uses interface HplMsp430UsartInterrupts as UsartInterrupts; - + uses interface HplMsp430UsartInterrupts as UsartInterrupts[ uint8_t id ]; } implementation { - components new Msp430UartP() as UartP; Resource = UartP.Resource; ResourceConfigure = UartP.ResourceConfigure; diff --git a/tos/chips/msp430/usart/Msp430Uart1C.nc b/tos/chips/msp430/usart/Msp430Uart1C.nc index 4829a4c5..a824fd35 100644 --- a/tos/chips/msp430/usart/Msp430Uart1C.nc +++ b/tos/chips/msp430/usart/Msp430Uart1C.nc @@ -33,6 +33,7 @@ * An implementation of the UART on USART1 for the MSP430. * @author Vlado Handziski * @author Jonathan Hui + * @author Eric B. Decker * @version $Revision$ $Date$ */ @@ -41,6 +42,7 @@ generic configuration Msp430Uart1C() { provides interface Resource; + provides interface ResourceRequested; provides interface UartStream; provides interface UartByte; @@ -55,13 +57,13 @@ implementation { components Msp430Uart1P as UartP; Resource = UartP.Resource[ CLIENT_ID ]; - UartStream = UartP.UartStream; - UartByte = UartP.UartByte; + UartStream = UartP.UartStream[ CLIENT_ID ]; + UartByte = UartP.UartByte[ CLIENT_ID ];; Msp430UartConfigure = UartP.Msp430UartConfigure[ CLIENT_ID ]; components new Msp430Usart1C() as UsartC; + ResourceRequested = UsartC; UartP.ResourceConfigure[ CLIENT_ID ] <- UsartC.ResourceConfigure; UartP.UsartResource[ CLIENT_ID ] -> UsartC.Resource; - UartP.UsartInterrupts -> UsartC.HplMsp430UsartInterrupts; - + UartP.UsartInterrupts[ CLIENT_ID ] -> UsartC.HplMsp430UsartInterrupts; } diff --git a/tos/chips/msp430/usart/Msp430Uart1P.nc b/tos/chips/msp430/usart/Msp430Uart1P.nc index 834feea7..0f367db0 100644 --- a/tos/chips/msp430/usart/Msp430Uart1P.nc +++ b/tos/chips/msp430/usart/Msp430Uart1P.nc @@ -32,19 +32,20 @@ /** * @author Jonathan Hui * @author Vlado Handziski + * @author Eric B. Decker * @version $Revision$ $Date$ */ configuration Msp430Uart1P { provides interface Resource[ uint8_t id ]; - provides interface ResourceConfigure[uint8_t id ]; - provides interface UartStream; - provides interface UartByte; + provides interface ResourceConfigure[ uint8_t id ]; + provides interface UartStream[ uint8_t id ]; + provides interface UartByte[ uint8_t id ]; uses interface Resource as UsartResource[ uint8_t id ]; uses interface Msp430UartConfigure[ uint8_t id ]; - uses interface HplMsp430UsartInterrupts as UsartInterrupts; + uses interface HplMsp430UsartInterrupts as UsartInterrupts[ uint8_t id ]; } diff --git a/tos/chips/msp430/usart/Msp430UartP.nc b/tos/chips/msp430/usart/Msp430UartP.nc index 9393595c..ca408466 100644 --- a/tos/chips/msp430/usart/Msp430UartP.nc +++ b/tos/chips/msp430/usart/Msp430UartP.nc @@ -32,6 +32,7 @@ /** * @author Jonathan Hui * @author Vlado Handziski + * @author Eric B. Decker * @version $Revision$ $Date$ */ @@ -41,14 +42,13 @@ generic module Msp430UartP() { provides interface Resource[ uint8_t id ]; provides interface ResourceConfigure[ uint8_t id ]; - //provides interface Msp430UartControl as UartControl[ uint8_t id ]; - provides interface UartStream; - provides interface UartByte; + provides interface UartStream[ uint8_t id ]; + provides interface UartByte[ uint8_t id ]; uses interface Resource as UsartResource[ uint8_t id ]; uses interface Msp430UartConfigure[ uint8_t id ]; uses interface HplMsp430Usart as Usart; - uses interface HplMsp430UsartInterrupts as UsartInterrupts; + uses interface HplMsp430UsartInterrupts as UsartInterrupts[ uint8_t id ]; uses interface Counter; uses interface Leds; @@ -60,6 +60,7 @@ implementation { norace uint16_t m_tx_len, m_rx_len; norace uint16_t m_tx_pos, m_rx_pos; norace uint8_t m_byte_time; + norace uint8_t current_owner; async command error_t Resource.immediateRequest[ uint8_t id ]() { return call UsartResource.immediateRequest[ id ](); @@ -74,6 +75,8 @@ implementation { } async command error_t Resource.release[ uint8_t id ]() { + if (call UsartResource.isOwner[id]() == FALSE) + return FAIL; if ( m_rx_buf || m_tx_buf ) return EBUSY; return call UsartResource.release[ id ](); @@ -90,24 +93,32 @@ implementation { call Usart.resetUsart(TRUE); call Usart.disableIntr(); call Usart.disableUart(); - call Usart.resetUsart(FALSE); + + /* leave the usart in reset */ + //call Usart.resetUsart(FALSE); // this shouldn't be called. } event void UsartResource.granted[ uint8_t id ]() { signal Resource.granted[ id ](); } - async command error_t UartStream.enableReceiveInterrupt() { + async command error_t UartStream.enableReceiveInterrupt[ uint8_t id ]() { + if (call UsartResource.isOwner[id]() == FALSE) + return FAIL; call Usart.enableRxIntr(); return SUCCESS; } - async command error_t UartStream.disableReceiveInterrupt() { + async command error_t UartStream.disableReceiveInterrupt[ uint8_t id ]() { + if (call UsartResource.isOwner[id]() == FALSE) + return FAIL; call Usart.disableRxIntr(); return SUCCESS; } - async command error_t UartStream.receive( uint8_t* buf, uint16_t len ) { + async command error_t UartStream.receive[ uint8_t id ]( uint8_t* buf, uint16_t len ) { + if (call UsartResource.isOwner[id]() == FALSE) + return FAIL; if ( len == 0 ) return FAIL; atomic { @@ -120,21 +131,22 @@ implementation { return SUCCESS; } - async event void UsartInterrupts.rxDone( uint8_t data ) { + async event void UsartInterrupts.rxDone[uint8_t id]( uint8_t data ) { if ( m_rx_buf ) { m_rx_buf[ m_rx_pos++ ] = data; if ( m_rx_pos >= m_rx_len ) { uint8_t* buf = m_rx_buf; m_rx_buf = NULL; - signal UartStream.receiveDone( buf, m_rx_len, SUCCESS ); + signal UartStream.receiveDone[id]( buf, m_rx_len, SUCCESS ); } - } - else { - signal UartStream.receivedByte( data ); + } else { + signal UartStream.receivedByte[id]( data ); } } - async command error_t UartStream.send( uint8_t* buf, uint16_t len ) { + async command error_t UartStream.send[ uint8_t id ]( uint8_t* buf, uint16_t len ) { + if (call UsartResource.isOwner[id]() == FALSE) + return FAIL; if ( len == 0 ) return FAIL; else if ( m_tx_buf ) @@ -142,36 +154,46 @@ implementation { m_tx_buf = buf; m_tx_len = len; m_tx_pos = 0; + current_owner = id; call Usart.tx( buf[ m_tx_pos++ ] ); return SUCCESS; } - async event void UsartInterrupts.txDone() { - if ( m_tx_pos < m_tx_len ) { + async event void UsartInterrupts.txDone[uint8_t id]() { + if(current_owner != id) { + uint8_t* buf = m_tx_buf; + m_tx_buf = NULL; + signal UartStream.sendDone[id]( buf, m_tx_len, FAIL ); + } + else if ( m_tx_pos < m_tx_len ) { call Usart.tx( m_tx_buf[ m_tx_pos++ ] ); } else { uint8_t* buf = m_tx_buf; m_tx_buf = NULL; - signal UartStream.sendDone( buf, m_tx_len, SUCCESS ); + signal UartStream.sendDone[id]( buf, m_tx_len, SUCCESS ); } } - async command error_t UartByte.send( uint8_t data ) { - call Usart.clrTxIntr(); - call Usart.disableTxIntr (); - call Usart.tx( data ); - while( !call Usart.isTxIntrPending() ); - call Usart.clrTxIntr(); - call Usart.enableTxIntr(); + async command error_t UartByte.send[ uint8_t id ]( uint8_t data ) { + if (call UsartResource.isOwner[id]() == FALSE) + return FAIL; + call Usart.clrTxIntr(); + call Usart.disableTxIntr (); + call Usart.tx( data ); + while( !call Usart.isTxIntrPending() ); + call Usart.clrTxIntr(); + call Usart.enableTxIntr(); return SUCCESS; } - async command error_t UartByte.receive( uint8_t* byte, uint8_t timeout ) { + async command error_t UartByte.receive[ uint8_t id ]( uint8_t* byte, uint8_t timeout ) { uint16_t timeout_micro = m_byte_time * timeout + 1; uint16_t start; + if (call UsartResource.isOwner[id]() == FALSE) + return FAIL; start = call Counter.get(); while( !call Usart.isRxIntrPending() ) { if ( ( call Counter.get() - start ) >= timeout_micro ) @@ -194,4 +216,8 @@ implementation { } default event void Resource.granted[ uint8_t id ]() {} + + default async event void UartStream.sendDone[ uint8_t id ](uint8_t* buf, uint16_t len, error_t error) {} + default async event void UartStream.receivedByte[ uint8_t id ](uint8_t byte) {} + default async event void UartStream.receiveDone[ uint8_t id ]( uint8_t* buf, uint16_t len, error_t error ) {} } diff --git a/tos/chips/msp430/usart/Msp430Usart0C.nc b/tos/chips/msp430/usart/Msp430Usart0C.nc index 0b8bdb91..49bd5bec 100644 --- a/tos/chips/msp430/usart/Msp430Usart0C.nc +++ b/tos/chips/msp430/usart/Msp430Usart0C.nc @@ -39,6 +39,7 @@ generic configuration Msp430Usart0C() { provides interface Resource; + provides interface ResourceRequested; provides interface ArbiterInfo; provides interface HplMsp430Usart; provides interface HplMsp430UsartInterrupts; @@ -60,6 +61,7 @@ implementation { components Msp430UsartShare0P as UsartShareP; Resource = UsartShareP.Resource[ CLIENT_ID ]; + ResourceRequested = UsartShareP.ResourceRequested[ CLIENT_ID ]; ResourceConfigure = UsartShareP.ResourceConfigure[ CLIENT_ID ]; ArbiterInfo = UsartShareP.ArbiterInfo; HplMsp430UsartInterrupts = UsartShareP.Interrupts[ CLIENT_ID ]; diff --git a/tos/chips/msp430/usart/Msp430Usart1C.nc b/tos/chips/msp430/usart/Msp430Usart1C.nc index 29f5d021..866e18e1 100644 --- a/tos/chips/msp430/usart/Msp430Usart1C.nc +++ b/tos/chips/msp430/usart/Msp430Usart1C.nc @@ -40,6 +40,7 @@ generic configuration Msp430Usart1C() { provides interface Resource; + provides interface ResourceRequested; provides interface ArbiterInfo; provides interface HplMsp430Usart; provides interface HplMsp430UsartInterrupts; @@ -56,6 +57,7 @@ implementation { components Msp430UsartShare1P as UsartShareP; Resource = UsartShareP.Resource[ CLIENT_ID ]; + ResourceRequested = UsartShareP.ResourceRequested[ CLIENT_ID ]; ResourceConfigure = UsartShareP.ResourceConfigure[ CLIENT_ID ]; ArbiterInfo = UsartShareP.ArbiterInfo; HplMsp430UsartInterrupts = UsartShareP.Interrupts[ CLIENT_ID ]; diff --git a/tos/chips/msp430/usart/Msp430UsartShare0P.nc b/tos/chips/msp430/usart/Msp430UsartShare0P.nc index af092585..d8643407 100644 --- a/tos/chips/msp430/usart/Msp430UsartShare0P.nc +++ b/tos/chips/msp430/usart/Msp430UsartShare0P.nc @@ -39,6 +39,7 @@ configuration Msp430UsartShare0P { provides interface HplMsp430UsartInterrupts as Interrupts[ uint8_t id ]; provides interface HplMsp430I2CInterrupts as I2CInterrupts[ uint8_t id ]; provides interface Resource[ uint8_t id ]; + provides interface ResourceRequested[ uint8_t id ]; provides interface ArbiterInfo; uses interface ResourceConfigure[ uint8_t id ]; @@ -52,6 +53,7 @@ implementation { components new FcfsArbiterC( MSP430_HPLUSART0_RESOURCE ) as ArbiterC; Resource = ArbiterC; + ResourceRequested = ArbiterC; ResourceConfigure = ArbiterC; ArbiterInfo = ArbiterC; UsartShareP.ArbiterInfo -> ArbiterC; diff --git a/tos/chips/msp430/usart/Msp430UsartShare1P.nc b/tos/chips/msp430/usart/Msp430UsartShare1P.nc index 1b6edcf5..3b977b34 100644 --- a/tos/chips/msp430/usart/Msp430UsartShare1P.nc +++ b/tos/chips/msp430/usart/Msp430UsartShare1P.nc @@ -39,6 +39,7 @@ configuration Msp430UsartShare1P { provides interface HplMsp430UsartInterrupts as Interrupts[ uint8_t id ]; provides interface Resource[ uint8_t id ]; + provides interface ResourceRequested[ uint8_t id ]; provides interface ArbiterInfo; uses interface ResourceConfigure[ uint8_t id ]; @@ -52,6 +53,7 @@ implementation { components new FcfsArbiterC( MSP430_HPLUSART1_RESOURCE ) as ArbiterC; Resource = ArbiterC; + ResourceRequested = ArbiterC; ResourceConfigure = ArbiterC; ArbiterInfo = ArbiterC; UsartShareP.ArbiterInfo -> ArbiterC;