Add UART irq input hook to uart_console_isr()

Adds an input hook to be used by the interrupt handler uart_console_isr().
This hook permits the console input to detect a character escape sequence
that can be used to override the console's default input behavior.

This input hook can be set using the following API:
   void uart_irq_input_hook_set(struct device *dev,
                                int (*hook)(struct device *, uint8_t));

The hook returns 1 if the handler should stop processing the character,
and 0 if it should not stop.

Change-Id: I95e7da75e07fb6caaca2d45e80bfc4334a43c0ac
Signed-off-by: Peter Mitsis <peter.mitsis@windriver.com>
This commit is contained in:
Peter Mitsis 2015-09-17 13:22:00 -04:00 committed by Anas Nashif
parent b2147178b4
commit b1c1020732
2 changed files with 58 additions and 6 deletions

View file

@ -136,6 +136,18 @@ void uart_console_isr(void *unused)
uint8_t byte;
int rx;
rx = read_uart(UART_CONSOLE_DEV, &byte, 1);
if (rx < 0) {
return;
}
if (uart_irq_input_hook(UART_CONSOLE_DEV, byte) != 0) {
/*
* The input hook indicates that no further processing
* should be done by this handler.
*/
return;
}
if (!cmd) {
cmd = nano_isr_fifo_get(avail_queue);
@ -143,12 +155,6 @@ void uart_console_isr(void *unused)
return;
}
rx = read_uart(UART_CONSOLE_DEV, &byte, 1);
if (rx < 0) {
nano_isr_fifo_put(avail_queue, cmd);
return;
}
/* Echo back to console */
uart_poll_out(UART_CONSOLE_DEV, byte);

View file

@ -106,6 +106,7 @@ struct uart_driver_api {
int (*irq_is_pending)(struct device *dev);
int (*irq_update)(struct device *dev);
unsigned int (*irq_get)(struct device *dev);
int (*irq_input_hook)(struct device *dev, uint8_t byte);
#endif
};
@ -416,6 +417,51 @@ static inline unsigned int uart_irq_get(struct device *dev)
return 0;
}
/**
* @brief Invoke the UART input hook routine if installed
*
* The input hook is a custom handler invoked by the ISR on each received
* character. It allows the detection of a character escape sequence that may
* be used to override the behavior of the ISR handler.
*
* @param dev UART device struct (of type struct uart_device_config_t)
* @param byte Byte to process
*
* @return 1 if character processing must stop, 0 or if it is to continue
*/
static inline int uart_irq_input_hook(struct device *dev, uint8_t byte)
{
struct uart_driver_api *api;
api = (struct uart_driver_api *)dev->driver_api;
if ((api != NULL) && (api->irq_input_hook != NULL)) {
return api->irq_input_hook(dev, byte);
}
return 0;
}
/**
* @brief Set the UART input hook routine
*
* @param dev UART device struct (of type struct uart_device_config_t)
* @param hook Routine to use as UART input hook
*
* @return N/A
*/
static inline void uart_irq_input_hook_set(struct device *dev,
int (*hook)(struct device *, uint8_t))
{
struct uart_driver_api *api;
api = (struct uart_driver_api *)dev->driver_api;
if (api != NULL) {
api->irq_input_hook = hook;
}
}
#endif
#ifdef __cplusplus