4444// CONFIG_SOC_ADC_PERIPH_NUM
4545// CONFIG_SOC_ADC_MAX_CHANNEL_NUM
4646
47+ // The ESP32 still uses the legacy ADC driver for now as dependency between ADC and I2S due to internal DAC etc
48+ #if defined(CONFIG_IDF_TARGET_ESP32)
49+
50+ HRESULT Library_sys_dev_adc_native_System_Device_Adc_AdcController::NativeOpenChannel___VOID__I4 (
51+ CLR_RT_StackFrame &stack)
52+ {
53+ NANOCLR_HEADER ();
54+
55+ int channelNumber;
56+ int adcUnit;
57+ esp_err_t result;
58+ // default to MAX bit width for SoC
59+ adc_bits_width_t width_bit = (adc_bits_width_t )SOC_ADC_RTC_MAX_BITWIDTH;
60+ adc_atten_t atten = ADC_ATTEN_DB_12;
61+
62+ // get a pointer to the managed object instance and check that it's not NULL
63+ CLR_RT_HeapBlock *pThis = stack.This ();
64+ FAULT_ON_NULL (pThis);
65+
66+ // Get channel from argument
67+ channelNumber = stack.Arg1 ().NumericByRef ().s4 ;
68+
69+ if (channelNumber < ADC_CHANNEL_0 || channelNumber > TARGET_ADC_NUM_PINS)
70+ {
71+ NANOCLR_SET_AND_LEAVE (CLR_E_INVALID_PARAMETER);
72+ }
73+
74+ // Get ADC device number from channel
75+ adcUnit = channelNumber < CONFIG_SOC_ADC_MAX_CHANNEL_NUM ? 1 : 2 ;
76+
77+ switch (adcUnit)
78+ {
79+ #if (CONFIG_SOC_ADC_PERIPH_NUM >= 1)
80+ case 1 :
81+ // Normal channel 0-7 ?
82+ if (channelNumber <= 7 )
83+ {
84+ adc1_config_width (width_bit);
85+
86+ result = adc1_config_channel_atten ((adc1_channel_t )channelNumber, atten);
87+ if (result != ESP_OK)
88+ {
89+ NANOCLR_SET_AND_LEAVE (CLR_E_PIN_UNAVAILABLE);
90+ }
91+ }
92+ break ;
93+ #endif
94+
95+ #if (CONFIG_SOC_ADC_PERIPH_NUM >= 2)
96+ case 2 :
97+ // Adjust for ADC2
98+ channelNumber -= CONFIG_SOC_ADC_MAX_CHANNEL_NUM;
99+ result = adc2_config_channel_atten ((adc2_channel_t )channelNumber, atten);
100+
101+ if (result != ESP_OK)
102+ {
103+ NANOCLR_SET_AND_LEAVE (CLR_E_PIN_UNAVAILABLE);
104+ }
105+ break ;
106+ #endif
107+ default :
108+ NANOCLR_SET_AND_LEAVE (CLR_E_PIN_UNAVAILABLE);
109+ }
110+
111+ NANOCLR_NOCLEANUP ();
112+ }
113+
114+ HRESULT Library_sys_dev_adc_native_System_Device_Adc_AdcController::NativeGetChannelCount___I4 (CLR_RT_StackFrame &stack)
115+ {
116+ NANOCLR_HEADER ();
117+
118+ int channelCount = 20 ;
119+
120+ // Return value to the managed application
121+ stack.SetResult_I4 (channelCount);
122+
123+ NANOCLR_NOCLEANUP_NOLABEL ();
124+ }
125+
126+ HRESULT Library_sys_dev_adc_native_System_Device_Adc_AdcController::NativeGetMaxValue___I4 (CLR_RT_StackFrame &stack)
127+ {
128+ NANOCLR_HEADER ();
129+
130+ // Currently fixed 12 bit so return 4095
131+ stack.SetResult_I4 (4095 );
132+
133+ NANOCLR_NOCLEANUP_NOLABEL ();
134+ }
135+
136+ HRESULT Library_sys_dev_adc_native_System_Device_Adc_AdcController::NativeGetMinValue___I4 (CLR_RT_StackFrame &stack)
137+ {
138+ NANOCLR_HEADER ();
139+
140+ // Return 0 for now, is this signed ?
141+ stack.SetResult_I4 (0 );
142+
143+ NANOCLR_NOCLEANUP_NOLABEL ();
144+ }
145+
146+ HRESULT Library_sys_dev_adc_native_System_Device_Adc_AdcController::NativeIsChannelModeSupported___BOOLEAN__I4 (
147+ CLR_RT_StackFrame &stack)
148+ {
149+ NANOCLR_HEADER ();
150+
151+ int mode = stack.Arg1 ().NumericByRef ().s4 ;
152+
153+ // Only support Single ended mode for now
154+ stack.SetResult_Boolean ((mode == (int )AdcChannelMode_SingleEnded));
155+
156+ NANOCLR_NOCLEANUP_NOLABEL ();
157+ }
158+
159+ HRESULT Library_sys_dev_adc_native_System_Device_Adc_AdcController::NativeGetResolutionInBits___I4 (
160+ CLR_RT_StackFrame &stack)
161+ {
162+ NANOCLR_HEADER ();
163+
164+ // Fixed at 12 bit for now
165+ stack.SetResult_I4 (12 );
166+
167+ NANOCLR_NOCLEANUP_NOLABEL ();
168+ }
169+
170+ HRESULT Library_sys_dev_adc_native_System_Device_Adc_AdcController::NativeInit___VOID (CLR_RT_StackFrame &stack)
171+ {
172+ (void )stack;
173+
174+ NANOCLR_HEADER ();
175+
176+ // all required initialization for ADC are already handled
177+
178+ NANOCLR_NOCLEANUP_NOLABEL ();
179+ }
180+
181+ #else
182+
47183adc_oneshot_unit_handle_t adc_handles[SOC_ADC_PERIPH_NUM] = {NULL };
48184
49185adc_oneshot_unit_handle_t GetAdcHandle (adc_unit_t unit)
@@ -210,3 +346,4 @@ HRESULT Library_sys_dev_adc_native_System_Device_Adc_AdcController::NativeInit__
210346
211347 NANOCLR_NOCLEANUP_NOLABEL ();
212348}
349+ #endif // #if defined(CONFIG_IDF_TARGET_ESP32)
0 commit comments