⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 msp430uartp.nc

📁 tinyos2.0版本驱动
💻 NC
字号:
/** * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright *   notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright *   notice, this list of conditions and the following disclaimer in the *   documentation and/or other materials provided with the *   distribution. * - Neither the name of the Arch Rock Corporation nor the names of *   its contributors may be used to endorse or promote products derived *   from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE * ARCH ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE *//** * @author Jonathan Hui <jhui@archrock.com> * @author Vlado Handziski <handzisk@tkn.tu-berlin.de> * @author Eric B. Decker <cire831@gmail.com> * @version $Revision: 1.7 $ $Date: 2008/06/04 05:31:15 $ */#include<Timer.h>generic module Msp430UartP() {  provides interface Resource[ uint8_t id ];  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 HplMsp430Usart as Usart;  uses interface HplMsp430UsartInterrupts as UsartInterrupts[ uint8_t id ];  uses interface Counter<T32khz,uint16_t>;  uses interface Leds;}implementation {    norace uint16_t m_tx_len, m_rx_len;  norace uint8_t * COUNT_NOK(m_tx_len) m_tx_buf, * COUNT_NOK(m_rx_len) m_rx_buf;  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 ]();  }  async command error_t Resource.request[ uint8_t id ]() {    return call UsartResource.request[ id ]();  }  async command uint8_t Resource.isOwner[ uint8_t id ]() {    return call UsartResource.isOwner[ id ]();  }  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 ]();  }  async command void ResourceConfigure.configure[ uint8_t id ]() {    msp430_uart_union_config_t* config = call Msp430UartConfigure.getConfig[id]();    m_byte_time = config->uartConfig.ubr / 2;    call Usart.setModeUart(config);    call Usart.enableIntr();  }  async command void ResourceConfigure.unconfigure[ uint8_t id ]() {    call Usart.resetUsart(TRUE);    call Usart.disableIntr();    call Usart.disableUart();    /* 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[ uint8_t id ]() {    if (call UsartResource.isOwner[id]() == FALSE)      return FAIL;    call Usart.enableRxIntr();    return SUCCESS;  }    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 id ]( uint8_t* buf, uint16_t len ) {    if (call UsartResource.isOwner[id]() == FALSE)      return FAIL;    if ( len == 0 )      return FAIL;    atomic {      if ( m_rx_buf )	return EBUSY;      m_rx_buf = buf;      m_rx_len = len;      m_rx_pos = 0;    }    return SUCCESS;  }    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[id]( buf, m_rx_len, SUCCESS );      }    } else {      signal UartStream.receivedByte[id]( data );    }  }    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 )      return EBUSY;    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[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[id]( buf, m_tx_len, SUCCESS );    }  }    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 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 )				return FAIL;    }    *byte = call Usart.rx();        return SUCCESS;  }    async event void Counter.overflow() {}    default async command error_t UsartResource.isOwner[ uint8_t id ]() { return FAIL; }  default async command error_t UsartResource.request[ uint8_t id ]() { return FAIL; }  default async command error_t UsartResource.immediateRequest[ uint8_t id ]() { return FAIL; }  default async command error_t UsartResource.release[ uint8_t id ]() { return FAIL; }  default async command msp430_uart_union_config_t* Msp430UartConfigure.getConfig[uint8_t id]() {    return &msp430_uart_default_config;  }  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 ) {}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -