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