blob: 0acbc656914e708c8655eda4ffd41729b690da9d [file] [log] [blame]
/* Copyright 2017 The Chromium OS Authors. All rights reserved.
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*
* Physical presence detection
*/
#ifndef __CROS_EC_PHYSICAL_PRESENCE_H
#define __CROS_EC_PHYSICAL_PRESENCE_H
/**
* Start physical presence detect.
*
* If the physical presence sequence is successful, callback() will be called
* from the hook task context as a deferred function.
*
* On failure or abort, callback() will not be called.
*
* @param is_long Use long (!=0) or short (0) sequence)
* @param callback Function to call when successful
* @return EC_SUCCESS, EC_BUSY if detect already in progress, or other
* non-zero error code if error.
*/
int physical_detect_start(int is_long, void (*callback)(void));
/**
* Check if a physical detect attempt is in progress
*
* @return non-zero if in progress
*/
int physical_detect_busy(void);
/**
* Abort a currently-running physical presence detect.
*
* Note there is a race condition between stopping detect and a running
* detect finishing and calling its callback. The intent of this function
* is not to prevent that, but instead to avoid an aborted physical detect
* tying up the button for long periods when we no longer care.
*/
void physical_detect_abort(void);
/**
* Handle a physical detect button press.
*
* This may be called from interrupt level.
*
* Returns EC_SUCCESS if the press was consumed, or EC_ERROR_NOT_HANDLED if
* physical detect was idle (so the press is for someone else).
*/
int physical_detect_press(void);
/**
* Start/stop capturing the button for physical presence.
*
* When enabled, a debounced button press+release should call
* physical_detect_press().
*
* This should be implemented by the board.
*
* @param enable Enable (!=0) or disable (==0) capturing button.
*/
void board_physical_presence_enable(int enable);
/**
* An API to report physical presence FSM state to an external entity. Of
* interest are states when key press is currently required or is expected
* soon.
*/
enum pp_fsm_state {
PP_OTHER = 0,
PP_AWAITING_PRESS = 1,
PP_BETWEEN_PRESSES = 2,
};
enum pp_fsm_state physical_presense_fsm_state(void);
#endif /* __CROS_EC_PHYSICAL_PRESENCE_H */