diff --git a/drivers/serial/uart_handlers.c b/drivers/serial/uart_handlers.c index 7a0c5112822..32128419779 100644 --- a/drivers/serial/uart_handlers.c +++ b/drivers/serial/uart_handlers.c @@ -41,6 +41,37 @@ static inline void z_vrfy_uart_poll_out(struct device *dev, } #include +#ifdef CONFIG_UART_ASYNC_API +/* callback_set() excluded as we don't allow ISR callback installation from + * user mode + * + * rx_buf_rsp() excluded as it's designed to be called from ISR callbacks + */ + +static inline int z_vrfy_uart_tx(struct device *dev, const u8_t *buf, + size_t len, u32_t timeout) +{ + Z_OOPS(Z_SYSCALL_DRIVER_UART(dev, tx)); + Z_OOPS(Z_SYSCALL_MEMORY_READ(buf, len)); + return z_impl_uart_tx(dev, buf, len, timeout); +} +#include + +UART_SIMPLE(tx_abort); +#include + +static inline int z_vrfy_uart_rx_enable(struct device *dev, u8_t *buf, + size_t len, u32_t timeout) +{ + Z_OOPS(Z_SYSCALL_DRIVER_UART(dev, rx_enable)); + Z_OOPS(Z_SYSCALL_MEMORY_WRITE(buf, len)); + return z_impl_uart_rx_enable(dev, buf, len, timeout); +} +#include + +UART_SIMPLE(rx_disable); +#include +#endif /* CONFIG_UART_ASYNC_API */ #ifdef CONFIG_UART_INTERRUPT_DRIVEN UART_SIMPLE_VOID(irq_tx_enable) diff --git a/include/drivers/uart.h b/include/drivers/uart.h index 8d26165779e..efb6b3240b6 100644 --- a/include/drivers/uart.h +++ b/include/drivers/uart.h @@ -465,10 +465,11 @@ static inline int uart_callback_set(struct device *dev, * @retval -EBUSY There is already an ongoing transfer. * @retval 0 If successful, negative errno code otherwise. */ -static inline int uart_tx(struct device *dev, - const u8_t *buf, - size_t len, - u32_t timeout) +__syscall int uart_tx(struct device *dev, const u8_t *buf, size_t len, + u32_t timeout); + +static inline int z_impl_uart_tx(struct device *dev, const u8_t *buf, + size_t len, u32_t timeout) { const struct uart_driver_api *api = @@ -487,7 +488,9 @@ static inline int uart_tx(struct device *dev, * @retval -EFAULT There is no active transmission. * @retval 0 If successful, negative errno code otherwise. */ -static inline int uart_tx_abort(struct device *dev) +__syscall int uart_tx_abort(struct device *dev); + +static inline int z_impl_uart_tx_abort(struct device *dev) { const struct uart_driver_api *api = (const struct uart_driver_api *)dev->driver_api; @@ -511,8 +514,11 @@ static inline int uart_tx_abort(struct device *dev) * @retval 0 If successful, negative errno code otherwise. * */ -static inline int uart_rx_enable(struct device *dev, u8_t *buf, size_t len, - u32_t timeout) +__syscall int uart_rx_enable(struct device *dev, u8_t *buf, size_t len, + u32_t timeout); + +static inline int z_impl_uart_rx_enable(struct device *dev, u8_t *buf, + size_t len, u32_t timeout) { const struct uart_driver_api *api = (const struct uart_driver_api *)dev->driver_api; @@ -557,7 +563,9 @@ static inline int uart_rx_buf_rsp(struct device *dev, u8_t *buf, size_t len) * @retval -EFAULT There is no active reception. * @retval 0 If successful, negative errno code otherwise. */ -static inline int uart_rx_disable(struct device *dev) +__syscall int uart_rx_disable(struct device *dev); + +static inline int z_impl_uart_rx_disable(struct device *dev) { const struct uart_driver_api *api = (const struct uart_driver_api *)dev->driver_api;