#ifndef _aplmt_hardware_hitachi_h8s_2328_uart_initapi_h_
#define _aplmt_hardware_hitachi_h8s_2328_uart_initapi_h_
/*----------------------------------------------------------------------------
** SUMMARY: Hitachi-H8/2328 Hardware UARTs Initialization Interface (HWIUART)
**
** DESCRIPTION:
**  This file provides the initizaltion inteface(s) for the onboard UART(s)
**  SPECIFIC to Hitachi's H8s/2328 micro family.
**  
** CONFIGURATION 
** -------------
**  COMPILE:     none.
**
**  APPLICATION: The application is REQUIRED to define the following symbol(s)
**                  OPTION_APLMT_DEVICE_UART_BAUDRATE_CLOCK
**                  OPTION_APLMT_DEVICE_UARTA_BAUDRATE_DIVISOR
**                  OPTION_APLMT_DEVICE_UARTB_BAUDRATE_DIVISOR
** 
**  PLATFORM:    none.
----------------------------------------------------------------------------*/

#include "aplcfg.h"                     /* For: Application configuration */
#include "apl/types/types.h"            /* For: basic types */

/** The application is required to define the chip's operating speed */
#if !defined(OPTION_APLMT_DEVICE_UART_BAUDRATE_CLOCK) || !defined(OPTION_APLMT_DEVICE_UARTA_BAUDRATE_DIVISOR) || !defined(OPTION_APLMT_DEVICE_UARTB_BAUDRATE_DIVISOR) 
#error The application must define, OPTION_APLMT_DEVICE_UART_BAUDRATE_CLOCK and OPTION_APLMT_DEVICE_UARTA_BAUDRATE_DIVISOR and OPTION_APLMT_DEVICE_UARTB_BAUDRATE_DIVISOR, it is the Targets operating frequency for calculating BAUD Rate
#endif


#ifdef __cplusplus
extern "C" {
#endif


/*-------------- MACROS/CONSTANTS ------------------------------------------*/
/** Use the following macros to determine the 'baud' parameter values for 
    UART initialization routines below.
    NOTES:
        o Both 'baud' and OPTION_APLMT_DEVICE_UART_BAUDRATE_CLOCK SHOULD 
          ALWAYS BE CONSTANTs or lots of code will be generated.
        o OPTION_APLMT_DEVICE_UARTx_BAUDRATE_CLOCK should be a float point 
          value that is the value of OSC in Hz, i.e: 9.8306e6 Hz -->9.8306Mhz
        0 OPTION_APLMT_DEVICE_UARTx_BAUDRATE_DIVISOR is the OSC divisor (in the
          SMR register). Its range is 0 to 3.
 */
#define APLMT_HALUART_CALC_DIVISOR(n)           ((n)==0 ? 0.5: ((n)==1 ? 2.0: ((n)==2 ? 8.0: 32.0)))
#define APLMT_HALUART_CALC_BAUD(baud,n)         (Apl8u)((Apl8u)((OPTION_APLMT_DEVICE_UART_BAUDRATE_CLOCK / (64.0 * APLMT_HALUART_CALC_DIVISOR(n) * (baud))) + 0.5) - 1)


/** Baud Rates */
#define APLMT_HALUARTA_BAUD_115200              (APLMT_HALUART_CALC_BAUD(115200UL,OPTION_APLMT_DEVICE_UARTA_BAUDRATE_DIVISOR))
#define APLMT_HALUARTA_BAUD_76800               (APLMT_HALUART_CALC_BAUD(76800UL,OPTION_APLMT_DEVICE_UARTA_BAUDRATE_DIVISOR))
#define APLMT_HALUARTA_BAUD_57600               (APLMT_HALUART_CALC_BAUD(57600UL,OPTION_APLMT_DEVICE_UARTA_BAUDRATE_DIVISOR))
#define APLMT_HALUARTA_BAUD_38400               (APLMT_HALUART_CALC_BAUD(38400UL,OPTION_APLMT_DEVICE_UARTA_BAUDRATE_DIVISOR))
#define APLMT_HALUARTA_BAUD_28800               (APLMT_HALUART_CALC_BAUD(28800U,OPTION_APLMT_DEVICE_UARTA_BAUDRATE_DIVISOR))
#define APLMT_HALUARTA_BAUD_19200               (APLMT_HALUART_CALC_BAUD(19200U,OPTION_APLMT_DEVICE_UARTA_BAUDRATE_DIVISOR))
#define APLMT_HALUARTA_BAUD_14400               (APLMT_HALUART_CALC_BAUD(14400,OPTION_APLMT_DEVICE_UARTA_BAUDRATE_DIVISOR))
#define APLMT_HALUARTA_BAUD_9600                (APLMT_HALUART_CALC_BAUD(9600,OPTION_APLMT_DEVICE_UARTA_BAUDRATE_DIVISOR))
#define APLMT_HALUARTA_BAUD_4800                (APLMT_HALUART_CALC_BAUD(4800,OPTION_APLMT_DEVICE_UARTA_BAUDRATE_DIVISOR))
#define APLMT_HALUARTA_BAUD_2400                (APLMT_HALUART_CALC_BAUD(2400,OPTION_APLMT_DEVICE_UARTA_BAUDRATE_DIVISOR))
#define APLMT_HALUARTA_BAUD_1200                (APLMT_HALUART_CALC_BAUD(1200,OPTION_APLMT_DEVICE_UARTA_BAUDRATE_DIVISOR))

/** Baud Rates */
#define APLMT_HALUARTB_BAUD_115200              (APLMT_HALUART_CALC_BAUD(115200UL,OPTION_APLMT_DEVICE_UARTB_BAUDRATE_DIVISOR))
#define APLMT_HALUARTB_BAUD_76800               (APLMT_HALUART_CALC_BAUD(76800UL,OPTION_APLMT_DEVICE_UARTB_BAUDRATE_DIVISOR))
#define APLMT_HALUARTB_BAUD_57600               (APLMT_HALUART_CALC_BAUD(57600UL,OPTION_APLMT_DEVICE_UARTB_BAUDRATE_DIVISOR))
#define APLMT_HALUARTB_BAUD_38400               (APLMT_HALUART_CALC_BAUD(38400UL,OPTION_APLMT_DEVICE_UARTB_BAUDRATE_DIVISOR))
#define APLMT_HALUARTB_BAUD_28800               (APLMT_HALUART_CALC_BAUD(28800U,OPTION_APLMT_DEVICE_UARTB_BAUDRATE_DIVISOR))
#define APLMT_HALUARTB_BAUD_19200               (APLMT_HALUART_CALC_BAUD(19200U,OPTION_APLMT_DEVICE_UARTB_BAUDRATE_DIVISOR))
#define APLMT_HALUARTB_BAUD_14400               (APLMT_HALUART_CALC_BAUD(14400,OPTION_APLMT_DEVICE_UARTB_BAUDRATE_DIVISOR))
#define APLMT_HALUARTB_BAUD_9600                (APLMT_HALUART_CALC_BAUD(9600,OPTION_APLMT_DEVICE_UARTB_BAUDRATE_DIVISOR))
#define APLMT_HALUARTB_BAUD_4800                (APLMT_HALUART_CALC_BAUD(4800,OPTION_APLMT_DEVICE_UARTB_BAUDRATE_DIVISOR))
#define APLMT_HALUARTB_BAUD_2400                (APLMT_HALUART_CALC_BAUD(2400,OPTION_APLMT_DEVICE_UARTB_BAUDRATE_DIVISOR))
#define APLMT_HALUARTB_BAUD_1200                (APLMT_HALUART_CALC_BAUD(1200,OPTION_APLMT_DEVICE_UARTB_BAUDRATE_DIVISOR))


/** Frame format.  The following constants can be bit-wised ORed
    to generate desired frame structure.
 */
#define APLMT_HALUART_PARITY_NONE               0x00
#define APLMT_HALUART_PARITY_EVEN               0x20
#define APLMT_HALUART_PARITY_ODD                0x30

#define APLMT_HALUART_DATABITS_8                0x00
#define APLMT_HALUART_DATABITS_7                0x40

#define APLMT_HALUART_STOPBITS_1                0x00
#define APLMT_HALUART_STOPBITS_2                0x08


/*-------------- PUBLIC/PUBLISHED API --------------------------------------*/
/** This method initializes the primary onboard uart with the specified 
    framing and baud rate.  This method disables, and leaves disabled, the
    transmitter, receiver, as well as all UART interrupts.
    NOTES:
        o This method MAY be called before and/or after the platform's
          kernel has been started.
        o This method can be called multiple times to reset/re-initialize
          the UART.
 */
void AplmtH8s2328_uartAInitBaudAndFrame( AplByte baudrate, AplByte frameConfig );

/** This method initializes the secondary onboard uart with the specified 
    framing and baud rate.  This method disables, and leaves disabled, the
    transmitter, receiver, as well as all UART interrupts.
    NOTES:
        o This method MAY be called before and/or after the platform's
          kernel has been started.
        o This method can be called multiple times to reset/re-initialize
          the UART.
 */
void AplmtH8s2328_uartBInitBaudAndFrame( AplByte baudrate, AplByte frameConfig );



#ifdef __cplusplus
}
#endif
/*--------------------------------------------------------------------------*/
#endif  /* end _aplmt_hardware_hitachi_h8s_2328_uart_initapi_h_ */
