From: R. Steve McKown Date: Wed, 2 Dec 2009 20:21:08 +0000 (-0700) Subject: CP210X USB/serial controller family chip support. X-Git-Tag: patchset/2.1.1-4.5~18 X-Git-Url: https://oss.titaniummirror.com/gitweb/?p=tinyos-2.x.git;a=commitdiff_plain;h=cdaf2a198e0fa84fcb0fd54ea49a3f5e386f2a2b CP210X USB/serial controller family chip support. --- diff --git a/tos/chips/cp210x/CP210X.nc b/tos/chips/cp210x/CP210X.nc new file mode 100644 index 00000000..8a31f19b --- /dev/null +++ b/tos/chips/cp210x/CP210X.nc @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2008, Titanium Mirror, Inc. + * 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 Technische Universität Berlin 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. + */ + +/** + * HIL interface for the CP210X USB/serial controller chip. + * + * @author R. Steve McKown + */ + +interface CP210X { + /** + * @returns the current attach state of the USB connector. + */ + async command bool isEnabled(); + + /** + * Enable notifications from the cp210x. This does not enable the USB bus. + */ + async command void enable(); + + /** + * Disable notifications from the cp210x. This does not disable the USB bus. + */ + async command void disable(); + + /** + * Signalled any time the USB connection moves from any other state to the + * enabled state. In the enabled state, USB is supplying power and data + * connections can be established. Signals are only send if notifications + * have been enabled. + */ + async event void enabled(); + + /** + * Signalled any time the USB connection moves out of enabled state. This + * may be because the USB host or hub has placed the local USB device into + * suspend, the upstream hub has powered down, or the interconnecting cable + * has been disconnected. In all cases, only very minimal power is available + * from USB, all existing data connections are aborted and no new connections + * can be established. Signals are only sent if notifications have been + * enabled. + */ + async event void suspended(); +} diff --git a/tos/chips/cp210x/CP210XC.nc b/tos/chips/cp210x/CP210XC.nc new file mode 100644 index 00000000..c29adfd5 --- /dev/null +++ b/tos/chips/cp210x/CP210XC.nc @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2008, Titanium Mirror, Inc. + * 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 Technische Universität Berlin 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. + */ + +/** + * HIL implementation for the CP210X USB/serial controller chip family. + * + * @author R. Steve McKown + */ + +configuration CP210XC { + provides interface CP210X; +} +implementation { + components CP210XP; + CP210X = CP210XP; + + components MainC; + MainC.SoftwareInit -> CP210XP.Init; + + components CP210XPinsC as PinsC; + CP210XP.USB_SUSPENDn -> PinsC.USB_SUSPENDn; + CP210XP.IntUSB_SUSPENDn -> PinsC.IntUSB_SUSPENDn; + + components new TimerMilliC(); + CP210XP.Timer -> TimerMilliC; +} diff --git a/tos/chips/cp210x/CP210XP.nc b/tos/chips/cp210x/CP210XP.nc new file mode 100644 index 00000000..3060880b --- /dev/null +++ b/tos/chips/cp210x/CP210XP.nc @@ -0,0 +1,131 @@ +/* + * Copyright (c) 2008, Titanium Mirror, Inc. + * 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 Technische Universität Berlin 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. + */ + +/** + * HIL implementation for the CP210X USB/serial controller chip family. + * + * @author R. Steve McKown + */ + +module CP210XP { + provides { + interface Init; + interface CP210X; + } + uses { + interface GeneralIO as USB_SUSPENDn; + interface GpioInterrupt as IntUSB_SUSPENDn; + interface Timer; + } +} +implementation { + const static unsigned DELAY = 256; /* 1/4 sec in binary milliseconds */ + bool enabled; + + void setInt() + { + if (call USB_SUSPENDn.get()) + call IntUSB_SUSPENDn.enableFallingEdge(); + else + call IntUSB_SUSPENDn.enableRisingEdge(); + } + + void unsetInt() + { + call IntUSB_SUSPENDn.disable(); + } + + void update() + { + atomic setInt(); + } + + command error_t Init.init() + { + call USB_SUSPENDn.makeInput(); + + update(); + return SUCCESS; + } + + async command void CP210X.enable() + { + atomic { + enabled = TRUE; + setInt(); + } + } + + async command void CP210X.disable() + { + atomic { + enabled = FALSE; + unsetInt(); + } + } + + async command bool CP210X.isEnabled() + { + /* USB_SUSPENDn is active low and enabled is !suspend */ + return call USB_SUSPENDn.get(); + } + + task void signalChange() + { + bool suspended; + + atomic suspended = call USB_SUSPENDn.get(); + if (suspended) + signal CP210X.suspended(); + else + signal CP210X.enabled(); + } + + task void startTimer() + { + call Timer.startOneShot(DELAY); + } + + async event void IntUSB_SUSPENDn.fired() + { + post startTimer(); + } + + event void Timer.fired() + { + atomic { + update(); + if (enabled) + post signalChange(); + } + } + + default async event void CP210X.enabled() {} + default async event void CP210X.suspended() {} +}