diff --git a/include/libopencm3/vf6xx/iomuxc.h b/include/libopencm3/vf6xx/iomuxc.h new file mode 100644 index 0000000000..7daf17dbdb --- /dev/null +++ b/include/libopencm3/vf6xx/iomuxc.h @@ -0,0 +1,256 @@ +/** @defgroup VF6xx_iomuxc_defines IO MUX Controller Defines + * + * @brief Defined Constants and Types for the VF6xx IO MUX Controller + * + * @ingroup VF6xx_defines + * + * @version 1.0.0 + * + * @author @htmlonly © @endhtmlonly 2014 + * Stefan Agner + * + * @date 03 July 2014 + * + * LGPL License Terms @ref lgpl_license + * */ +/* + * This file is part of the libopencm3 project. + * + * Copyright (C) 2014 Stefan Agner + * + * This library is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library. If not, see . + */ + +#ifndef LIBOPENCM3_VF6XX_IOMUXC_H +#define LIBOPENCM3_VF6XX_IOMUXC_H + +#include +#include + +/* --- Convenience macros -------------------------------------------------- */ + +/****************************************************************************/ +/** @defgroup iomuxc_reg IO MUX Controller register +@ingroup VF6xx_iomuxc_defines + +@{*/ +#define IOMUXC(pad) MMIO32(IOMUXC_BASE + (0x4 * pad)) + +#define IOMUXC_PAD(mode, speed, dse, pus, flags) \ + (IOMUXC_##mode) << IOMUXC_MUX_MODE_SHIFT | \ + (IOMUXC_##speed) << IOMUXC_SPEED_SHIFT | \ + (IOMUXC_##dse) << IOMUXC_DSE_SHIFT | \ + (IOMUXC_##pus) << IOMUXC_PUS_SHIFT | \ + (flags) + + +/* --- GPIO registers ------------------------------------------------------ */ + +#define IOMUXC_MUX_MODE_SHIFT 20 +#define IOMUXC_MUX_MODE_MASK (0x7 << 20) +#define IOMUXC_MUX_MODE_ALT0 0x0 +#define IOMUXC_MUX_MODE_ALT1 0x1 +#define IOMUXC_MUX_MODE_ALT2 0x2 +#define IOMUXC_MUX_MODE_ALT3 0x3 +#define IOMUXC_MUX_MODE_ALT4 0x4 +#define IOMUXC_MUX_MODE_ALT5 0x5 +#define IOMUXC_MUX_MODE_ALT6 0x6 +#define IOMUXC_MUX_MODE_ALT7 0x7 +#define IOMUXC_SPEED_SHIFT 12 +#define IOMUXC_SPEED_MASK (0x3 << 12) +#define IOMUXC_SPEED_LOW 0x0 +#define IOMUXC_SPEED_MEDIUM 0x1 +#define IOMUXC_SPEED_HIGH 0x3 +#define IOMUXC_SRE (0x1 << 11) +#define IOMUXC_ODE (0x1 << 10) +#define IOMUXC_HYS (0x1 << 9) +#define IOMUXC_DSE_SHIFT 6 +#define IOMUXC_DSE_MASK (0x7 << 6) +#define IOMUXC_DSE_OFF 0x0 +#define IOMUXC_DSE_150OHM 0x1 +#define IOMUXC_DSE_75OHM 0x2 +#define IOMUXC_DSE_50OHM 0x3 +#define IOMUXC_DSE_37OHM 0x4 +#define IOMUXC_DSE_30OHM 0x5 +#define IOMUXC_DSE_25OHM 0x6 +#define IOMUXC_DSE_20OHM 0x7 +#define IOMUXC_PUS_SHIFT 4 +#define IOMUXC_PUS_MASK (0x3 << 4) +#define IOMUXC_PUS_PD_100KOHM 0x0 +#define IOMUXC_PUS_PU_47KOHM 0x1 +#define IOMUXC_PUS_PU_100KOHM 0x2 +#define IOMUXC_PUS_PU_22KOHM 0x3 +#define IOMUXC_PKE (0x1 << 3) +#define IOMUXC_PUE (0x1 << 2) +#define IOMUXC_OBE (0x1 << 1) +#define IOMUXC_IBE (0x1 << 0) + + +/* --- Type definitions ---------------------------------------------------- */ +/*---------------------------------------------------------------------------*/ +/** @brief IO-MUX Pads + +Pads available by the IO-MUX controller +*/ + +enum vf6xx_pad { + PTA6, + PTA8, + PTA9, + PTA10, + PTA11, + PTA12, + PTA16, + PTA17, + PTA18, + PTA19, + PTA20, + PTA21, + PTA22, + PTA23, + PTA24, + PTA25, + PTA26, + PTA27, + PTA28, + PTA29, + PTA30, + PTA31, + PTB0, + PTB1, + PTB2, + PTB3, + PTB4, + PTB5, + PTB6, + PTB7, + PTB8, + PTB9, + PTB10, + PTB11, + PTB12, + PTB13, + PTB14, + PTB15, + PTB16, + PTB17, + PTB18, + PTB19, + PTB20, + PTB21, + PTB22, + PTC0, + PTC1, + PTC2, + PTC3, + PTC4, + PTC5, + PTC6, + PTC7, + PTC8, + PTC9, + PTC10, + PTC11, + PTC12, + PTC13, + PTC14, + PTC15, + PTC16, + PTC17, + PTD31, + PTD30, + PTD29, + PTD28, + PTD27, + PTD26, + PTD25, + PTD24, + PTD23, + PTD22, + PTD21, + PTD20, + PTD19, + PTD18, + PTD17, + PTD16, + PTD0, + PTD1, + PTD2, + PTD3, + PTD4, + PTD5, + PTD6, + PTD7, + PTD8, + PTD9, + PTD10, + PTD11, + PTD12, + PTD13, + PTB23, + PTB24, + PTB25, + PTB26, + PTB27, + PTB28, + PTC26, + PTC27, + PTC28, + PTC29, + PTC30, + PTC31, + PTE0, + PTE1, + PTE2, + PTE3, + PTE4, + PTE5, + PTE6, + PTE7, + PTE8, + PTE9, + PTE10, + PTE11, + PTE12, + PTE13, + PTE14, + PTE15, + PTE16, + PTE17, + PTE18, + PTE19, + PTE20, + PTE21, + PTE22, + PTE23, + PTE24, + PTE25, + PTE26, + PTE27, + PTE28, + PTA7, +}; + + +/* --- Function prototypes ------------------------------------------------- */ + +#include + +BEGIN_DECLS + +void iomuxc_mux(enum vf6xx_pad pad, uint32_t muxc); + +END_DECLS + +#endif diff --git a/include/libopencm3/vf6xx/memorymap.h b/include/libopencm3/vf6xx/memorymap.h index 0644930610..efb84f6912 100644 --- a/include/libopencm3/vf6xx/memorymap.h +++ b/include/libopencm3/vf6xx/memorymap.h @@ -44,6 +44,13 @@ #define SPI0_BASE (PERIPH_BASE_AIPS0 + 0x2C000) #define SPI1_BASE (PERIPH_BASE_AIPS0 + 0x2D000) +#define IOMUXC_BASE (PERIPH_BASE_AIPS0 + 0x48000) +#define PORTA_MUX_BASE (PERIPH_BASE_AIPS0 + 0x49000) +#define PORTB_MUX_BASE (PERIPH_BASE_AIPS0 + 0x4A000) +#define PORTC_MUX_BASE (PERIPH_BASE_AIPS0 + 0x4B000) +#define PORTD_MUX_BASE (PERIPH_BASE_AIPS0 + 0x4C000) +#define PORTE_MUX_BASE (PERIPH_BASE_AIPS0 + 0x4D000) + #define ANADIG_BASE (PERIPH_BASE_AIPS0 + 0x50000) #define CCM_BASE (PERIPH_BASE_AIPS0 + 0x6B000) diff --git a/lib/vf6xx/Makefile b/lib/vf6xx/Makefile index 61f3044a5c..78bd424bb7 100644 --- a/lib/vf6xx/Makefile +++ b/lib/vf6xx/Makefile @@ -34,7 +34,7 @@ CFLAGS = -Os -g \ -mcpu=cortex-m4 -mthumb $(FP_FLAGS) -Wstrict-prototypes \ -ffunction-sections -fdata-sections -MD -DVF6XX ARFLAGS = rcs -OBJS = ccm.o uart.o gpio.o +OBJS = ccm.o uart.o gpio.o iomuxc.o VPATH += ../cm3 diff --git a/lib/vf6xx/iomuxc.c b/lib/vf6xx/iomuxc.c new file mode 100644 index 0000000000..12105751b4 --- /dev/null +++ b/lib/vf6xx/iomuxc.c @@ -0,0 +1,57 @@ +/** @defgroup VF6xx_iomuxc IOMUX-Control + * + * @ingroup VF6xx + * + * @section vf6xx_gpio_api_ex GPIO API. + * + * @brief VF6xx IO Pad MUX Controller + * + * @author @htmlonly © @endhtmlonly 2014 Stefan Agner + * + * @date 07 July 2014 + * + * This library supports the GPIO module in the VF6xx SoC of Freescale. + * Access is provided by GPIO number according to the Pinmux list of the + * Reference Manual, similar as GPIOs are available on Linux. + * + * LGPL License Terms @ref lgpl_license + */ +/* + * This file is part of the libopencm3 project. + * + * Copyright (C) 2014 Stefan Agner + * + * This library is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library. If not, see . + */ + +/**@{*/ + +#include +#include + +/*---------------------------------------------------------------------------*/ +/** @brief Set GPIO + +Set GPIO by GPIO number according to MUX list + +@param[in] gpio unsigned 32 bit. GPIO number +*/ + +void iomuxc_mux(enum vf6xx_pad pad, uint32_t muxc) +{ + IOMUXC(pad) = muxc; +} + +/**@}*/ +