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