/* * Copyright 2012-2026 Great Scott Gadgets * Copyright 2012 Jared Boone * Copyright 2013 Benjamin Vernoux * * 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 #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); }