1 /*
2 * Copyright (C) 2015-2018 Alibaba Group Holding Limited
3 */
4
5 #include <limits.h>
6 #include <poll.h>
7 #include <sys/ioctl.h>
8 #include <aos/kernel.h>
9 #include <vfsdev/uart_dev.h>
10 #include <mbmaster.h>
11 #include "serial.h"
12 #include "aos_hal_uart.h"
13
14 #if ((MBMASTER_CONFIG_RTU_ENABLED > 0) || (MBMASTER_CONFIG_ASCII_ENABLED > 0))
15 static uart_dev_t uart_dev = { 0 };
16
mb_serial_init(mb_handler_t * handler,uint8_t port,uint32_t baud_rate,uint8_t data_width,mb_parity_t parity)17 mb_status_t mb_serial_init(mb_handler_t *handler, uint8_t port, uint32_t baud_rate,
18 uint8_t data_width, mb_parity_t parity)
19 {
20 hal_uart_data_width_t enum_data_with = DATA_WIDTH_8BIT;
21 switch (data_width) {
22 case 5:
23 enum_data_with = DATA_WIDTH_5BIT;
24 break;
25 case 6:
26 enum_data_with = DATA_WIDTH_6BIT;
27 break;
28 case 7:
29 enum_data_with = DATA_WIDTH_7BIT;
30 break;
31 case 8:
32 default:
33 enum_data_with = DATA_WIDTH_8BIT;
34 break;
35 }
36
37 uart_dev.port = port;
38 uart_dev.config.baud_rate = baud_rate;
39 uart_dev.config.data_width = enum_data_with;
40 uart_dev.config.flow_control = FLOW_CONTROL_DISABLED;
41 uart_dev.config.mode = MODE_TX_RX;
42 uart_dev.config.parity = parity;
43 uart_dev.config.stop_bits = STOP_BITS_1;
44 int ret = aos_hal_uart_init(&uart_dev);
45 if (ret != 0) {
46 return MB_SERIAL_INIT_FAILED;
47 } else {
48 handler->private = (void *)&uart_dev;
49 return MB_SUCCESS;
50 }
51 }
52
mb_serial_finalize(mb_handler_t * handler)53 mb_status_t mb_serial_finalize(mb_handler_t *handler)
54 {
55 aos_hal_uart_finalize((uart_dev_t *)handler->private);
56 handler->private = NULL;
57
58 return MB_SUCCESS;
59 }
60
mb_serial_frame_send(mb_handler_t * handler,uint32_t timeout)61 mb_status_t mb_serial_frame_send(mb_handler_t *handler, uint32_t timeout)
62 {
63 uart_dev_t *dev = (uart_dev_t *)(handler->private);
64
65 if (aos_hal_uart_send(dev, handler->mb_frame_buff,
66 handler->mb_frame_length, timeout) != 0)
67 return MB_FRAME_SEND_ERR;
68
69 return MB_SUCCESS;
70 }
71
mb_serial_frame_recv(mb_handler_t * handler)72 mb_status_t mb_serial_frame_recv(mb_handler_t *handler)
73 {
74 uart_dev_t *dev = (uart_dev_t *)(handler->private);
75
76 mb_status_t ret = MB_SUCCESS;
77
78 uint32_t recv_size = 0;
79 int32_t r = aos_hal_uart_recv_II(dev, handler->mb_frame_buff,
80 ADU_BUF_MAX_LENGTH, &recv_size, handler->respond_timeout);
81 if (r < 0) {
82 handler->mb_frame_length = 0;
83 ret = MB_SLAVE_NO_RESPOND;
84 return ret;
85 }
86
87 if (recv_size == 0) {
88 handler->mb_frame_length = 0;
89 ret = MB_RESPOND_TIMEOUT;
90 return ret;
91 }
92
93 handler->mb_frame_length = recv_size;
94 return ret;
95 }
96
97 #endif /* (MBM_RTU_ENABLED > 0) || (MBM_ASCII_ENABLED > 0) */
98