void set_transceiver_mode(const transceiver_mode_t new_transceiver_mode) { baseband_streaming_disable(&sgpio_config); usb_endpoint_disable(&usb_endpoint_bulk_in); usb_endpoint_disable(&usb_endpoint_bulk_out); _transceiver_mode = new_transceiver_mode; if( _transceiver_mode == TRANSCEIVER_MODE_RX ) { led_off(LED3); led_on(LED2); usb_endpoint_init(&usb_endpoint_bulk_in); rf_path_set_direction(&rf_path, RF_PATH_DIRECTION_RX); vector_table.irq[NVIC_SGPIO_IRQ] = sgpio_isr_rx; } else if (_transceiver_mode == TRANSCEIVER_MODE_TX) { led_off(LED2); led_on(LED3); usb_endpoint_init(&usb_endpoint_bulk_out); rf_path_set_direction(&rf_path, RF_PATH_DIRECTION_TX); vector_table.irq[NVIC_SGPIO_IRQ] = sgpio_isr_tx; } else { led_off(LED2); led_off(LED3); rf_path_set_direction(&rf_path, RF_PATH_DIRECTION_OFF); vector_table.irq[NVIC_SGPIO_IRQ] = sgpio_isr_rx; } if( _transceiver_mode != TRANSCEIVER_MODE_OFF ) { si5351c_activate_best_clock_source(&clock_gen); baseband_streaming_enable(&sgpio_config); } }
/* M0 Core Manage USB */ int main(void) { iap_cmd_res_t iap_cmd_res; usb_descriptor_serial_number_t serial_number; airspy_usb_req_init(); usb_set_configuration_changed_cb(usb_configuration_changed); usb_peripheral_reset(); usb_device_init(0, &usb_device); usb_queue_init(&usb_endpoint_control_out_queue); usb_queue_init(&usb_endpoint_control_in_queue); usb_queue_init(&usb_endpoint_bulk_out_queue); usb_queue_init(&usb_endpoint_bulk_in_queue); usb_endpoint_init(&usb_endpoint_control_out); usb_endpoint_init(&usb_endpoint_control_in); /* Read IAP Serial Number Identification */ iap_cmd_res.cmd_param.command_code = IAP_CMD_READ_SERIAL_NO; iap_cmd_call(&iap_cmd_res); if(iap_cmd_res.status_res.status_ret == CMD_SUCCESS) { /* Only retrieve 2 last 32bits for Serial Number */ serial_number.sn_32b[0] = iap_cmd_res.status_res.iap_result[2]; serial_number.sn_32b[1] = iap_cmd_res.status_res.iap_result[3]; usb_descriptor_fill_string_serial_number(serial_number); } nvic_set_priority(NVIC_USB0_IRQ, 255); nvic_set_priority(NVIC_M4CORE_IRQ, 1); nvic_enable_irq(NVIC_M4CORE_IRQ); usb_run(&usb_device); while(true) { signal_wfe(); if( (get_usb_buffer_offset() >= 16384) && (phase == 1) ) { usb_transfer_schedule_block(&usb_endpoint_bulk_in, &usb_bulk_buffer[0x0000], 0x4000, NULL, NULL); phase = 0; } if( (get_usb_buffer_offset() < 16384) && (phase == 0) ) { usb_transfer_schedule_block(&usb_endpoint_bulk_in, &usb_bulk_buffer[0x4000], 0x4000, NULL, NULL); phase = 1; } } }
void usb_configuration_changed( usb_device_t* const device ) { if (device->configuration == 0) { usb_endpoint_disable(&usb_endpoint_bulk_cmd_in); usb_endpoint_disable(&usb_endpoint_bulk_cmd_out); usb_endpoint_disable(&usb_endpoint_bulk_data_in); } else { usb_endpoint_init(&usb_endpoint_bulk_cmd_out); usb_endpoint_init(&usb_endpoint_bulk_cmd_in); usb_endpoint_init(&usb_endpoint_bulk_data_in); start_command_transfer(); } }
void usb_init(void) { usb_queue_init(&usb_endpoint_control_in_queue); usb_queue_init(&usb_endpoint_control_out_queue); usb_queue_init(&usb_endpoint_bulk_cmd_in_queue); usb_queue_init(&usb_endpoint_bulk_cmd_out_queue); usb_queue_init(&usb_endpoint_bulk_data_in_queue); usb_set_configuration_changed_cb(usb_configuration_changed); usb_peripheral_reset(); usb_device_init(0, &usb_device); usb_endpoint_init(&usb_endpoint_control_out); usb_endpoint_init(&usb_endpoint_control_in); nvic_set_priority(NVIC_USB0_IRQ, 255); usb_run(&usb_device); }
void set_transceiver_mode(const transceiver_mode_t new_transceiver_mode) { baseband_streaming_disable(); transceiver_mode = new_transceiver_mode; usb_init_buffers_bulk(); if( transceiver_mode == TRANSCEIVER_MODE_RX ) { gpio_clear(PORT_LED1_3, PIN_LED3); gpio_set(PORT_LED1_3, PIN_LED2); usb_endpoint_init(&usb_endpoint_bulk_in); rffc5071_rx(switchctrl); //rffc5071_set_frequency(1700, 0); // 2600 MHz IF - 1700 MHz LO = 900 MHz RF max2837_start(); max2837_rx(); } else if (transceiver_mode == TRANSCEIVER_MODE_TX) { gpio_clear(PORT_LED1_3, PIN_LED2); gpio_set(PORT_LED1_3, PIN_LED3); usb_endpoint_init(&usb_endpoint_bulk_out); rffc5071_tx(switchctrl); //rffc5071_set_frequency(1700, 0); // 2600 MHz IF - 1700 MHz LO = 900 MHz RF max2837_start(); max2837_tx(); } else { gpio_clear(PORT_LED1_3, PIN_LED2); gpio_clear(PORT_LED1_3, PIN_LED3); max2837_stop(); return; } sgpio_configure(transceiver_mode, true); nvic_set_priority(NVIC_SGPIO_IRQ, 0); nvic_enable_irq(NVIC_SGPIO_IRQ); SGPIO_SET_EN_1 = (1 << SGPIO_SLICE_A); sgpio_cpld_stream_enable(); }
void set_receiver_mode(const receiver_mode_t new_receiver_mode) { usb_streaming_disable(); if( new_receiver_mode == RECEIVER_MODE_RX ) { usb_endpoint_init(&usb_endpoint_bulk_in); ADCHS_start(sample_rate_conf_no); }else { ADCHS_stop(sample_rate_conf_no); } receiver_mode = new_receiver_mode; }
usb_request_status_t usb_vendor_request_set_transceiver_mode( usb_endpoint_t* const endpoint, const usb_transfer_stage_t stage) { if( stage == USB_TRANSFER_STAGE_SETUP ) { switch( endpoint->setup.value ) { case TRANSCEIVER_MODE_OFF: case TRANSCEIVER_MODE_RX: case TRANSCEIVER_MODE_TX: set_transceiver_mode(endpoint->setup.value); usb_transfer_schedule_ack(endpoint->in); return USB_REQUEST_STATUS_OK; case TRANSCEIVER_MODE_CPLD_UPDATE: usb_endpoint_init(&usb_endpoint_bulk_out); start_cpld_update = true; usb_transfer_schedule_ack(endpoint->in); return USB_REQUEST_STATUS_OK; default: return USB_REQUEST_STATUS_STALL; } } else { return USB_REQUEST_STATUS_OK; } }