Files
root ca13734bf0 Add full automotive RTOS project
Add kernel (Cortex-M0/M3/M4, Tricore, S32K, RISC-V ports), drivers,
middleware (CAN stack, diagnostics, safety), applications, board
support, build/test tooling, and documentation.
2026-08-23 03:35:29 -04:00

115 lines
3.2 KiB
C

/**
* @file adc_driver.h
* @brief ADC driver interface
*/
#ifndef ADC_DRIVER_H
#define ADC_DRIVER_H
#include <stdint.h>
#include <stdbool.h>
#include "kernel.h"
/* ADC Configuration Constants */
#define ADC_MAX_INSTANCES 3
#define ADC_MAX_CHANNELS 16
#define ADC_MAX_SEQUENCES 8
/* ADC Resolution */
typedef enum {
ADC_RESOLUTION_6BIT = 6,
ADC_RESOLUTION_8BIT = 8,
ADC_RESOLUTION_10BIT = 10,
ADC_RESOLUTION_12BIT = 12,
ADC_RESOLUTION_14BIT = 14,
ADC_RESOLUTION_16BIT = 16
} AdcResolution_t;
/* ADC Conversion Modes */
typedef enum {
ADC_MODE_SINGLE = 0,
ADC_MODE_CONTINUOUS = 1,
ADC_MODE_SCAN = 2,
ADC_MODE_DISCONTINUOUS = 3
} AdcConversionMode_t;
/* ADC Trigger Sources */
typedef enum {
ADC_TRIGGER_SOFTWARE = 0,
ADC_TRIGGER_TIMER = 1,
ADC_TRIGGER_EXTERNAL = 2
} AdcTriggerSource_t;
/* ADC Reference Voltage */
typedef enum {
ADC_REFERENCE_INTERNAL = 0,
ADC_REFERENCE_EXTERNAL = 1,
ADC_REFERENCE_VDD = 2
} AdcReference_t;
/* ADC Sampling Time */
typedef enum {
ADC_SAMPLING_1_5_CYCLES = 0,
ADC_SAMPLING_7_5_CYCLES = 1,
ADC_SAMPLING_13_5_CYCLES = 2,
ADC_SAMPLING_28_5_CYCLES = 3,
ADC_SAMPLING_41_5_CYCLES = 4,
ADC_SAMPLING_55_5_CYCLES = 5,
ADC_SAMPLING_71_5_CYCLES = 6,
ADC_SAMPLING_239_5_CYCLES = 7
} AdcSamplingTime_t;
/* ADC Callbacks */
typedef void (*AdcConversionCompleteCallback_t)(uint16_t* values, uint8_t count);
/* ADC Channel Configuration */
typedef struct {
uint8_t channel;
AdcSamplingTime_t sampling_time;
bool enable_watchdog;
uint16_t watchdog_high_threshold;
uint16_t watchdog_low_threshold;
} AdcChannelConfig_t;
/* ADC Configuration */
typedef struct {
AdcResolution_t resolution;
AdcConversionMode_t mode;
AdcTriggerSource_t trigger_source;
AdcReference_t reference;
bool enable_dma;
uint32_t conversion_frequency;
AdcChannelConfig_t channels[ADC_MAX_CHANNELS];
uint8_t channel_count;
AdcConversionCompleteCallback_t conversion_complete_callback;
} AdcConfig_t;
/* ADC Statistics */
typedef struct {
uint32_t conversions_completed;
uint32_t conversions_failed;
uint32_t watchdog_events;
uint32_t overrun_errors;
uint32_t dma_transfers;
uint32_t average_conversion_time_us;
} AdcStatistics_t;
/* ADC Driver Interface */
KernelStatus_t adc_init(uint8_t instance, AdcConfig_t* config);
KernelStatus_t adc_deinit(uint8_t instance);
KernelStatus_t adc_start_conversion(uint8_t instance);
KernelStatus_t adc_stop_conversion(uint8_t instance);
KernelStatus_t adc_read_channel(uint8_t instance, uint8_t channel, uint16_t* value,
uint32_t timeout_ms);
KernelStatus_t adc_read_channels(uint8_t instance, uint16_t* values, uint8_t count,
uint32_t timeout_ms);
KernelStatus_t adc_start_dma(uint8_t instance, uint16_t* buffer, uint16_t length);
KernelStatus_t adc_stop_dma(uint8_t instance);
KernelStatus_t adc_calibrate(uint8_t instance);
KernelStatus_t adc_get_statistics(uint8_t instance, AdcStatistics_t* stats);
float adc_convert_to_voltage(uint16_t adc_value, AdcResolution_t resolution,
float reference_voltage);
void adc_process_interrupt(uint8_t instance);
#endif /* ADC_DRIVER_H */