NuMaker RS485 lib

Dependents:   NuMaker-mbed-modbus-sample

Committer:
cyliang
Date:
Thu Feb 25 15:26:25 2021 +0800
Revision:
4:3bdf456890b6
Add MyUnbufferedSerial class for OS v6.x support

Who changed what in which revision?

UserRevisionLine numberNew contents of line
cyliang 4:3bdf456890b6 1 /* mbed Microcontroller Library
cyliang 4:3bdf456890b6 2 * Copyright (c) 2006-2019 ARM Limited
cyliang 4:3bdf456890b6 3 * SPDX-License-Identifier: Apache-2.0
cyliang 4:3bdf456890b6 4 *
cyliang 4:3bdf456890b6 5 * Licensed under the Apache License, Version 2.0 (the "License");
cyliang 4:3bdf456890b6 6 * you may not use this file except in compliance with the License.
cyliang 4:3bdf456890b6 7 * You may obtain a copy of the License at
cyliang 4:3bdf456890b6 8 *
cyliang 4:3bdf456890b6 9 * http://www.apache.org/licenses/LICENSE-2.0
cyliang 4:3bdf456890b6 10 *
cyliang 4:3bdf456890b6 11 * Unless required by applicable law or agreed to in writing, software
cyliang 4:3bdf456890b6 12 * distributed under the License is distributed on an "AS IS" BASIS,
cyliang 4:3bdf456890b6 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
cyliang 4:3bdf456890b6 14 * See the License for the specific language governing permissions and
cyliang 4:3bdf456890b6 15 * limitations under the License.
cyliang 4:3bdf456890b6 16 */
cyliang 4:3bdf456890b6 17
cyliang 4:3bdf456890b6 18 #include "MyUnbufferedSerial.h"
cyliang 4:3bdf456890b6 19 #if (MBED_MAJOR_VERSION >= 6)
cyliang 4:3bdf456890b6 20 #if DEVICE_SERIAL
cyliang 4:3bdf456890b6 21
cyliang 4:3bdf456890b6 22 #include "platform/mbed_critical.h"
cyliang 4:3bdf456890b6 23
cyliang 4:3bdf456890b6 24 namespace mbed {
cyliang 4:3bdf456890b6 25
cyliang 4:3bdf456890b6 26 MyUnbufferedSerial::MyUnbufferedSerial(
cyliang 4:3bdf456890b6 27 PinName tx,
cyliang 4:3bdf456890b6 28 PinName rx,
cyliang 4:3bdf456890b6 29 int baud
cyliang 4:3bdf456890b6 30 ) : SerialBase(tx, rx, baud)
cyliang 4:3bdf456890b6 31 {
cyliang 4:3bdf456890b6 32 // No lock needed in the constructor
cyliang 4:3bdf456890b6 33 }
cyliang 4:3bdf456890b6 34
cyliang 4:3bdf456890b6 35 MyUnbufferedSerial::MyUnbufferedSerial(
cyliang 4:3bdf456890b6 36 const serial_pinmap_t &static_pinmap, int baud
cyliang 4:3bdf456890b6 37 ) : SerialBase(static_pinmap, baud)
cyliang 4:3bdf456890b6 38 {
cyliang 4:3bdf456890b6 39 // No lock needed in the constructor
cyliang 4:3bdf456890b6 40 }
cyliang 4:3bdf456890b6 41
cyliang 4:3bdf456890b6 42 ssize_t MyUnbufferedSerial::write(const void *buffer, size_t size)
cyliang 4:3bdf456890b6 43 {
cyliang 4:3bdf456890b6 44 const unsigned char *buf = static_cast<const unsigned char *>(buffer);
cyliang 4:3bdf456890b6 45
cyliang 4:3bdf456890b6 46 if (size == 0) {
cyliang 4:3bdf456890b6 47 return 0;
cyliang 4:3bdf456890b6 48 }
cyliang 4:3bdf456890b6 49
cyliang 4:3bdf456890b6 50 bool lock_api = !core_util_in_critical_section();
cyliang 4:3bdf456890b6 51
cyliang 4:3bdf456890b6 52 if (lock_api) {
cyliang 4:3bdf456890b6 53 lock();
cyliang 4:3bdf456890b6 54 }
cyliang 4:3bdf456890b6 55
cyliang 4:3bdf456890b6 56 for (size_t i = 0; i < size; i++) {
cyliang 4:3bdf456890b6 57 _base_putc(buf[i]);
cyliang 4:3bdf456890b6 58 }
cyliang 4:3bdf456890b6 59
cyliang 4:3bdf456890b6 60 if (lock_api) {
cyliang 4:3bdf456890b6 61 unlock();
cyliang 4:3bdf456890b6 62 }
cyliang 4:3bdf456890b6 63
cyliang 4:3bdf456890b6 64 return size;
cyliang 4:3bdf456890b6 65 }
cyliang 4:3bdf456890b6 66
cyliang 4:3bdf456890b6 67 ssize_t MyUnbufferedSerial::read(void *buffer, size_t size)
cyliang 4:3bdf456890b6 68 {
cyliang 4:3bdf456890b6 69 unsigned char *buf = static_cast<unsigned char *>(buffer);
cyliang 4:3bdf456890b6 70
cyliang 4:3bdf456890b6 71 if (size == 0) {
cyliang 4:3bdf456890b6 72 return 0;
cyliang 4:3bdf456890b6 73 }
cyliang 4:3bdf456890b6 74
cyliang 4:3bdf456890b6 75 lock();
cyliang 4:3bdf456890b6 76
cyliang 4:3bdf456890b6 77 buf[0] = _base_getc();
cyliang 4:3bdf456890b6 78
cyliang 4:3bdf456890b6 79 unlock();
cyliang 4:3bdf456890b6 80
cyliang 4:3bdf456890b6 81 return 1;
cyliang 4:3bdf456890b6 82 }
cyliang 4:3bdf456890b6 83
cyliang 4:3bdf456890b6 84 short MyUnbufferedSerial::poll(short events) const
cyliang 4:3bdf456890b6 85 {
cyliang 4:3bdf456890b6 86 short revents = 0;
cyliang 4:3bdf456890b6 87 if (
cyliang 4:3bdf456890b6 88 (events & POLLIN)
cyliang 4:3bdf456890b6 89 && (const_cast <MyUnbufferedSerial *>(this))->SerialBase::readable()
cyliang 4:3bdf456890b6 90 ) {
cyliang 4:3bdf456890b6 91 revents |= POLLIN;
cyliang 4:3bdf456890b6 92 }
cyliang 4:3bdf456890b6 93 if (
cyliang 4:3bdf456890b6 94 (events & POLLOUT)
cyliang 4:3bdf456890b6 95 && (const_cast <MyUnbufferedSerial *>(this))->SerialBase::writeable()
cyliang 4:3bdf456890b6 96 ) {
cyliang 4:3bdf456890b6 97 revents |= POLLOUT;
cyliang 4:3bdf456890b6 98 }
cyliang 4:3bdf456890b6 99 return revents;
cyliang 4:3bdf456890b6 100 }
cyliang 4:3bdf456890b6 101
cyliang 4:3bdf456890b6 102 int MyUnbufferedSerial::enable_input(bool enabled)
cyliang 4:3bdf456890b6 103 {
cyliang 4:3bdf456890b6 104 SerialBase::enable_input(enabled);
cyliang 4:3bdf456890b6 105
cyliang 4:3bdf456890b6 106 return 0;
cyliang 4:3bdf456890b6 107 }
cyliang 4:3bdf456890b6 108
cyliang 4:3bdf456890b6 109 int MyUnbufferedSerial::enable_output(bool enabled)
cyliang 4:3bdf456890b6 110 {
cyliang 4:3bdf456890b6 111 SerialBase::enable_output(enabled);
cyliang 4:3bdf456890b6 112
cyliang 4:3bdf456890b6 113 return 0;
cyliang 4:3bdf456890b6 114 }
cyliang 4:3bdf456890b6 115
cyliang 4:3bdf456890b6 116 #if DEVICE_SERIAL_FC
cyliang 4:3bdf456890b6 117 void MyUnbufferedSerial::set_flow_control(Flow type, PinName flow1, PinName flow2)
cyliang 4:3bdf456890b6 118 {
cyliang 4:3bdf456890b6 119 lock();
cyliang 4:3bdf456890b6 120 SerialBase::set_flow_control(type, flow1, flow2);
cyliang 4:3bdf456890b6 121 unlock();
cyliang 4:3bdf456890b6 122 }
cyliang 4:3bdf456890b6 123 #endif // DEVICE_SERIAL_FC
cyliang 4:3bdf456890b6 124
cyliang 4:3bdf456890b6 125 } // namespace mbed
cyliang 4:3bdf456890b6 126
cyliang 4:3bdf456890b6 127 #endif // #if DEVICE_SERIAL
cyliang 4:3bdf456890b6 128 #endif // (MBED_MAJOR_VERSION >= 6 )