text: /*---------------------------------------------------------------------------
   * Copyright (c) 2021 Arm Limited (or its affiliates). All rights reserved.
   *
   * SPDX-License-Identifier: Apache-2.0
   *
   * Licensed under the Apache License, Version 2.0 (the License); you may
   * not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   * www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an AS IS BASIS, WITHOUT
   * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   *
   *      Name:    retarget_stdio.c
   *      Purpose: Retarget stdio to USART
   *
   *---------------------------------------------------------------------------*/
  
  #include "Driver_USART.h"
  
  #define USART_DRV_NUM           0
  #define USART_BAUDRATE          115200
  
  #define _USART_Driver_(n)  Driver_USART##n
  #define  USART_Driver_(n) _USART_Driver_(n)
   
  extern ARM_DRIVER_USART  USART_Driver_(USART_DRV_NUM);
  #define ptrUSART       (&USART_Driver_(USART_DRV_NUM))
  
  /**
    Initialize stdio
   
    \return          0 on success, or -1 on error.
  */
  int stdio_init (void) {
    int32_t status;
   
    status = ptrUSART->Initialize(NULL);
    if (status != ARM_DRIVER_OK) return (-1);
   
    status = ptrUSART->PowerControl(ARM_POWER_FULL);
    if (status != ARM_DRIVER_OK) return (-1);
   
    status = ptrUSART->Control(ARM_USART_MODE_ASYNCHRONOUS |
                               ARM_USART_DATA_BITS_8       |
                               ARM_USART_PARITY_NONE       |
                               ARM_USART_STOP_BITS_1       |
                               ARM_USART_FLOW_CONTROL_NONE,
                               USART_BAUDRATE);
    if (status != ARM_DRIVER_OK) return (-1);
   
    status = ptrUSART->Control(ARM_USART_CONTROL_RX, 1);
    if (status != ARM_DRIVER_OK) return (-1);
   
    return (0);
  }
  
  /**
    Put a character to the stderr
   
    \param[in]   ch  Character to output
    \return          The character written, or -1 on write error.
  */
  int stderr_putchar (int ch) {
    uint8_t buf[1];
   
    buf[0] = ch;
    if (ptrUSART->Send(buf, 1) != ARM_DRIVER_OK) {
      return (-1);
    }
    while (ptrUSART->GetTxCount() != 1);
    return (ch);
  }
  
  /**
    Put a character to the stdout
  
    \param[in]   ch  Character to output
    \return          The character written, or -1 on write error.
  */
  int stdout_putchar (int ch) {
    uint8_t buf[1];
   
    buf[0] = ch;
    if (ptrUSART->Send(buf, 1) != ARM_DRIVER_OK) {
      return (-1);
    }
    while (ptrUSART->GetTxCount() != 1);
    return (ch);
  }
  
  /**
    Get a character from the stdio
   
    \return     The next character from the input, or -1 on read error.
  */
  int stdin_getchar (void) {
    uint8_t buf[1];
   
    if (ptrUSART->Receive(buf, 1) != ARM_DRIVER_OK) {
      return (-1);
    }
    while (ptrUSART->GetRxCount() != 1);
    return (buf[0]);
  }
  