2 ******************************************************************************
3 * @addtogroup PIOS PIOS Core hardware abstraction layer
5 * @addtogroup PIOS_COM COM layer functions
6 * @brief Hardware communication layer
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
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
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
,
54 PIOS_COM_StopBits_1_5
,
58 enum PIOS_COM_Parity
{
59 PIOS_COM_Parity_Unchanged
= 0,
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)
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 */