-
Notifications
You must be signed in to change notification settings - Fork 16
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Remove ASFcore dependency (incorporate pinmux.[c,h])
- Loading branch information
1 parent
7118cb1
commit c3deba1
Showing
4 changed files
with
379 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,5 +1,5 @@ | ||
name=Adafruit FreeTouch Library | ||
version=1.0.0 | ||
version=1.0.1 | ||
author=Adafruit | ||
maintainer=Adafruit <[email protected]> | ||
sentence=Arduino library for QTouch on samd21 microcontroller | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,173 @@ | ||
/** | ||
* \file | ||
* | ||
* \brief SAM Pin Multiplexer Driver | ||
* | ||
* Copyright (C) 2012-2015 Atmel Corporation. All rights reserved. | ||
* | ||
* \asf_license_start | ||
* | ||
* \page License | ||
* | ||
* Redistribution and use in source and binary forms, with or without | ||
* modification, are permitted provided that the following conditions are met: | ||
* | ||
* 1. Redistributions of source code must retain the above copyright notice, | ||
* this list of conditions and the following disclaimer. | ||
* | ||
* 2. 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. | ||
* | ||
* 3. The name of Atmel may not be used to endorse or promote products derived | ||
* from this software without specific prior written permission. | ||
* | ||
* 4. This software may only be redistributed and used in connection with an | ||
* Atmel microcontroller product. | ||
* | ||
* THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED | ||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | ||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE | ||
* EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. | ||
* | ||
* \asf_license_stop | ||
* | ||
*/ | ||
/* | ||
* Support and FAQ: visit <a href="http://www.atmel.com/design-support/">Atmel Support</a> | ||
*/ | ||
|
||
// THIS IS A PARED-DOWN VERSION OF PINMUX.H FROM ATMEL ASFCORE 3. | ||
// Please keep original copyright and license intact! | ||
|
||
#include "pinmux.h" | ||
|
||
/** | ||
* \internal | ||
* Writes out a given configuration of a Port pin configuration to the | ||
* hardware module. | ||
* | ||
* \note If the pin direction is set as an output, the pull-up/pull-down input | ||
* configuration setting is ignored. | ||
* | ||
* \param[in] port Base of the PORT module to configure | ||
* \param[in] pin_mask Mask of the port pin to configure | ||
* \param[in] config Configuration settings for the pin | ||
*/ | ||
static void _system_pinmux_config( | ||
PortGroup *const port, | ||
const uint32_t pin_mask, | ||
const struct system_pinmux_config *const config) | ||
{ | ||
// Assert(port); | ||
// Assert(config); | ||
|
||
/* Track the configuration bits into a temporary variable before writing */ | ||
uint32_t pin_cfg = 0; | ||
|
||
/* Enabled powersave mode, don't create configuration */ | ||
if (!config->powersave) { | ||
/* Enable the pin peripheral MUX flag if non-GPIO selected (pinmux will | ||
* be written later) and store the new MUX mask */ | ||
if (config->mux_position != SYSTEM_PINMUX_GPIO) { | ||
pin_cfg |= PORT_WRCONFIG_PMUXEN; | ||
pin_cfg |= (config->mux_position << PORT_WRCONFIG_PMUX_Pos); | ||
} | ||
|
||
/* Check if the user has requested that the input buffer be enabled */ | ||
if ((config->direction == SYSTEM_PINMUX_PIN_DIR_INPUT) || | ||
(config->direction == SYSTEM_PINMUX_PIN_DIR_OUTPUT_WITH_READBACK)) { | ||
/* Enable input buffer flag */ | ||
pin_cfg |= PORT_WRCONFIG_INEN; | ||
|
||
/* Enable pull-up/pull-down control flag if requested */ | ||
if (config->input_pull != SYSTEM_PINMUX_PIN_PULL_NONE) { | ||
pin_cfg |= PORT_WRCONFIG_PULLEN; | ||
} | ||
|
||
/* Clear the port DIR bits to disable the output buffer */ | ||
port->DIRCLR.reg = pin_mask; | ||
} | ||
|
||
/* Check if the user has requested that the output buffer be enabled */ | ||
if ((config->direction == SYSTEM_PINMUX_PIN_DIR_OUTPUT) || | ||
(config->direction == SYSTEM_PINMUX_PIN_DIR_OUTPUT_WITH_READBACK)) { | ||
/* Cannot use a pull-up if the output driver is enabled, | ||
* if requested the input buffer can only sample the current | ||
* output state */ | ||
pin_cfg &= ~PORT_WRCONFIG_PULLEN; | ||
} | ||
} else { | ||
port->DIRCLR.reg = pin_mask; | ||
} | ||
|
||
/* The Write Configuration register (WRCONFIG) requires the | ||
* pins to to grouped into two 16-bit half-words - split them out here */ | ||
uint32_t lower_pin_mask = (pin_mask & 0xFFFF); | ||
uint32_t upper_pin_mask = (pin_mask >> 16); | ||
|
||
/* Configure the lower 16-bits of the port to the desired configuration, | ||
* including the pin peripheral multiplexer just in case it is enabled */ | ||
port->WRCONFIG.reg | ||
= (lower_pin_mask << PORT_WRCONFIG_PINMASK_Pos) | | ||
pin_cfg | PORT_WRCONFIG_WRPMUX | PORT_WRCONFIG_WRPINCFG; | ||
|
||
/* Configure the upper 16-bits of the port to the desired configuration, | ||
* including the pin peripheral multiplexer just in case it is enabled */ | ||
port->WRCONFIG.reg | ||
= (upper_pin_mask << PORT_WRCONFIG_PINMASK_Pos) | | ||
pin_cfg | PORT_WRCONFIG_WRPMUX | PORT_WRCONFIG_WRPINCFG | | ||
PORT_WRCONFIG_HWSEL; | ||
|
||
if(!config->powersave) { | ||
/* Set the pull-up state once the port pins are configured if one was | ||
* requested and it does not violate the valid set of port | ||
* configurations */ | ||
if (pin_cfg & PORT_WRCONFIG_PULLEN) { | ||
/* Set the OUT register bits to enable the pull-up if requested, | ||
* clear to enable pull-down */ | ||
if (config->input_pull == SYSTEM_PINMUX_PIN_PULL_UP) { | ||
port->OUTSET.reg = pin_mask; | ||
} else { | ||
port->OUTCLR.reg = pin_mask; | ||
} | ||
} | ||
|
||
/* Check if the user has requested that the output buffer be enabled */ | ||
if ((config->direction == SYSTEM_PINMUX_PIN_DIR_OUTPUT) || | ||
(config->direction == SYSTEM_PINMUX_PIN_DIR_OUTPUT_WITH_READBACK)) { | ||
/* Set the port DIR bits to enable the output buffer */ | ||
port->DIRSET.reg = pin_mask; | ||
} | ||
} | ||
} | ||
|
||
/** | ||
* \brief Writes a Port pin configuration to the hardware module. | ||
* | ||
* Writes out a given configuration of a Port pin configuration to the hardware | ||
* module. | ||
* | ||
* \note If the pin direction is set as an output, the pull-up/pull-down input | ||
* configuration setting is ignored. | ||
* | ||
* \param[in] gpio_pin Index of the GPIO pin to configure | ||
* \param[in] config Configuration settings for the pin | ||
*/ | ||
void system_pinmux_pin_set_config( | ||
const uint8_t gpio_pin, | ||
const struct system_pinmux_config *const config) | ||
{ | ||
PortGroup *const port = system_pinmux_get_group_from_gpio_pin(gpio_pin); | ||
uint32_t pin_mask = (1UL << (gpio_pin % 32)); | ||
|
||
_system_pinmux_config(port, pin_mask, config); | ||
} | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,204 @@ | ||
/** | ||
* \file | ||
* | ||
* \brief SAM Pin Multiplexer Driver | ||
* | ||
* Copyright (C) 2012-2015 Atmel Corporation. All rights reserved. | ||
* | ||
* \asf_license_start | ||
* | ||
* \page License | ||
* | ||
* Redistribution and use in source and binary forms, with or without | ||
* modification, are permitted provided that the following conditions are met: | ||
* | ||
* 1. Redistributions of source code must retain the above copyright notice, | ||
* this list of conditions and the following disclaimer. | ||
* | ||
* 2. 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. | ||
* | ||
* 3. The name of Atmel may not be used to endorse or promote products derived | ||
* from this software without specific prior written permission. | ||
* | ||
* 4. This software may only be redistributed and used in connection with an | ||
* Atmel microcontroller product. | ||
* | ||
* THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED | ||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | ||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE | ||
* EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. | ||
* | ||
* \asf_license_stop | ||
* | ||
*/ | ||
/* | ||
* Support and FAQ: visit <a href="http://www.atmel.com/design-support/">Atmel Support</a> | ||
*/ | ||
#ifndef PINMUX_H_INCLUDED | ||
#define PINMUX_H_INCLUDED | ||
|
||
// THIS IS A PARED-DOWN VERSION OF PINMUX.H FROM ATMEL ASFCORE 3. | ||
// Please keep original copyright and license intact! | ||
|
||
#include <Arduino.h> // Includes stdbool and a LOT of other vitals | ||
|
||
#ifdef __cplusplus | ||
extern "C" { | ||
#endif | ||
|
||
/*@{*/ | ||
#if (SAML21) || (SAMC20) || (SAMC21) || defined(__DOXYGEN__) | ||
/** Output Driver Strength Selection feature support */ | ||
# define FEATURE_SYSTEM_PINMUX_DRIVE_STRENGTH | ||
#endif | ||
/*@}*/ | ||
|
||
/** Peripheral multiplexer index to select GPIO mode for a pin */ | ||
#define SYSTEM_PINMUX_GPIO (1 << 7) | ||
|
||
/** | ||
* \brief Port pin direction configuration enum. | ||
* | ||
* Enum for the possible pin direction settings of the port pin configuration | ||
* structure, to indicate the direction the pin should use. | ||
*/ | ||
enum system_pinmux_pin_dir { | ||
/** The pin's input buffer should be enabled, so that the pin state can | ||
* be read */ | ||
SYSTEM_PINMUX_PIN_DIR_INPUT, | ||
/** The pin's output buffer should be enabled, so that the pin state can | ||
* be set (but not read back) */ | ||
SYSTEM_PINMUX_PIN_DIR_OUTPUT, | ||
/** The pin's output and input buffers should both be enabled, so that the | ||
* pin state can be set and read back */ | ||
SYSTEM_PINMUX_PIN_DIR_OUTPUT_WITH_READBACK, | ||
}; | ||
|
||
/** | ||
* \brief Port pin input pull configuration enum. | ||
* | ||
* Enum for the possible pin pull settings of the port pin configuration | ||
* structure, to indicate the type of logic level pull the pin should use. | ||
*/ | ||
enum system_pinmux_pin_pull { | ||
/** No logical pull should be applied to the pin */ | ||
SYSTEM_PINMUX_PIN_PULL_NONE, | ||
/** Pin should be pulled up when idle */ | ||
SYSTEM_PINMUX_PIN_PULL_UP, | ||
/** Pin should be pulled down when idle */ | ||
SYSTEM_PINMUX_PIN_PULL_DOWN, | ||
}; | ||
|
||
/** | ||
* \brief Port pin configuration structure. | ||
* | ||
* Configuration structure for a port pin instance. This structure should | ||
* be initialized by the \ref system_pinmux_get_config_defaults() function | ||
* before being modified by the user application. | ||
*/ | ||
struct system_pinmux_config { | ||
/** MUX index of the peripheral that should control the pin, if peripheral | ||
* control is desired. For GPIO use, this should be set to | ||
* \ref SYSTEM_PINMUX_GPIO. */ | ||
uint8_t mux_position; | ||
|
||
/** Port buffer input/output direction */ | ||
enum system_pinmux_pin_dir direction; | ||
|
||
/** Logic level pull of the input buffer */ | ||
enum system_pinmux_pin_pull input_pull; | ||
|
||
/** Enable lowest possible powerstate on the pin. | ||
* | ||
* \note All other configurations will be ignored, the pin will be disabled. | ||
*/ | ||
bool powersave; | ||
}; | ||
|
||
/** \name Configuration and Initialization | ||
* @{ | ||
*/ | ||
|
||
/** | ||
* \brief Initializes a Port pin configuration structure to defaults. | ||
* | ||
* Initializes a given Port pin configuration structure to a set of | ||
* known default values. This function should be called on all new | ||
* instances of these configuration structures before being modified by the | ||
* user application. | ||
* | ||
* The default configuration is as follows: | ||
* \li Non peripheral (i.e. GPIO) controlled | ||
* \li Input mode with internal pull-up enabled | ||
* | ||
* \param[out] config Configuration structure to initialize to default values | ||
*/ | ||
static inline void system_pinmux_get_config_defaults( | ||
struct system_pinmux_config *const config) | ||
{ | ||
/* Sanity check arguments */ | ||
// Assert(config); | ||
|
||
/* Default configuration values */ | ||
config->mux_position = SYSTEM_PINMUX_GPIO; | ||
config->direction = SYSTEM_PINMUX_PIN_DIR_INPUT; | ||
config->input_pull = SYSTEM_PINMUX_PIN_PULL_UP; | ||
config->powersave = false; | ||
} | ||
|
||
void system_pinmux_pin_set_config( | ||
const uint8_t gpio_pin, | ||
const struct system_pinmux_config *const config); | ||
|
||
/** @} */ | ||
|
||
/** \name Special Mode Configuration (Physical Group Orientated) | ||
* @{ | ||
*/ | ||
|
||
/** | ||
* \brief Retrieves the PORT module group instance from a given GPIO pin number. | ||
* | ||
* Retrieves the PORT module group instance associated with a given logical | ||
* GPIO pin number. | ||
* | ||
* \param[in] gpio_pin Index of the GPIO pin to convert | ||
* | ||
* \return Base address of the associated PORT module. | ||
*/ | ||
static inline PortGroup* system_pinmux_get_group_from_gpio_pin( | ||
const uint8_t gpio_pin) | ||
{ | ||
uint8_t port_index = (gpio_pin / 128); | ||
uint8_t group_index = (gpio_pin / 32); | ||
|
||
/* Array of available ports */ | ||
Port *const ports[PORT_INST_NUM] = PORT_INSTS; | ||
|
||
if (port_index < PORT_INST_NUM) { | ||
return &(ports[port_index]->Group[group_index]); | ||
} else { | ||
// Assert(false); | ||
return NULL; | ||
} | ||
} | ||
|
||
/** @} */ | ||
|
||
#ifdef __cplusplus | ||
} | ||
#endif | ||
|
||
/** @} */ | ||
|
||
#endif // PINMUX_H_INCLUDED | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
c3deba1
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
FYI, please do not use the Arduino.h header. We use this library in CircuitPython and don't have it.