/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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
 *
 *  http://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.
 */

#ifndef STM32_HAL_H
#define STM32_HAL_H

#ifdef __cplusplus
extern "C" {
#endif

#include <mcu/cortex_m0.h>

#include "stm32l0xx_hal.h"
#include "stm32l0xx_hal_def.h"

#include "stm32l0xx_mynewt_hal.h"

/* hal_watchdog */
#include "stm32l0xx_hal_iwdg.h"
#define STM32_HAL_WATCHDOG_CUSTOM_INIT(x)           \
    do {                                            \
        (x)->Init.Window = IWDG_WINDOW_DISABLE;     \
    } while (0)

/* hal_system_start */
    /* FIXME */
#define STM32_HAL_FLASH_REMAP()
#if 0
#define STM32_HAL_FLASH_REMAP()                  \
    do {                                         \
        SYSCFG->MEMRMP = 0;                      \
        __DSB();                                 \
    } while (0)
#endif

/* hal_spi */
#include "stm32l0xx.h"
#include "stm32l0xx_hal_dma.h"
#include "stm32l0xx_hal_spi.h"
#include "stm32l0xx_hal_gpio.h"
#include "stm32l0xx_hal_gpio_ex.h"
#include "stm32l0xx_hal_rcc.h"

struct stm32_hal_spi_cfg {
    int ss_pin;                     /* for slave mode */
    int sck_pin;
    int miso_pin;
    int mosi_pin;
    int irq_prio;
};

/* hal_i2c */
#include "stm32l0xx_hal_i2c.h"
#include "mcu/stm32l0xx_mynewt_hal.h"

/* hal_uart */
#include "stm32l0xx_hal_uart.h"
#include "mcu/stm32l0_bsp.h"

/* hal_timer */
#include "stm32l0xx_hal_tim.h"
#include "stm32l0xx_ll_bus.h"
#include "stm32l0xx_ll_tim.h"

#define STM32_HAL_TIMER_MAX     (3)

#ifdef __cplusplus
}
#endif

#endif /* STM32_HAL_H */
