mirror of
https://github.com/portapack-mayhem/mayhem-firmware.git
synced 2026-09-10 08:39:29 +00:00
47c94dbf26
* enabled sd over usb compilation * updated hackrf pro usb stack * fixed hackrf one code path * fixed hackrf pro code path * improved performance * fixed sd card clock * refactoring * formatted code
255 lines
8.4 KiB
C
255 lines
8.4 KiB
C
/*
|
|
* Copyright 2012-2026 Great Scott Gadgets <info@greatscottgadgets.com>
|
|
* Copyright 2012 Jared Boone <jared@sharebrained.com>
|
|
* Copyright 2013 Benjamin Vernoux <titanmkd@gmail.com>
|
|
*
|
|
* This file is part of HackRF.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2, or (at your option)
|
|
* any later version.
|
|
*
|
|
* This program 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 General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; see the file COPYING. If not, write to
|
|
* the Free Software Foundation, Inc., 51 Franklin Street,
|
|
* Boston, MA 02110-1301, USA.
|
|
*/
|
|
|
|
#include "pins.h"
|
|
|
|
#include <libopencm3/lpc43xx/scu.h>
|
|
|
|
#include "gpio.h"
|
|
#include "leds.h"
|
|
#include "platform_detect.h"
|
|
#include "platform_gpio.h"
|
|
#include "platform_scu.h"
|
|
#include "power.h"
|
|
#ifdef IS_PRALINE
|
|
#include "clock_io.h"
|
|
#endif
|
|
|
|
void pins_shutdown(void) {
|
|
/* Configure all GPIO as Input (safe state) */
|
|
// gpio_init();
|
|
|
|
/* Detect Platform */
|
|
const platform_gpio_t* gpio = platform_gpio();
|
|
const platform_scu_t* scu = platform_scu();
|
|
|
|
/* TDI and TMS pull-ups are required in all JTAG-compliant devices.
|
|
*
|
|
* The HackRF CPLD is always present, so let the CPLD pull up its TDI and TMS.
|
|
*
|
|
* The PortaPack may not be present, so pull up the PortaPack TMS pin from the
|
|
* microcontroller.
|
|
*
|
|
* TCK is recommended to be held low, so use microcontroller pull-down.
|
|
*
|
|
* TDO is undriven except when in Shift-IR or Shift-DR phases.
|
|
* Use the microcontroller to pull down to keep from floating.
|
|
*
|
|
* LPC43xx pull-up and pull-down resistors are approximately 53K.
|
|
*/
|
|
#ifdef IS_EXPANSION_COMPATIBLE
|
|
if (IS_EXPANSION_COMPATIBLE) {
|
|
scu_pinmux(scu->PINMUX_PP_TMS, SCU_GPIO_PUP | SCU_CONF_FUNCTION0);
|
|
scu_pinmux(scu->PINMUX_PP_TDO, SCU_GPIO_PDN | SCU_CONF_FUNCTION0);
|
|
}
|
|
#endif
|
|
scu_pinmux(scu->PINMUX_CPLD_TCK, SCU_GPIO_PDN | SCU_CONF_FUNCTION0);
|
|
#ifdef IS_NOT_PRALINE
|
|
if (IS_NOT_PRALINE) {
|
|
scu_pinmux(scu->PINMUX_CPLD_TMS, SCU_GPIO_NOPULL | SCU_CONF_FUNCTION0);
|
|
scu_pinmux(scu->PINMUX_CPLD_TDI, SCU_GPIO_NOPULL | SCU_CONF_FUNCTION0);
|
|
scu_pinmux(scu->PINMUX_CPLD_TDO, SCU_GPIO_PDN | SCU_CONF_FUNCTION4);
|
|
}
|
|
#endif
|
|
|
|
/* Configure SCU Pin Mux as GPIO */
|
|
scu_pinmux(scu->PINMUX_LED1, SCU_GPIO_NOPULL);
|
|
scu_pinmux(scu->PINMUX_LED2, SCU_GPIO_NOPULL);
|
|
scu_pinmux(scu->PINMUX_LED3, SCU_GPIO_NOPULL);
|
|
#ifdef IS_RAD1O
|
|
if (IS_RAD1O) {
|
|
scu_pinmux(scu->PINMUX_LED4, SCU_GPIO_NOPULL | SCU_CONF_FUNCTION4);
|
|
}
|
|
#endif
|
|
#ifdef IS_PRALINE
|
|
if (IS_PRALINE) {
|
|
scu_pinmux(scu->PINMUX_LED4, SCU_GPIO_NOPULL | SCU_CONF_FUNCTION0);
|
|
}
|
|
#endif
|
|
|
|
/* Configure USB indicators */
|
|
#ifdef IS_JAWBREAKER
|
|
if (IS_JAWBREAKER) {
|
|
scu_pinmux(scu->PINMUX_USB_LED0, SCU_CONF_FUNCTION3);
|
|
scu_pinmux(scu->PINMUX_USB_LED1, SCU_CONF_FUNCTION3);
|
|
}
|
|
#endif
|
|
|
|
#ifdef IS_PRALINE
|
|
if (IS_PRALINE) {
|
|
// disable_1v2_power();
|
|
// disable_3v3aux_power();
|
|
// gpio_output(gpio->gpio_1v2_enable);
|
|
// gpio_output(gpio->gpio_3v3aux_enable_n);
|
|
// scu_pinmux(scu->PINMUX_EN1V2, SCU_GPIO_FAST | SCU_CONF_FUNCTION0);
|
|
// scu_pinmux(scu->PINMUX_EN3V3_AUX_N, SCU_GPIO_FAST | SCU_CONF_FUNCTION4);
|
|
}
|
|
#endif
|
|
|
|
#ifdef IS_NOT_PRALINE
|
|
if (IS_NOT_PRALINE) {
|
|
disable_1v8_power();
|
|
#ifdef IS_H1_R9
|
|
if (IS_H1_R9) {
|
|
gpio_output(gpio->h1r9_1v8_enable);
|
|
scu_pinmux(scu->H1R9_EN1V8, SCU_GPIO_FAST | SCU_CONF_FUNCTION0);
|
|
}
|
|
#endif
|
|
#ifdef IS_NOT_H1_R9
|
|
if (IS_NOT_H1_R9) {
|
|
gpio_output(gpio->gpio_1v8_enable);
|
|
scu_pinmux(scu->PINMUX_EN1V8, SCU_GPIO_FAST | SCU_CONF_FUNCTION0);
|
|
}
|
|
#endif
|
|
}
|
|
#endif
|
|
|
|
#ifdef IS_H1_OR_PRALINE
|
|
if (IS_H1_OR_PRALINE) {
|
|
/* Safe state: start with VAA turned off: */
|
|
disable_rf_power();
|
|
|
|
/* Configure RF power supply (VAA) switch control signal as output */
|
|
#ifdef IS_H1_R9
|
|
if (IS_H1_R9) {
|
|
gpio_output(gpio->h1r9_vaa_disable);
|
|
}
|
|
#endif
|
|
#ifdef IS_NOT_H1_R9
|
|
if (IS_NOT_H1_R9) {
|
|
gpio_output(gpio->vaa_disable);
|
|
}
|
|
#endif
|
|
}
|
|
#endif
|
|
|
|
#ifdef IS_RAD1O
|
|
if (IS_RAD1O) {
|
|
/* Safe state: start with VAA turned off: */
|
|
disable_rf_power();
|
|
|
|
/* Configure RF power supply (VAA) switch control signal as output */
|
|
gpio_output(gpio->vaa_enable);
|
|
|
|
/* Disable unused clock outputs. They generate noise. */
|
|
scu_pinmux(CLK0, SCU_CLK_IN | SCU_CONF_FUNCTION7);
|
|
scu_pinmux(CLK2, SCU_CLK_IN | SCU_CONF_FUNCTION7);
|
|
|
|
scu_pinmux(scu->PINMUX_GPIO3_10, SCU_GPIO_PDN | SCU_CONF_FUNCTION0);
|
|
scu_pinmux(scu->PINMUX_GPIO3_11, SCU_GPIO_PDN | SCU_CONF_FUNCTION0);
|
|
}
|
|
#endif
|
|
|
|
#ifdef IS_PRALINE
|
|
if (IS_PRALINE) {
|
|
scu_pinmux(scu->P2_CTRL0, scu->P2_CTRL0_PINCFG);
|
|
scu_pinmux(scu->P2_CTRL1, scu->P2_CTRL1_PINCFG);
|
|
scu_pinmux(scu->P1_CTRL0, scu->P1_CTRL0_PINCFG);
|
|
scu_pinmux(scu->P1_CTRL1, scu->P1_CTRL1_PINCFG);
|
|
scu_pinmux(scu->P1_CTRL2, scu->P1_CTRL2_PINCFG);
|
|
scu_pinmux(scu->CLKIN_CTRL, scu->CLKIN_CTRL_PINCFG);
|
|
scu_pinmux(scu->AA_EN, scu->AA_EN_PINCFG);
|
|
scu_pinmux(scu->TRIGGER_IN, scu->TRIGGER_IN_PINCFG);
|
|
scu_pinmux(scu->TRIGGER_OUT, scu->TRIGGER_OUT_PINCFG);
|
|
scu_pinmux(scu->PPS_OUT, scu->PPS_OUT_PINCFG);
|
|
scu_pinmux(scu->SCT_CLK, scu->SCT_CLK_PINCFG);
|
|
|
|
scu_pinmux(scu->PINMUX_FPGA_CRESET, SCU_GPIO_PDN | SCU_CONF_FUNCTION0);
|
|
scu_pinmux(scu->PINMUX_FPGA_CDONE, SCU_GPIO_PDN | SCU_CONF_FUNCTION4);
|
|
scu_pinmux(scu->PINMUX_FPGA_SPI_CS, SCU_GPIO_PDN | SCU_CONF_FUNCTION0);
|
|
|
|
scu_pinmux(scu->SSP1_CIPO, SCU_GPIO_PDN | SCU_CONF_FUNCTION0);
|
|
scu_pinmux(scu->SSP1_COPI, SCU_GPIO_PDN | SCU_CONF_FUNCTION0);
|
|
scu_pinmux(scu->SSP1_SCK, SCU_GPIO_PDN | SCU_CONF_FUNCTION2);
|
|
|
|
scu_pinmux(scu->XCVR_ENABLE, SCU_GPIO_PDN | SCU_CONF_FUNCTION4);
|
|
scu_pinmux(scu->XCVR_RXENABLE, SCU_GPIO_PDN | SCU_CONF_FUNCTION4);
|
|
scu_pinmux(scu->XCVR_CS, SCU_GPIO_PDN | SCU_CONF_FUNCTION4);
|
|
scu_pinmux(scu->XCVR_RXHP, SCU_GPIO_PDN | SCU_CONF_FUNCTION4);
|
|
scu_pinmux(scu->XCVR_LD, SCU_GPIO_PDN | SCU_CONF_FUNCTION0);
|
|
|
|
scu_pinmux(scu->MIXER_LD, SCU_GPIO_PDN | SCU_CONF_FUNCTION4);
|
|
scu_pinmux(scu->MIXER_SCLK, SCU_GPIO_PDN | SCU_CONF_FUNCTION4);
|
|
scu_pinmux(scu->MIXER_SDATA, SCU_GPIO_PDN | SCU_CONF_FUNCTION0);
|
|
scu_pinmux(scu->MIXER_ENX, SCU_GPIO_PDN | SCU_CONF_FUNCTION0);
|
|
scu_pinmux(scu->MIXER_RESETX, SCU_GPIO_PDN | SCU_CONF_FUNCTION0);
|
|
scu_pinmux(scu->MIXER_ENBL, SCU_GPIO_PDN | SCU_CONF_FUNCTION0);
|
|
|
|
scu_pinmux(scu->AD_CS, SCU_GPIO_PDN | SCU_CONF_FUNCTION4);
|
|
|
|
p2_ctrl_set(P2_SIGNAL_CLK3);
|
|
p1_ctrl_set(P1_SIGNAL_CLKIN);
|
|
clkin_ctrl_set(CLKIN_SIGNAL_P1);
|
|
|
|
gpio_output(gpio->p2_ctrl0);
|
|
gpio_output(gpio->p2_ctrl1);
|
|
gpio_output(gpio->p1_ctrl0);
|
|
gpio_output(gpio->p1_ctrl1);
|
|
gpio_output(gpio->p1_ctrl2);
|
|
gpio_output(gpio->clkin_ctrl);
|
|
gpio_output(gpio->pps_out);
|
|
gpio_input(gpio->trigger_in);
|
|
gpio_input(gpio->trigger_out);
|
|
gpio_clear(gpio->fpga_cfg_spi_cs);
|
|
gpio_output(gpio->fpga_cfg_spi_cs);
|
|
gpio_clear(gpio->fpga_cfg_creset);
|
|
gpio_output(gpio->fpga_cfg_creset);
|
|
gpio_input(gpio->fpga_cfg_cdone);
|
|
gpio_input(gpio->max5864_select);
|
|
}
|
|
#endif
|
|
|
|
/* enable input on SCL and SDA pins */
|
|
SCU_SFSI2C0 = SCU_I2C0_NOMINAL;
|
|
}
|
|
|
|
/* Run after pins_shutdown() and prior to enabling power supplies. */
|
|
void pins_setup(void) {
|
|
/* Detect Platform */
|
|
const platform_gpio_t* gpio = platform_gpio();
|
|
const platform_scu_t* scu = platform_scu();
|
|
|
|
/* Configure LEDs */
|
|
led_off(0);
|
|
led_off(1);
|
|
led_off(2);
|
|
#ifdef IS_FOUR_LEDS
|
|
if (IS_FOUR_LEDS) {
|
|
led_off(3);
|
|
}
|
|
#endif
|
|
|
|
gpio_output(gpio->led[0]);
|
|
gpio_output(gpio->led[1]);
|
|
gpio_output(gpio->led[2]);
|
|
|
|
#ifdef IS_FOUR_LEDS
|
|
if (IS_FOUR_LEDS) {
|
|
gpio_output(gpio->led[3]);
|
|
}
|
|
#endif
|
|
|
|
/* Configure external clock in */
|
|
scu_pinmux(scu->PINMUX_GP_CLKIN, SCU_CLK_IN | SCU_CONF_FUNCTION1);
|
|
}
|