#ifndef _aplmt_hardware_hitachi_h8300_3664_uart_initapi_h_
#define _aplmt_hardware_hitachi_h8300_3664_uart_initapi_h_
/*----------------------------------------------------------------------------
** SUMMARY: Hitachi-H8/3664 Hardware UARTs Initialization Interface (HWIUART)
**
** DESCRIPTION:
**  This file provides the initizaltion inteface(s) for the onboard UART(s)
**  SPECIFIC to Hitachi's H8/3664 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_UART_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_UART_BAUDRATE_DIVISOR)
#error The application must define, OPTION_APLMT_DEVICE_UART_BAUDRATE_CLOCK and OPTION_APLMT_DEVICE_UART_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_UART_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_UART_BAUDRATE_DIVISOR is the OSC divisor (in the
          SMR register). Its range is 0 to 3.
 */
#define APLMT_HALUART_CALC_n_DIVISOR            (OPTION_APLMT_DEVICE_UART_BAUDRATE_DIVISOR==0 ? 0.5: (OPTION_APLMT_DEVICE_UART_BAUDRATE_DIVISOR==1 ? 2.0: (OPTION_APLMT_DEVICE_UART_BAUDRATE_DIVISOR==2 ? 8.0: 32.0)))
#define APLMT_HALUART_CALC_BAUD(baud)           (Apl8u)((Apl8u)((OPTION_APLMT_DEVICE_UART_BAUDRATE_CLOCK / (64.0 * APLMT_HALUART_CALC_n_DIVISOR * (baud))) + 0.5) - 1)

/** Baud Rates */
#define APLMT_HALUART_BAUD_115200               (APLMT_HALUART_CALC_BAUD(115200UL))
#define APLMT_HALUART_BAUD_76800                (APLMT_HALUART_CALC_BAUD(76800UL))
#define APLMT_HALUART_BAUD_57600                (APLMT_HALUART_CALC_BAUD(57600UL))
#define APLMT_HALUART_BAUD_38400                (APLMT_HALUART_CALC_BAUD(38400UL))
#define APLMT_HALUART_BAUD_28800                (APLMT_HALUART_CALC_BAUD(28800U))
#define APLMT_HALUART_BAUD_19200                (APLMT_HALUART_CALC_BAUD(19200U))
#define APLMT_HALUART_BAUD_14400                (APLMT_HALUART_CALC_BAUD(14400))
#define APLMT_HALUART_BAUD_9600                 (APLMT_HALUART_CALC_BAUD(9600))
#define APLMT_HALUART_BAUD_4800                 (APLMT_HALUART_CALC_BAUD(4800))
#define APLMT_HALUART_BAUD_2400                 (APLMT_HALUART_CALC_BAUD(2400))
#define APLMT_HALUART_BAUD_1200                 (APLMT_HALUART_CALC_BAUD(1200))

/** 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 AplmtH8300_3664_uartAInitBaudAndFrame( AplByte baudrate, AplByte frameConfig );



#ifdef __cplusplus
}
#endif
/*--------------------------------------------------------------------------*/
#endif  /* end _aplmt_hardware_hitachi_h8300_3664_uart_initapi_h_ */
