| 
									
										
										
										
											2016-10-20 00:31:03 +03:00
										 |  |  | // Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Licensed under the Apache License, Version 2.0 (the "License");
 | 
					
						
							|  |  |  | // you may not use this file except in compliance with the License.
 | 
					
						
							|  |  |  | // You may obtain a copy of the License at
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //     http://www.apache.org/licenses/LICENSE-2.0
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Unless required by applicable law or agreed to in writing, software
 | 
					
						
							|  |  |  | // distributed under the License is distributed on an "AS IS" BASIS,
 | 
					
						
							|  |  |  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
					
						
							|  |  |  | // See the License for the specific language governing permissions and
 | 
					
						
							|  |  |  | // limitations under the License.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "esp32-hal.h"
 | 
					
						
							|  |  |  | #include "freertos/FreeRTOS.h"
 | 
					
						
							|  |  |  | #include "freertos/task.h"
 | 
					
						
							|  |  |  | #include "freertos/semphr.h"
 | 
					
						
							|  |  |  | #include "rom/ets_sys.h"
 | 
					
						
							|  |  |  | #include "esp32-hal-matrix.h"
 | 
					
						
							|  |  |  | #include "soc/gpio_sd_reg.h"
 | 
					
						
							|  |  |  | #include "soc/gpio_sd_struct.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-18 15:07:25 +02:00
										 |  |  | #if CONFIG_DISABLE_HAL_LOCKS
 | 
					
						
							|  |  |  | #define SD_MUTEX_LOCK()
 | 
					
						
							|  |  |  | #define SD_MUTEX_UNLOCK()
 | 
					
						
							|  |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2016-10-20 00:31:03 +03:00
										 |  |  | #define SD_MUTEX_LOCK()    do {} while (xSemaphoreTake(_sd_sys_lock, portMAX_DELAY) != pdPASS)
 | 
					
						
							|  |  |  | #define SD_MUTEX_UNLOCK()  xSemaphoreGive(_sd_sys_lock)
 | 
					
						
							| 
									
										
										
										
											2016-11-18 15:07:25 +02:00
										 |  |  | xSemaphoreHandle _sd_sys_lock; | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2016-10-20 00:31:03 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-09 17:57:17 +02:00
										 |  |  | uint32_t sigmaDeltaSetup(uint8_t channel, uint32_t freq) //chan 0-7 freq 1220-312500
 | 
					
						
							| 
									
										
										
										
											2016-10-20 00:31:03 +03:00
										 |  |  | { | 
					
						
							|  |  |  |     if(channel > 7) { | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-01-09 17:57:17 +02:00
										 |  |  | #if !CONFIG_DISABLE_HAL_LOCKS
 | 
					
						
							| 
									
										
										
										
											2016-10-20 00:31:03 +03:00
										 |  |  |     static bool tHasStarted = false; | 
					
						
							|  |  |  |     if(!tHasStarted) { | 
					
						
							|  |  |  |         tHasStarted = true; | 
					
						
							|  |  |  |         _sd_sys_lock = xSemaphoreCreateMutex(); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-01-09 17:57:17 +02:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2016-10-20 00:31:03 +03:00
										 |  |  |     uint32_t prescale = (10000000/(freq*32)) - 1; | 
					
						
							|  |  |  |     if(prescale > 0xFF) { | 
					
						
							|  |  |  |         prescale = 0xFF; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     SD_MUTEX_LOCK(); | 
					
						
							| 
									
										
										
										
											2017-01-09 17:57:17 +02:00
										 |  |  |     SIGMADELTA.channel[channel].prescale = prescale; | 
					
						
							|  |  |  |     SIGMADELTA.cg.clk_en = 0; | 
					
						
							|  |  |  |     SIGMADELTA.cg.clk_en = 1; | 
					
						
							| 
									
										
										
										
											2016-10-20 00:31:03 +03:00
										 |  |  |     SD_MUTEX_UNLOCK(); | 
					
						
							|  |  |  |     return 10000000/((prescale + 1) * 32); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-09 17:57:17 +02:00
										 |  |  | void sigmaDeltaWrite(uint8_t channel, uint8_t duty) //chan 0-7 duty 8 bit
 | 
					
						
							| 
									
										
										
										
											2016-10-20 00:31:03 +03:00
										 |  |  | { | 
					
						
							|  |  |  |     if(channel > 7) { | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     duty += 128; | 
					
						
							|  |  |  |     SD_MUTEX_LOCK(); | 
					
						
							| 
									
										
										
										
											2017-01-09 17:57:17 +02:00
										 |  |  |     SIGMADELTA.channel[channel].duty = duty; | 
					
						
							| 
									
										
										
										
											2016-10-20 00:31:03 +03:00
										 |  |  |     SD_MUTEX_UNLOCK(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-09 17:57:17 +02:00
										 |  |  | uint8_t sigmaDeltaRead(uint8_t channel) //chan 0-7
 | 
					
						
							| 
									
										
										
										
											2016-10-20 00:31:03 +03:00
										 |  |  | { | 
					
						
							|  |  |  |     if(channel > 7) { | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-01-09 17:57:17 +02:00
										 |  |  |     SD_MUTEX_LOCK(); | 
					
						
							|  |  |  |     uint8_t duty = SIGMADELTA.channel[channel].duty - 128; | 
					
						
							|  |  |  |     SD_MUTEX_UNLOCK(); | 
					
						
							|  |  |  |     return duty; | 
					
						
							| 
									
										
										
										
											2016-10-20 00:31:03 +03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-09 17:57:17 +02:00
										 |  |  | void sigmaDeltaAttachPin(uint8_t pin, uint8_t channel) //channel 0-7
 | 
					
						
							| 
									
										
										
										
											2016-10-20 00:31:03 +03:00
										 |  |  | { | 
					
						
							|  |  |  |     if(channel > 7) { | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     pinMode(pin, OUTPUT); | 
					
						
							|  |  |  |     pinMatrixOutAttach(pin, GPIO_SD0_OUT_IDX + channel, false, false); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-09 17:57:17 +02:00
										 |  |  | void sigmaDeltaDetachPin(uint8_t pin) | 
					
						
							| 
									
										
										
										
											2016-10-20 00:31:03 +03:00
										 |  |  | { | 
					
						
							|  |  |  |     pinMatrixOutDetach(pin, false, false); | 
					
						
							|  |  |  | } |