xe1205irqconfp.nc
来自「tinyos-2.0源代码!转载而已!要的尽管拿!」· NC 代码 · 共 229 行
NC
229 行
/* * Copyright (c) 2006, Ecole Polytechnique Federale de Lausanne (EPFL), * Switzerland. * 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 Ecole Polytechnique Federale de Lausanne (EPFL) * 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 COPYRIGHT * OWNER OR 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. * * ======================================================================== *//* * Implementation of XE1205IrqConf interface. * * @author Henri Dubois-Ferriere */module XE1205IrqConfP { provides interface XE1205IrqConf; provides interface Init @atleastonce(); uses interface XE1205Register as IrqParam5; uses interface XE1205Register as IrqParam6; uses interface Resource as SpiResource;}implementation {#include "xe1205debug.h" // norace is ok because protected by the isOwner() calls norace uint8_t irqparam5; norace uint8_t irqparam6; task void initTask() { atomic { xe1205check(1, call SpiResource.immediateRequest()); // should always succeed: task happens after softwareInit, before interrupts are enabled call IrqParam5.write(0x59); // IRQ0: Write_byte, IRQ1: fifofull, Tx_IRQ: TX_stopped. call IrqParam6.write(0x54); // fill fifo on pattern, clear pattern detect bit, start transmission when fifo not empty // no irq interrupt irqparam5=0x59; irqparam6=0x54; call SpiResource.release(); } } command error_t Init.init() { post initTask(); return SUCCESS; } event void SpiResource.granted() { } /* * Set IRQ0 sources in Rx mode. * @param src may be one of: irq_write_byte, irq_nFifoEmpty, or irq_Pattern. */ async command error_t XE1205IrqConf.setRxIrq0Source(xe1205_rx_irq0_src_t src) { error_t status; if (src > 3) return EINVAL; if (call SpiResource.isOwner()) return EBUSY; status = call SpiResource.immediateRequest(); xe1205check(2, status); if (status != SUCCESS) return status; irqparam5 &= ~(3 << 6); irqparam5 |= (src << 6); call IrqParam5.write(irqparam5); call SpiResource.release(); return SUCCESS; } /* * Set IRQ1 sources in Rx mode. * @param src may be one of: irq_Rssi or irq_FifoFull. */ async command error_t XE1205IrqConf.setRxIrq1Source(xe1205_rx_irq1_src_t src) { error_t status; if (src > 2) return EINVAL; if (call SpiResource.isOwner()) return EBUSY; status = call SpiResource.immediateRequest(); xe1205check(3, status); if (status != SUCCESS) return status; irqparam5 &= ~(3 << 4); irqparam5 |= (src << 4); call IrqParam5.write(irqparam5); call SpiResource.release(); return SUCCESS; } /* * Set IRQ1 sources in Tx mode. * @param src my be one of: irq_FifoFull or irq_TxStopped. */ async command error_t XE1205IrqConf.setTxIrq1Source(xe1205_tx_irq1_src_t src) { error_t status; if (src > 1) return EINVAL; if (call SpiResource.isOwner()) return EBUSY; status = call SpiResource.immediateRequest(); xe1205check(4, status); if (status != SUCCESS) return status; irqparam5 &= ~(1 << 3); irqparam5 |= (src << 3); call IrqParam5.write(irqparam5); call SpiResource.release(); return SUCCESS; } void clearFifoOverrun() { irqparam5 |= 1; call IrqParam5.write(irqparam5); } /** * Clear FIFO overrun flag. */ async command error_t XE1205IrqConf.clearFifoOverrun(bool haveResource) { error_t status; if (haveResource) { clearFifoOverrun(); } else { if (call SpiResource.isOwner()) return EBUSY; status = call SpiResource.immediateRequest(); clearFifoOverrun(); call SpiResource.release(); } return SUCCESS; } bool getFifoOverrun() { uint8_t reg; call IrqParam5.read(®); return reg & 1; } async command error_t XE1205IrqConf.getFifoOverrun(bool haveResource, bool* fifooverrun) { error_t status; if (haveResource) { *fifooverrun = getFifoOverrun(); } else { if (call SpiResource.isOwner()) return EBUSY; status = call SpiResource.immediateRequest(); xe1205check(5, status); if (status != SUCCESS) return status; *fifooverrun = getFifoOverrun(); call SpiResource.release(); } return SUCCESS; } void armPatternDetector() { irqparam6 |= (1 << 6); call IrqParam6.write(irqparam6); } /** * Arm the pattern detector (clear Start_detect flag). */ async command error_t XE1205IrqConf.armPatternDetector(bool haveResource) { error_t status; if (haveResource) { armPatternDetector(); } else { if (call SpiResource.isOwner()) return EBUSY; status = call SpiResource.immediateRequest(); xe1205check(5, status); if (status != SUCCESS) return status; armPatternDetector(); call SpiResource.release(); } return SUCCESS; }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?