mirror of https://github.com/ARMmbed/mbed-os.git
				
				
				
			PWMOut: lock deesleep addition
As PWMOut in most cases depend on high speed freq clock, it should lock deepsleep while active.pull/5177/head
							parent
							
								
									c6f655c02e
								
							
						
					
					
						commit
						5a6aee43eb
					
				| 
						 | 
					@ -21,6 +21,7 @@
 | 
				
			||||||
#if defined (DEVICE_PWMOUT) || defined(DOXYGEN_ONLY)
 | 
					#if defined (DEVICE_PWMOUT) || defined(DOXYGEN_ONLY)
 | 
				
			||||||
#include "hal/pwmout_api.h"
 | 
					#include "hal/pwmout_api.h"
 | 
				
			||||||
#include "platform/mbed_critical.h"
 | 
					#include "platform/mbed_critical.h"
 | 
				
			||||||
 | 
					#include "platform/mbed_sleep.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace mbed {
 | 
					namespace mbed {
 | 
				
			||||||
/** \addtogroup drivers */
 | 
					/** \addtogroup drivers */
 | 
				
			||||||
| 
						 | 
					@ -56,12 +57,18 @@ public:
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
     *  @param pin PwmOut pin to connect to
 | 
					     *  @param pin PwmOut pin to connect to
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    PwmOut(PinName pin) {
 | 
					    PwmOut(PinName pin) : _deep_sleep_locked(false) {
 | 
				
			||||||
        core_util_critical_section_enter();
 | 
					        core_util_critical_section_enter();
 | 
				
			||||||
        pwmout_init(&_pwm, pin);
 | 
					        pwmout_init(&_pwm, pin);
 | 
				
			||||||
        core_util_critical_section_exit();
 | 
					        core_util_critical_section_exit();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ~PwmOut() {
 | 
				
			||||||
 | 
					        core_util_critical_section_enter();
 | 
				
			||||||
 | 
					        unlock_deep_sleep();
 | 
				
			||||||
 | 
					        core_util_critical_section_exit();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /** Set the ouput duty-cycle, specified as a percentage (float)
 | 
					    /** Set the ouput duty-cycle, specified as a percentage (float)
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
     *  @param value A floating-point value representing the output duty-cycle,
 | 
					     *  @param value A floating-point value representing the output duty-cycle,
 | 
				
			||||||
| 
						 | 
					@ -71,6 +78,7 @@ public:
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    void write(float value) {
 | 
					    void write(float value) {
 | 
				
			||||||
        core_util_critical_section_enter();
 | 
					        core_util_critical_section_enter();
 | 
				
			||||||
 | 
					        lock_deep_sleep();
 | 
				
			||||||
        pwmout_write(&_pwm, value);
 | 
					        pwmout_write(&_pwm, value);
 | 
				
			||||||
        core_util_critical_section_exit();
 | 
					        core_util_critical_section_exit();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					@ -177,7 +185,24 @@ public:
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
protected:
 | 
					protected:
 | 
				
			||||||
 | 
					    /** Lock deep sleep only if it is not yet locked */
 | 
				
			||||||
 | 
					    void lock_deep_sleep() {
 | 
				
			||||||
 | 
					        if (_deep_sleep_locked == false) {
 | 
				
			||||||
 | 
					            sleep_manager_lock_deep_sleep();
 | 
				
			||||||
 | 
					            _deep_sleep_locked = true;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** Unlock deep sleep in case it is locked */
 | 
				
			||||||
 | 
					    void unlock_deep_sleep() {
 | 
				
			||||||
 | 
					        if (_deep_sleep_locked == true) {
 | 
				
			||||||
 | 
					            sleep_manager_unlock_deep_sleep();
 | 
				
			||||||
 | 
					            _deep_sleep_locked = false;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pwmout_t _pwm;
 | 
					    pwmout_t _pwm;
 | 
				
			||||||
 | 
					    bool _deep_sleep_locked;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
} // namespace mbed
 | 
					} // namespace mbed
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue