1*61c4878aSAndroid Build Coastguard Worker // Copyright 2023 The Pigweed Authors
2*61c4878aSAndroid Build Coastguard Worker //
3*61c4878aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License"); you may not
4*61c4878aSAndroid Build Coastguard Worker // use this file except in compliance with the License. You may obtain a copy of
5*61c4878aSAndroid Build Coastguard Worker // the License at
6*61c4878aSAndroid Build Coastguard Worker //
7*61c4878aSAndroid Build Coastguard Worker // https://www.apache.org/licenses/LICENSE-2.0
8*61c4878aSAndroid Build Coastguard Worker //
9*61c4878aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*61c4878aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11*61c4878aSAndroid Build Coastguard Worker // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12*61c4878aSAndroid Build Coastguard Worker // License for the specific language governing permissions and limitations under
13*61c4878aSAndroid Build Coastguard Worker // the License.
14*61c4878aSAndroid Build Coastguard Worker
15*61c4878aSAndroid Build Coastguard Worker #include "pw_stream_uart_mcuxpresso/stream.h"
16*61c4878aSAndroid Build Coastguard Worker
17*61c4878aSAndroid Build Coastguard Worker namespace pw::stream {
18*61c4878aSAndroid Build Coastguard Worker
~UartStreamMcuxpresso()19*61c4878aSAndroid Build Coastguard Worker UartStreamMcuxpresso::~UartStreamMcuxpresso() {
20*61c4878aSAndroid Build Coastguard Worker USART_RTOS_Deinit(&handle_);
21*61c4878aSAndroid Build Coastguard Worker element_controller_.Release().IgnoreError();
22*61c4878aSAndroid Build Coastguard Worker }
23*61c4878aSAndroid Build Coastguard Worker
Init(uint32_t srcclk)24*61c4878aSAndroid Build Coastguard Worker Status UartStreamMcuxpresso::Init(uint32_t srcclk) {
25*61c4878aSAndroid Build Coastguard Worker config_.srcclk = srcclk;
26*61c4878aSAndroid Build Coastguard Worker
27*61c4878aSAndroid Build Coastguard Worker PW_TRY(element_controller_.Acquire());
28*61c4878aSAndroid Build Coastguard Worker
29*61c4878aSAndroid Build Coastguard Worker if (USART_RTOS_Init(&handle_, &uart_handle_, &config_) != kStatus_Success) {
30*61c4878aSAndroid Build Coastguard Worker element_controller_.Release().IgnoreError();
31*61c4878aSAndroid Build Coastguard Worker return Status::Internal();
32*61c4878aSAndroid Build Coastguard Worker }
33*61c4878aSAndroid Build Coastguard Worker
34*61c4878aSAndroid Build Coastguard Worker return OkStatus();
35*61c4878aSAndroid Build Coastguard Worker }
36*61c4878aSAndroid Build Coastguard Worker
DoRead(ByteSpan data)37*61c4878aSAndroid Build Coastguard Worker StatusWithSize UartStreamMcuxpresso::DoRead(ByteSpan data) {
38*61c4878aSAndroid Build Coastguard Worker size_t read = 0;
39*61c4878aSAndroid Build Coastguard Worker if (const auto status =
40*61c4878aSAndroid Build Coastguard Worker USART_RTOS_Receive(&handle_,
41*61c4878aSAndroid Build Coastguard Worker reinterpret_cast<uint8_t*>(data.data()),
42*61c4878aSAndroid Build Coastguard Worker data.size(),
43*61c4878aSAndroid Build Coastguard Worker &read);
44*61c4878aSAndroid Build Coastguard Worker status != kStatus_Success) {
45*61c4878aSAndroid Build Coastguard Worker USART_TransferAbortReceive(base_, &uart_handle_);
46*61c4878aSAndroid Build Coastguard Worker return StatusWithSize(Status::Internal(), 0);
47*61c4878aSAndroid Build Coastguard Worker }
48*61c4878aSAndroid Build Coastguard Worker
49*61c4878aSAndroid Build Coastguard Worker return StatusWithSize(read);
50*61c4878aSAndroid Build Coastguard Worker }
51*61c4878aSAndroid Build Coastguard Worker
DoWrite(ConstByteSpan data)52*61c4878aSAndroid Build Coastguard Worker Status UartStreamMcuxpresso::DoWrite(ConstByteSpan data) {
53*61c4878aSAndroid Build Coastguard Worker if (USART_RTOS_Send(
54*61c4878aSAndroid Build Coastguard Worker &handle_,
55*61c4878aSAndroid Build Coastguard Worker reinterpret_cast<uint8_t*>(const_cast<std::byte*>(data.data())),
56*61c4878aSAndroid Build Coastguard Worker data.size()) != kStatus_Success) {
57*61c4878aSAndroid Build Coastguard Worker return Status::Internal();
58*61c4878aSAndroid Build Coastguard Worker }
59*61c4878aSAndroid Build Coastguard Worker return OkStatus();
60*61c4878aSAndroid Build Coastguard Worker }
61*61c4878aSAndroid Build Coastguard Worker
62*61c4878aSAndroid Build Coastguard Worker } // namespace pw::stream
63