XFusion API v1.3.0
载入中...
搜索中...
未找到
xf_hal_uart.c
浏览该文件的文档.
1
12/* ==================== [Includes] ========================================== */
13
14#include "xf_hal_uart.h"
15
16#if XF_HAL_UART_IS_ENABLE
17
18#include "../kernel/xf_hal_dev.h"
19
20/* ==================== [Defines] =========================================== */
21
22#define TAG "hal_uart"
23#define XF_HAL_UART_TYPE XF_HAL_UART
24
25/* ==================== [Typedefs] ========================================== */
26
27typedef struct _xf_hal_uart_t {
28 xf_hal_dev_t dev; // 一定要放到第一个,以便后续close一起free
31
32/* ==================== [Static Prototypes] ================================= */
33
35
36/* ==================== [Static Variables] ================================== */
37
38/* ==================== [Macros] ============================================ */
39
40#define XF_HAL_UART_CHECK(condition, retval, format, ...) \
41 XF_CHECK(condition, retval, TAG, format, ##__VA_ARGS__)
42
43/* ==================== [Global Functions] ================================== */
44
49
50xf_err_t xf_hal_uart_init(xf_uart_num_t uart_num, uint32_t baudrate)
51{
52 xf_err_t err = XF_OK;
53 UNUSED(err);
54
56 XF_HAL_UART_CHECK(!dev, -1, "uart init failed!");
57
58 xf_hal_uart_t *dev_uart = (xf_hal_uart_t *)dev;
59
60#if XF_HAL_LOCK_IS_ENABLE
61 xf_lock_lock(dev_uart->dev.mutex);
62#endif
63
64 dev_uart->config.baudrate = baudrate;
65
66#if XF_HAL_LOCK_IS_ENABLE
67 xf_lock_unlock(dev_uart->dev.mutex);
68#endif
69
71 XF_HAL_UART_CHECK(err, err, "init failed!");
72
73 return XF_OK;
74}
75
77{
78 xf_err_t err = XF_OK;
79 UNUSED(err);
80
82 xf_hal_uart_t *dev_uart = (xf_hal_uart_t *)dev;
83 XF_HAL_UART_CHECK(!dev_uart, XF_ERR_NOT_FOUND, "uart is not init!");
84
85 err = xf_hal_driver_close(dev);
86 XF_HAL_UART_CHECK(err, err, "deinit failed!");
87
88 return XF_OK;
89}
90
92{
93 xf_err_t err = XF_OK;
94 UNUSED(err);
95
97 xf_hal_uart_t *dev_uart = (xf_hal_uart_t *)dev;
98 XF_HAL_UART_CHECK(!dev_uart, XF_ERR_UNINIT, "uart is not init!");
99
100#if XF_HAL_LOCK_IS_ENABLE
101 xf_lock_lock(dev_uart->dev.mutex);
102#endif
103
104 dev_uart->config.enable = true;
105
106#if XF_HAL_LOCK_IS_ENABLE
107 xf_lock_unlock(dev_uart->dev.mutex);
108#endif
109
110 err = xf_hal_driver_ioctl(dev, XF_HAL_UART_CMD_ENABLE, &dev_uart->config);
111 XF_HAL_UART_CHECK(err, err, "enable failed!");
112
113 return XF_OK;
114}
115
117{
118 xf_err_t err = XF_OK;
119 UNUSED(err);
120
122 xf_hal_uart_t *dev_uart = (xf_hal_uart_t *)dev;
123 XF_HAL_UART_CHECK(!dev_uart, XF_ERR_UNINIT, "uart is not init!");
124
125#if XF_HAL_LOCK_IS_ENABLE
126 xf_lock_lock(dev_uart->dev.mutex);
127#endif
128
129 dev_uart->config.enable = false;
130
131#if XF_HAL_LOCK_IS_ENABLE
132 xf_lock_unlock(dev_uart->dev.mutex);
133#endif
134
135 err = xf_hal_driver_ioctl(dev, XF_HAL_UART_CMD_ENABLE, &dev_uart->config);
136 XF_HAL_UART_CHECK(err, err, "disable failed!");
137
138 return XF_OK;
139}
140
142 xf_gpio_num_t rx_num)
143{
144 xf_err_t err = XF_OK;
145 UNUSED(err);
146
148 xf_hal_uart_t *dev_uart = (xf_hal_uart_t *)dev;
149 XF_HAL_UART_CHECK(!dev_uart, XF_ERR_UNINIT, "uart is not init!");
150
151#if XF_HAL_LOCK_IS_ENABLE
152 xf_lock_lock(dev_uart->dev.mutex);
153#endif
154
155 dev_uart->config.tx_num = tx_num;
156 dev_uart->config.rx_num = rx_num;
157
158#if XF_HAL_LOCK_IS_ENABLE
159 xf_lock_unlock(dev_uart->dev.mutex);
160#endif
161
163 XF_HAL_UART_CHECK(err, err, "set gpio failed!");
164
165 return XF_OK;
166}
167
170{
171 xf_err_t err = XF_OK;
172 UNUSED(err);
173
175 xf_hal_uart_t *dev_uart = (xf_hal_uart_t *)dev;
176 XF_HAL_UART_CHECK(!dev_uart, XF_ERR_UNINIT, "uart is not init!");
177
178#if XF_HAL_LOCK_IS_ENABLE
179 xf_lock_lock(dev_uart->dev.mutex);
180#endif
181
182 dev_uart->config.data_bits = data_bits;
183 dev_uart->config.stop_bits = stop_bits;
184 dev_uart->config.parity_bits = parity_bits;
185
186#if XF_HAL_LOCK_IS_ENABLE
187 xf_lock_unlock(dev_uart->dev.mutex);
188#endif
189
191 &dev_uart->config);
192 XF_HAL_UART_CHECK(err, err, "setting failed!");
193
194 return XF_OK;
195}
196
198{
199 xf_err_t err = XF_OK;
200 UNUSED(err);
201
203 xf_hal_uart_t *dev_uart = (xf_hal_uart_t *)dev;
204 XF_HAL_UART_CHECK(!dev_uart, XF_ERR_UNINIT, "uart is not init!");
205
206#if XF_HAL_LOCK_IS_ENABLE
207 xf_lock_lock(dev_uart->dev.mutex);
208#endif
209
210 dev_uart->config.baudrate = baudrate;
211
212#if XF_HAL_LOCK_IS_ENABLE
213 xf_lock_unlock(dev_uart->dev.mutex);
214#endif
215
217 XF_HAL_UART_CHECK(err, err, "uart baudrate failed!");
218
219 return XF_OK;
220}
221
223{
225 xf_hal_uart_t *dev_uart = (xf_hal_uart_t *)dev;
226 XF_HAL_UART_CHECK(!dev_uart, XF_ERR_UNINIT, "uart is not init!");
227
228#if XF_HAL_LOCK_IS_ENABLE
229 xf_lock_lock(dev_uart->dev.mutex);
230#endif
231
232 uint32_t baudrate = dev_uart->config.baudrate;
233
234#if XF_HAL_LOCK_IS_ENABLE
235 xf_lock_unlock(dev_uart->dev.mutex);
236#endif
237
238 return baudrate;
239}
240
242 xf_gpio_num_t rts_num, xf_gpio_num_t cts_num)
243{
244 xf_err_t err = XF_OK;
245 UNUSED(err);
246
248 xf_hal_uart_t *dev_uart = (xf_hal_uart_t *)dev;
249 XF_HAL_UART_CHECK(!dev_uart, XF_ERR_UNINIT, "uart is not init!");
250
251#if XF_HAL_LOCK_IS_ENABLE
252 xf_lock_lock(dev_uart->dev.mutex);
253#endif
254
255 dev_uart->config.flow_control = flow_control;
256 dev_uart->config.rts_num = rts_num;
257 dev_uart->config.cts_num = cts_num;
258
259#if XF_HAL_LOCK_IS_ENABLE
260 xf_lock_unlock(dev_uart->dev.mutex);
261#endif
262
264 &dev_uart->config);
265 XF_HAL_UART_CHECK(err, err, "uart baudrate failed!");
266
267 return XF_OK;
268}
269
270int xf_hal_uart_read(xf_uart_num_t uart_num, uint8_t *data, uint32_t data_len)
271{
272 xf_err_t err = XF_OK;
273 UNUSED(err);
274
276 xf_hal_uart_t *dev_uart = (xf_hal_uart_t *)dev;
277 XF_HAL_UART_CHECK(!dev_uart, XF_ERR_UNINIT, "uart is not init!");
278
279 err = xf_hal_driver_read(dev, data, data_len);
280 XF_HAL_UART_CHECK(err < XF_OK, err, "uart read failed!:%d!", -err);
281
282 return err;
283}
284
285int xf_hal_uart_write(xf_uart_num_t uart_num, const uint8_t *data, uint32_t data_len)
286{
287 xf_err_t err = XF_OK;
288 UNUSED(err);
289
291 xf_hal_uart_t *dev_uart = (xf_hal_uart_t *)dev;
292 XF_HAL_UART_CHECK(!dev_uart, XF_ERR_UNINIT, "uart is not init!");
293
294 err = xf_hal_driver_write(dev, data, data_len);
295 XF_HAL_UART_CHECK(err < XF_OK, err, "uart write failed!:%d!", -err);
296
297 return err;
298}
299
300/* ==================== [Static Functions] ================================== */
302{
303 xf_err_t err = XF_OK;
304 UNUSED(err);
305 xf_hal_dev_t *dev = NULL;
306 xf_hal_uart_t *dev_uart = (xf_hal_uart_t *)xf_malloc(sizeof(xf_hal_uart_t));
307 XF_ASSERT(dev_uart, NULL, TAG, "memory alloc failed!");
308
309 dev = (xf_hal_dev_t *)dev_uart;
310
311 err = xf_hal_driver_open(dev, XF_HAL_UART_TYPE, uart_num);
312
313 if (err) {
314 XF_LOGE(TAG, "open failed!");
315 xf_free(dev);
316 dev = NULL;
317 }
318
319 return dev;
320}
321
322#endif
uint32_t xf_gpio_num_t
gpio 序号。
Definition xf_hal_gpio.h:44
xf_err_t xf_hal_uart_init(xf_uart_num_t uart_num, uint32_t baudrate)
uart 初始化。
Definition xf_hal_uart.c:50
xf_err_t xf_hal_uart_deinit(xf_uart_num_t uart_num)
uart 反初始化。
Definition xf_hal_uart.c:76
xf_err_t xf_hal_uart_set_config(xf_uart_num_t uart_num, xf_hal_uart_data_bits_t data_bits, xf_hal_uart_stop_bits_t stop_bits, xf_hal_uart_parity_bits_t parity_bits)
设置 uart 相关配置。
xf_err_t xf_hal_uart_set_flow_control(xf_uart_num_t uart_num, xf_hal_uart_flow_control_t flow_control, xf_gpio_num_t rts_num, xf_gpio_num_t cts_num)
uart 流控 io 设置。
enum _xf_hal_uart_parity_bits_t xf_hal_uart_parity_bits_t
uart 校验位。
int xf_hal_uart_read(xf_uart_num_t uart_num, uint8_t *data, uint32_t data_len)
uart 读取函数。
enum _xf_hal_uart_stop_bits_t xf_hal_uart_stop_bits_t
uart 的停止位。
xf_err_t xf_hal_uart_set_baudrate(xf_uart_num_t uart_num, uint32_t baudrate)
设置 uart 的波特率。
enum _xf_hal_uart_flow_control_t xf_hal_uart_flow_control_t
uart 流控模式。
int xf_hal_uart_write(xf_uart_num_t uart_num, const uint8_t *data, uint32_t data_len)
uart 写入函数。
xf_err_t xf_hal_uart_set_gpio(xf_uart_num_t uart_num, xf_gpio_num_t tx_num, xf_gpio_num_t rx_num)
uart 设置 uart 的通讯 io。
uint32_t xf_uart_num_t
uart 序号。
Definition xf_hal_uart.h:43
xf_err_t xf_hal_uart_disable(xf_uart_num_t uart_num)
uart 禁用函数。
enum _xf_hal_uart_data_bits_t xf_hal_uart_data_bits_t
uart 的数据位。
uint32_t xf_hal_uart_get_baudrate(xf_uart_num_t uart_num)
获取当前 uart 的波特率。
xf_err_t xf_hal_uart_enable(xf_uart_num_t uart_num)
uart 启用函数。
Definition xf_hal_uart.c:91
@ XF_HAL_UART_CMD_BAUDRATE
@ XF_HAL_UART_CMD_RTS_NUM
@ XF_HAL_UART_CMD_CTS_NUM
@ XF_HAL_UART_CMD_PARITY_BITS
@ XF_HAL_UART_CMD_RX_NUM
@ XF_HAL_UART_CMD_DATA_BITS
@ XF_HAL_UART_CMD_TX_NUM
@ XF_HAL_UART_CMD_STOP_BITS
@ XF_HAL_UART_CMD_ENABLE
@ XF_HAL_UART_CMD_FLOW_CONTROL
#define XF_ASSERT(condition, retval, tag, format,...)
xfusion 断言宏(条件 不成立 时则输出日志后返回)。
Definition xf_check.h:150
int32_t xf_err_t
整形错误类型。 错误码具体值见 xf_err_code_t.
Definition xf_err.h:69
@ XF_OK
Definition xf_err.h:43
@ XF_ERR_NOT_FOUND
Definition xf_err.h:50
@ XF_ERR_UNINIT
Definition xf_err.h:54
int xf_lock_unlock(xf_lock_t lock)
解锁.
Definition xf_lock.c:88
int xf_lock_lock(xf_lock_t lock)
锁定直至成功.
Definition xf_lock.c:72
#define xf_malloc(x)
Definition xf_stdlib.h:38
#define xf_free(x)
Definition xf_stdlib.h:39
用于对接 uart 设置的参数。
xf_gpio_num_t rts_num
xf_gpio_num_t cts_num
xf_gpio_num_t tx_num
xf_gpio_num_t rx_num
xf_hal_uart_config_t config
Definition xf_hal_uart.c:29
xf_hal_dev_t dev
Definition xf_hal_uart.c:28
xf_err_t xf_hal_driver_close(xf_hal_dev_t *dev)
Definition xf_hal_dev.c:192
int xf_hal_driver_read(xf_hal_dev_t *dev, void *buf, size_t count)
Definition xf_hal_dev.c:168
xf_err_t xf_hal_driver_ioctl(xf_hal_dev_t *dev, uint32_t cmd, void *config)
Definition xf_hal_dev.c:154
xf_err_t xf_hal_driver_open(xf_hal_dev_t *dev, xf_hal_type_t type, uint32_t id)
Definition xf_hal_dev.c:118
int xf_hal_driver_write(xf_hal_dev_t *dev, const void *buf, size_t count)
Definition xf_hal_dev.c:180
xf_hal_dev_t * xf_hal_device_find(xf_hal_type_t type, uint32_t id)
Definition xf_hal_dev.c:238
xf_err_t xf_hal_driver_register(xf_hal_type_t type, xf_hal_flag_t flag, xf_hal_dev_create_t constructor, const xf_driver_ops_t *driver_ops)
Definition xf_hal_dev.c:44
xf_hal_dev_t * xf_hal_driver_create(xf_hal_type_t type, uint32_t id)
Definition xf_hal_dev.c:93
@ XF_HAL_FLAG_READ_WRITE
Definition xf_hal_dev.h:54
#define XF_HAL_UART_TYPE
Definition xf_hal_uart.c:23
#define XF_HAL_UART_CHECK(condition, retval, format,...)
Definition xf_hal_uart.c:40
xf_err_t xf_hal_uart_register(const xf_driver_ops_t *driver_ops)
uart 设备注册。
Definition xf_hal_uart.c:45
struct _xf_hal_uart_t xf_hal_uart_t
static xf_hal_dev_t * uart_constructor(xf_uart_num_t uart_num)
#define TAG
Definition xf_hal_uart.c:22
xf_hal 的 uart(通用异步收发器) 设备抽象。
#define XF_LOGE(tag, format,...)
#define UNUSED(_x)