LP-551 Remove popup - Increase neutral diff levels for alarm
[librepilot.git] / flight / pios / inc / pios_com.h
blob3e33775da0b31c5b495ab6b54680f0e418decf24
1 /**
2 ******************************************************************************
3 * @addtogroup PIOS PIOS Core hardware abstraction layer
4 * @{
5 * @addtogroup PIOS_COM COM layer functions
6 * @brief Hardware communication layer
7 * @{
9 * @file pios_com.h
10 * @author The LibrePilot Project, http://www.librepilot.org, Copyright (c) 2017.
11 * The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010.
12 * Parts by Thorsten Klose (tk@midibox.org)
13 * @brief COM layer functions header
14 * @see The GNU Public License (GPL) Version 3
16 *****************************************************************************/
18 * This program is free software; you can redistribute it and/or modify
19 * it under the terms of the GNU General Public License as published by
20 * the Free Software Foundation; either version 3 of the License, or
21 * (at your option) any later version.
23 * This program is distributed in the hope that it will be useful, but
24 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
25 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
26 * for more details.
28 * You should have received a copy of the GNU General Public License along
29 * with this program; if not, write to the Free Software Foundation, Inc.,
30 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
33 #ifndef PIOS_COM_H
34 #define PIOS_COM_H
36 #include <stdint.h> /* uint*_t */
37 #include <stdbool.h> /* bool */
39 typedef uint16_t (*pios_com_callback)(uint32_t context, uint8_t *buf, uint16_t buf_len, uint16_t *headroom, bool *task_woken);
40 typedef void (*pios_com_callback_ctrl_line)(uint32_t context, uint32_t mask, uint32_t state);
41 typedef void (*pios_com_callback_baud_rate)(uint32_t context, uint32_t baud);
42 typedef void (*pios_com_callback_available)(uint32_t context, uint32_t available);
44 enum PIOS_COM_Word_Length {
45 PIOS_COM_Word_length_Unchanged = 0,
46 PIOS_COM_Word_length_8b,
47 PIOS_COM_Word_length_9b,
50 enum PIOS_COM_StopBits {
51 PIOS_COM_StopBits_Unchanged = 0,
52 PIOS_COM_StopBits_0_5,
53 PIOS_COM_StopBits_1,
54 PIOS_COM_StopBits_1_5,
55 PIOS_COM_StopBits_2,
58 enum PIOS_COM_Parity {
59 PIOS_COM_Parity_Unchanged = 0,
60 PIOS_COM_Parity_No,
61 PIOS_COM_Parity_Even,
62 PIOS_COM_Parity_Odd,
65 struct pios_com_driver {
66 void (*set_baud)(uint32_t id, uint32_t baud);
67 void (*set_config)(uint32_t usart_id, enum PIOS_COM_Word_Length word_len, enum PIOS_COM_Parity parity, enum PIOS_COM_StopBits stop_bits, uint32_t baud_rate);
68 void (*set_ctrl_line)(uint32_t id, uint32_t mask, uint32_t state);
69 void (*tx_start)(uint32_t id, uint16_t tx_bytes_avail);
70 void (*rx_start)(uint32_t id, uint16_t rx_bytes_avail);
71 void (*bind_rx_cb)(uint32_t id, pios_com_callback rx_in_cb, uint32_t context);
72 void (*bind_tx_cb)(uint32_t id, pios_com_callback tx_out_cb, uint32_t context);
73 void (*bind_ctrl_line_cb)(uint32_t id, pios_com_callback_ctrl_line ctrl_line_cb, uint32_t context);
74 void (*bind_baud_rate_cb)(uint32_t id, pios_com_callback_baud_rate baud_rate_cb, uint32_t context);
75 uint32_t (*available)(uint32_t id);
76 void (*bind_available_cb)(uint32_t id, pios_com_callback_available available_cb, uint32_t context);
77 int32_t (*ioctl)(uint32_t id, uint32_t ctl, void *param);
80 /* Control line definitions */
81 #define COM_CTRL_LINE_DTR_MASK 0x01
82 #define COM_CTRL_LINE_RTS_MASK 0x02
84 /* Public Functions */
85 extern int32_t PIOS_COM_Init(uint32_t *com_id, const struct pios_com_driver *driver, uint32_t lower_id, uint8_t *rx_buffer, uint16_t rx_buffer_len, uint8_t *tx_buffer, uint16_t tx_buffer_len);
86 extern int32_t PIOS_COM_ChangeBaud(uint32_t com_id, uint32_t baud);
87 extern int32_t PIOS_COM_ChangeConfig(uint32_t com_id, enum PIOS_COM_Word_Length word_len, enum PIOS_COM_Parity parity, enum PIOS_COM_StopBits stop_bits, uint32_t baud_rate);
88 extern int32_t PIOS_COM_SetCtrlLine(uint32_t com_id, uint32_t mask, uint32_t state);
89 extern int32_t PIOS_COM_RegisterCtrlLineCallback(uint32_t usart_id, pios_com_callback_ctrl_line ctrl_line_cb, uint32_t context);
90 extern int32_t PIOS_COM_RegisterBaudRateCallback(uint32_t usart_id, pios_com_callback_baud_rate baud_rate_cb, uint32_t context);
91 extern int32_t PIOS_COM_SendCharNonBlocking(uint32_t com_id, char c);
92 extern int32_t PIOS_COM_SendChar(uint32_t com_id, char c);
93 extern int32_t PIOS_COM_SendBufferNonBlocking(uint32_t com_id, const uint8_t *buffer, uint16_t len);
94 extern int32_t PIOS_COM_SendBuffer(uint32_t com_id, const uint8_t *buffer, uint16_t len);
95 extern int32_t PIOS_COM_SendStringNonBlocking(uint32_t com_id, const char *str);
96 extern int32_t PIOS_COM_SendString(uint32_t com_id, const char *str);
97 extern int32_t PIOS_COM_SendFormattedStringNonBlocking(uint32_t com_id, const char *format, ...);
98 extern int32_t PIOS_COM_SendFormattedString(uint32_t com_id, const char *format, ...);
99 extern uint16_t PIOS_COM_ReceiveBuffer(uint32_t com_id, uint8_t *buf, uint16_t buf_len, uint32_t timeout_ms);
100 extern uint32_t PIOS_COM_Available(uint32_t com_id);
101 extern int32_t PIOS_COM_RegisterAvailableCallback(uint32_t com_id, pios_com_callback_available, uint32_t context);
103 /* Event driven asynchronous API */
104 extern int32_t PIOS_COM_ASYNC_TxStart(uint32_t id, uint16_t tx_bytes_avail);
105 extern int32_t PIOS_COM_ASYNC_RxStart(uint32_t id, uint16_t rx_bytes_avail);
106 extern int32_t PIOS_COM_ASYNC_RegisterRxCallback(uint32_t id, pios_com_callback rx_in_cb, uint32_t context);
107 extern int32_t PIOS_COM_ASYNC_RegisterTxCallback(uint32_t id, pios_com_callback tx_out_cb, uint32_t context);
109 extern void PIOS_COM_LinkComPair(uint32_t com1_id, uint32_t com2_id, bool link_ctrl_line, bool link_baud_rate);
111 #define COM_AVAILABLE_NONE (0)
112 #define COM_AVAILABLE_RX (1 << 0)
113 #define COM_AVAILABLE_TX (1 << 1)
114 #define COM_AVAILABLE_RXTX (COM_AVAILABLE_RX | COM_AVAILABLE_TX)
116 /* ioctl */
117 extern int32_t PIOS_COM_Ioctl(uint32_t com_id, uint32_t ctl, void *param);
119 #define COM_IOCTL_NRBITS 16
120 #define COM_IOCTL_TYPEBITS 16
122 #define COM_IOCTL_NRMASK ((1 << COM_IOCTL_NRBITS) - 1)
123 #define COM_IOCTL_TYPEMASK ((1 << COM_IOCTL_TYPEBITS) - 1)
125 #define COM_IOCTL_NRSHIFT 0
126 #define COM_IOCTL_TYPESHIFT (COM_IOCTL_NRSHIFT + COM_IOCTL_NRBITS)
128 #define COM_IOCTL(type, nr, pt) \
129 (((type) << COM_IOCTL_TYPESHIFT) | \
130 ((nr) << COM_IOCTL_NRSHIFT))
132 /* used to decode ioctl numbers.. */
133 #define COM_IOCTL_TYPE(nr) (((nr) >> COM_IOCTL_TYPESHIFT) & COM_IOCTL_TYPEMASK)
134 #define COM_IOCTL_NR(nr) (((nr) >> COM_IOCTL_NRSHIFT) & COM_IOCTL_NRMASK)
136 enum pios_com_ioctl_type {
137 COM_IOCTL_TYPE_USART,
138 COM_IOCTL_TYPE_USB_CDC,
139 COM_IOCTL_TYPE_SOFT_UART,
142 #define COM_IOCTL_ENOSYS (-1) /* Function not implemented */
144 #endif /* PIOS_COM_H */
147 * @}
148 * @}