Files

copied

Scanning the repository...

Last update 5 years 6 months by Kate Temkin
Filesfirmwareapollosrcboardsluna
..
apollo_board.h
board.mk
debug_spi.c
dfu.c
fpga.c
jtag.c
led.c
platform_jtag.h
selftest.c
selftest.h
spi.c
spi.h
tusb_config.h
uart.c
usb_descriptors.c
selftest.c
/* * Self-test & factory validation functionality for LUNA. * This file is part of LUNA. */ #include <stdint.h> #include <stdbool.h> #include <string.h> #include <tusb.h> #include <sam.h> #include <hal/include/hal_gpio.h> #include <hal/include/hal_adc_sync.h> #include <hpl/gclk/hpl_gclk_base.h> #include <hpl_pm_config.h> #include <hpl/pm/hpl_pm_base.h> struct adc_sync_descriptor adc; enum { ADC_CHANNEL_2V5 = 0, ADC_CHANNEL_1V1 = 1 }; static void set_up_voltage_monitors(void) { // Set up monitors for each of our primary voltage rails. _pm_enable_bus_clock(PM_BUS_APBC, ADC); _gclk_enable_channel(ADC_GCLK_ID, CONF_GCLK_ADC_SRC); adc_sync_init(&adc, ADC, NULL); adc_sync_set_reference(&adc, ADC_REFCTRL_REFSEL_INT1V); adc_sync_set_resolution(&adc, ADC_CTRLB_RESSEL_12BIT_Val); // - We don't sample the 5V rail, as it's above what we're capable // of sampling; and we don't sample the 3V3, as we're powered by it. // This makes sense; as if either of these were missing, we wouldn't be // up and communicating. :) // Channel 0 monitors the 2V5 rail. adc_sync_enable_channel(&adc, ADC_CHANNEL_2V5); adc_sync_set_inputs(&adc, ADC_INPUTCTRL_MUXPOS_PIN0_Val, ADC_INPUTCTRL_MUXNEG_GND_Val, ADC_CHANNEL_2V5); gpio_set_pin_function(PIN_PA02, PINMUX_PA02B_ADC_AIN0); // Channel 1 monitors the 1V1 rail. adc_sync_enable_channel(&adc, ADC_CHANNEL_1V1); adc_sync_set_inputs(&adc, ADC_INPUTCTRL_MUXPOS_PIN3_Val, ADC_INPUTCTRL_MUXNEG_GND_Val, ADC_CHANNEL_1V1); gpio_set_pin_function(PIN_PB09, PINMUX_PB09B_ADC_AIN3); } /** * Initialize our self-test functionality. */ void selftest_init(void) { set_up_voltage_monitors(); } /** * Vendor request that reads the voltage on one of the supply rails. */ bool handle_get_rail_voltage(uint8_t rhport, tusb_control_request_t const* request) { static uint16_t reading; // TODO: make this an arbitrary rail. while(!adc_sync_read_channel(&adc, ADC_CHANNEL_1V1, (void *)&reading, sizeof(reading))); return tud_control_xfer(rhport, request, &reading, sizeof(reading)); }
Report a bug