//# MENU spectrum void spectrum_menu() { lcdClear(); lcdDisplay(); getInputWaitRelease(); // RF initialization from ppack.c: dac_init(false); cpu_clock_set(204); // WARP SPEED! :-) hackrf_clock_init(); rf_path_pin_setup(); /* Configure external clock in */ scu_pinmux(SCU_PINMUX_GP_CLKIN, SCU_CLK_IN | SCU_CONF_FUNCTION1); sgpio_configure_pin_functions(); ON(EN_VDD); ON(EN_1V8); OFF(MIC_AMP_DIS); delayms(500); // doesn't work without cpu_clock_set(204); // WARP SPEED! :-) si5351_init(); portapack_init(); while(1) { switch(getInput()) { case BTN_UP: displayMode=MODE_WATERFALL; break; case BTN_DOWN: displayMode=MODE_SPECTRUM; break; case BTN_LEFT: freq -= 2000000; ssp1_set_mode_max2837(); set_freq(freq); break; case BTN_RIGHT: freq += 2000000; ssp1_set_mode_max2837(); set_freq(freq); break; case BTN_ENTER: //FIXME: unset the callback, reset the clockspeed, tidy up nvic_disable_irq(NVIC_DMA_IRQ); OFF(EN_VDD); OFF(EN_1V8); ON(MIC_AMP_DIS); systick_set_clocksource(0); systick_set_reload(12e6/SYSTICKSPEED/1000); return; } } }
//# MENU Apack void ppack_menu() { lcdClear(); lcdPrintln("PPack port"); lcdPrintln(""); lcdPrintln("up=enable"); lcdDisplay(); dac_init(false); cpu_clock_set(204); // WARP SPEED! :-) hackrf_clock_init(); rf_path_pin_setup(); /* Configure external clock in */ scu_pinmux(SCU_PINMUX_GP_CLKIN, SCU_CLK_IN | SCU_CONF_FUNCTION1); sgpio_configure_pin_functions(); ON(EN_VDD); ON(EN_1V8); OFF(MIC_AMP_DIS); complex_s8_t * samples; while(1){ switch(getInputRaw()){ case BTN_UP: // ON(MIXER_EN); // hackrf does this cpu_clock_set(204); // WARP SPEED! :-) si5351_init(); portapack_init(); getInputWaitRelease(); break; case BTN_DOWN: lcdPrintln("file"); writeFile("samples.8", (char*)0x20000000,(uintptr_t)s8ram-0x20000000); break; case BTN_LEFT: lcdPrintln("reset"); s8ram=(complex_s8_t*)0x20000000; break; case BTN_RIGHT: break; case BTN_ENTER: return; }; TOGGLE(LED2); delayms(40); lcdPrint(IntToStr((uintptr_t)s8ram,8,F_HEX)); lcdPrint(" "); lcdPrintln(IntToStr(sctr,7,F_LONG)); lcdDisplay(); }; };
void sgpio_test_interface() { const uint_fast8_t host_clock_sgpio_pin = 8; // Input const uint_fast8_t host_capture_sgpio_pin = 9; // Input const uint_fast8_t host_disable_sgpio_pin = 10; // Output const uint_fast8_t host_direction_sgpio_pin = 11; // Output SGPIO_GPIO_OENREG = 0; // All inputs for the moment. // Disable all counters during configuration SGPIO_CTRL_ENABLE = 0; sgpio_configure_pin_functions(); // Make all SGPIO controlled by SGPIO's "GPIO" registers for (uint_fast8_t i = 0; i < 16; i++) { SGPIO_OUT_MUX_CFG(i) = SGPIO_OUT_MUX_CFG_P_OE_CFG(0) | SGPIO_OUT_MUX_CFG_P_OUT_CFG(4); } // Set SGPIO output values. SGPIO_GPIO_OUTREG = (1L << host_direction_sgpio_pin) | (1L << host_disable_sgpio_pin); // Enable SGPIO pin outputs. SGPIO_GPIO_OENREG = (1L << host_direction_sgpio_pin) | (1L << host_disable_sgpio_pin) | (0L << host_capture_sgpio_pin) | (0L << host_clock_sgpio_pin) | (0xFF << 0); // Configure SGPIO slices. // Enable codec data stream. SGPIO_GPIO_OUTREG &= ~(1L << host_disable_sgpio_pin); while (1) { for (uint_fast8_t i = 0; i < 8; i++) { SGPIO_GPIO_OUTREG ^= (1L << i); } } }
void pin_setup(void) { /* GPIO pinmuxes */ scu_pinmux(SCU_PINMUX_LED1, SCU_GPIO_NOPULL); scu_pinmux(SCU_PINMUX_FILTER1, SCU_GPIO_NOPULL); scu_pinmux(SCU_PINMUX_FILTER2, SCU_GPIO_NOPULL); scu_pinmux(SCU_PINMUX_FILTER3, SCU_GPIO_NOPULL); scu_pinmux(SCU_PINMUX_FILTER4, SCU_GPIO_NOPULL); scu_pinmux(SCU_PINMUX_LO_LD, SCU_GPIO_NOPULL); scu_pinmux(SCU_PINMUX_SOURCE_LD, SCU_GPIO_NOPULL); scu_pinmux(SCU_PINMUX_SOURCE_LE, SCU_GPIO_NOPULL); scu_pinmux(SCU_PINMUX_SOURCE_CE, SCU_GPIO_NOPULL); scu_pinmux(SCU_PINMUX_LO_CE, SCU_GPIO_NOPULL); scu_pinmux(SCU_PINMUX_LO_LE, SCU_GPIO_NOPULL); scu_pinmux(SCU_PINMUX_RX_MIX_ENBL, SCU_GPIO_NOPULL); scu_pinmux(SCU_PINMUX_LO_MUXOUT, SCU_GPIO_NOPULL); scu_pinmux(SCU_PINMUX_SOURCE_MUXOUT, SCU_GPIO_NOPULL); scu_pinmux(SCU_PINMUX_RX_V1, SCU_GPIO_NOPULL | SCU_CONF_FUNCTION4); scu_pinmux(SCU_PINMUX_RX_V2, SCU_GPIO_NOPULL| SCU_CONF_FUNCTION4); scu_pinmux(SCU_PINMUX_LO_RF_ENABLE, SCU_GPIO_NOPULL | SCU_CONF_FUNCTION4); scu_pinmux(SCU_PINMUX_SOURCE_RF_ENABLE, SCU_GPIO_NOPULL | SCU_CONF_FUNCTION4); scu_pinmux(SCU_PINMUX_TX_SW_CTRL, SCU_GPIO_NOPULL); scu_pinmux(SCU_PINMUX_ATT_LE, SCU_GPIO_NOPULL); scu_pinmux(SCU_PINMUX_PWDN, SCU_GPIO_NOPULL); scu_pinmux(SCU_PINMUX_GP_CLKIN, SCU_CLK_IN | SCU_CONF_FUNCTION1); scu_pinmux(SCU_PINMUX_I2C_SDA, SCU_CONF_FUNCTION1); scu_pinmux(SCU_PINMUX_I2C_SCL, SCU_CONF_FUNCTION1); /* Configure all GPIO as Input (safe state) */ GPIO0_DIR = 0; GPIO1_DIR = 0; GPIO2_DIR = 0; GPIO3_DIR = 0; GPIO4_DIR = 0; GPIO5_DIR = 0; GPIO6_DIR = 0; GPIO7_DIR = 0; ///* Set safe GPIO states */ gpio_set(PORT_FILTER1, PIN_FILTER1); gpio_clear(PORT_FILTER2, PIN_FILTER2); gpio_clear(PORT_FILTER3, PIN_FILTER3); gpio_clear(PORT_FILTER4, PIN_FILTER4); gpio_set(PORT_SOURCE_LE, PIN_SOURCE_LE); gpio_clear(PORT_SOURCE_CE, PIN_SOURCE_CE); gpio_clear(PORT_LO_CE, PIN_LO_CE); gpio_set(PORT_LO_LE, PIN_LO_LE); gpio_clear(PORT_RX_MIX_ENBL, PIN_RX_MIX_ENBL); gpio_clear(PORT_RX_V1, PIN_RX_V1); gpio_clear(PORT_RX_V2, PIN_RX_V2); gpio_clear(PORT_LO_RF_ENABLE, PIN_LO_RF_ENABLE); gpio_clear(PORT_SOURCE_RF_ENABLE, PIN_SOURCE_RF_ENABLE); gpio_clear(PORT_TX_SW_CTRL, PIN_TX_SW_CTRL); gpio_clear(PORT_ATT_LE, PIN_ATT_LE); gpio_set(PORT_PWDN, PIN_PWDN); /* Set GPIO directions */ GPIO0_DIR |= (PIN_LED1 | PIN_RX_MIX_ENBL); GPIO1_DIR |= (PIN_FILTER1 | PIN_FILTER2 | PIN_FILTER3 | PIN_FILTER4 | PIN_SOURCE_LE | PIN_SOURCE_CE | PIN_LO_CE | PIN_LO_LE | PIN_TX_SW_CTRL | PIN_ATT_LE | PIN_PWDN); GPIO5_DIR |= (PIN_RX_V1 | PIN_RX_V2 | PIN_LO_RF_ENABLE | PIN_SOURCE_RF_ENABLE); // Disable clock outputs scu_pinmux(CLK0, SCU_CLK_IN | SCU_CONF_FUNCTION7); scu_pinmux(CLK2, SCU_CLK_IN | SCU_CONF_FUNCTION7); //XXX: Debug //scu_pinmux(CLK2, SCU_CLK_IN | SCU_CONF_FUNCTION1); sgpio_configure_pin_functions(); }
void sgpio_configure( const transceiver_mode_t transceiver_mode, const bool multi_slice ) { // Disable all counters during configuration SGPIO_CTRL_ENABLE = 0; sgpio_configure_pin_functions(); // Set SGPIO output values. const uint_fast8_t cpld_direction = (transceiver_mode == TRANSCEIVER_MODE_TX) ? 1 : 0; SGPIO_GPIO_OUTREG = (cpld_direction << 11) | (1L << 10) // disable ; // Enable SGPIO pin outputs. const uint_fast16_t sgpio_gpio_data_direction = (transceiver_mode == TRANSCEIVER_MODE_TX) ? (0xFF << 0) : (0x00 << 0); SGPIO_GPIO_OENREG = (1L << 11) // direction | (1L << 10) // disable | (0L << 9) // capture | (0L << 8) // clock | sgpio_gpio_data_direction ; SGPIO_OUT_MUX_CFG( 8) = // SGPIO: Input: clock SGPIO_OUT_MUX_CFG_P_OE_CFG(0) | SGPIO_OUT_MUX_CFG_P_OUT_CFG(0) ; SGPIO_OUT_MUX_CFG( 9) = // SGPIO: Input: qualifier SGPIO_OUT_MUX_CFG_P_OE_CFG(0) | SGPIO_OUT_MUX_CFG_P_OUT_CFG(0) ; SGPIO_OUT_MUX_CFG(10) = // GPIO: Output: disable SGPIO_OUT_MUX_CFG_P_OE_CFG(0) | SGPIO_OUT_MUX_CFG_P_OUT_CFG(4) ; SGPIO_OUT_MUX_CFG(11) = // GPIO: Output: direction SGPIO_OUT_MUX_CFG_P_OE_CFG(0) | SGPIO_OUT_MUX_CFG_P_OUT_CFG(4) ; const uint_fast8_t output_multiplexing_mode = multi_slice ? 11 : 9; for(uint_fast8_t i=0; i<8; i++) { // SGPIO pin 0 outputs slice A bit "i". SGPIO_OUT_MUX_CFG(i) = SGPIO_OUT_MUX_CFG_P_OE_CFG(0) | SGPIO_OUT_MUX_CFG_P_OUT_CFG(output_multiplexing_mode) ; } const uint_fast8_t slice_indices[] = { SGPIO_SLICE_A, SGPIO_SLICE_I, SGPIO_SLICE_E, SGPIO_SLICE_J, SGPIO_SLICE_C, SGPIO_SLICE_K, SGPIO_SLICE_F, SGPIO_SLICE_L, }; const uint_fast8_t pos = multi_slice ? 0x1f : 0x03; const bool single_slice = !multi_slice; const uint_fast8_t slice_count = multi_slice ? 8 : 1; uint32_t slice_enable_mask = 0; for(uint_fast8_t i=0; i<slice_count; i++) { const uint_fast8_t slice_index = slice_indices[i]; const bool input_slice = (i == 0) && (transceiver_mode == TRANSCEIVER_MODE_RX); const uint_fast8_t concat_order = (input_slice || single_slice) ? 0 : 3; const uint_fast8_t concat_enable = (input_slice || single_slice) ? 0 : 1; SGPIO_MUX_CFG(slice_index) = SGPIO_MUX_CFG_CONCAT_ORDER(concat_order) | SGPIO_MUX_CFG_CONCAT_ENABLE(concat_enable) | SGPIO_MUX_CFG_QUALIFIER_SLICE_MODE(0) | SGPIO_MUX_CFG_QUALIFIER_PIN_MODE(1) | SGPIO_MUX_CFG_QUALIFIER_MODE(3) | SGPIO_MUX_CFG_CLK_SOURCE_SLICE_MODE(0) | SGPIO_MUX_CFG_CLK_SOURCE_PIN_MODE(0) | SGPIO_MUX_CFG_EXT_CLK_ENABLE(1) ; SGPIO_SLICE_MUX_CFG(slice_index) = SGPIO_SLICE_MUX_CFG_INV_QUALIFIER(0) | SGPIO_SLICE_MUX_CFG_PARALLEL_MODE(3) | SGPIO_SLICE_MUX_CFG_DATA_CAPTURE_MODE(0) | SGPIO_SLICE_MUX_CFG_INV_OUT_CLK(0) | SGPIO_SLICE_MUX_CFG_CLKGEN_MODE(1) | SGPIO_SLICE_MUX_CFG_CLK_CAPTURE_MODE(1) | SGPIO_SLICE_MUX_CFG_MATCH_MODE(0) ; SGPIO_PRESET(slice_index) = 0; // External clock, don't care SGPIO_COUNT(slice_index) = 0; // External clock, don't care SGPIO_POS(slice_index) = SGPIO_POS_POS_RESET(pos) | SGPIO_POS_POS(pos) ; SGPIO_REG(slice_index) = 0x80808080; // Primary output data register SGPIO_REG_SS(slice_index) = 0x80808080; // Shadow output data register slice_enable_mask |= (1 << slice_index); } // Start SGPIO operation by enabling slice clocks. SGPIO_CTRL_ENABLE = slice_enable_mask; }
void pin_setup(void) { /* Release CPLD JTAG pins */ scu_pinmux(SCU_PINMUX_CPLD_TDO, SCU_GPIO_NOPULL | SCU_CONF_FUNCTION4); scu_pinmux(SCU_PINMUX_CPLD_TCK, SCU_GPIO_NOPULL | SCU_CONF_FUNCTION0); scu_pinmux(SCU_PINMUX_CPLD_TMS, SCU_GPIO_NOPULL | SCU_CONF_FUNCTION0); scu_pinmux(SCU_PINMUX_CPLD_TDI, SCU_GPIO_NOPULL | SCU_CONF_FUNCTION0); gpio_input(&gpio_cpld_tdo); gpio_input(&gpio_cpld_tck); gpio_input(&gpio_cpld_tms); gpio_input(&gpio_cpld_tdi); /* 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 RAD1O scu_pinmux(SCU_PINMUX_LED4, SCU_GPIO_NOPULL | SCU_CONF_FUNCTION4); #endif scu_pinmux(SCU_PINMUX_EN1V8, SCU_GPIO_NOPULL); /* Configure USB indicators */ #ifdef JAWBREAKER scu_pinmux(SCU_PINMUX_USB_LED0, SCU_CONF_FUNCTION3); scu_pinmux(SCU_PINMUX_USB_LED1, SCU_CONF_FUNCTION3); #endif /* Configure all GPIO as Input (safe state) */ gpio_init(); gpio_output(&gpio_led[0]); gpio_output(&gpio_led[1]); gpio_output(&gpio_led[2]); #ifdef RAD1O gpio_output(&gpio_led[3]); #endif gpio_output(&gpio_1v8_enable); #ifdef HACKRF_ONE /* Configure RF power supply (VAA) switch control signal as output */ gpio_output(&gpio_vaa_disable); /* Safe state: start with VAA turned off: */ disable_rf_power(); 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 RAD1O /* Configure RF power supply (VAA) switch control signal as output */ gpio_output(&gpio_vaa_enable); /* Safe state: start with VAA turned off: */ disable_rf_power(); 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 /* enable input on SCL and SDA pins */ SCU_SFSI2C0 = SCU_I2C0_NOMINAL; spi_bus_start(&spi_bus_ssp1, &ssp_config_max2837); mixer_bus_setup(&mixer); rf_path_pin_setup(&rf_path); /* Configure external clock in */ scu_pinmux(SCU_PINMUX_GP_CLKIN, SCU_CLK_IN | SCU_CONF_FUNCTION1); sgpio_configure_pin_functions(&sgpio_config); }