/* =============================================================================
 * stm32f4xx_hal_conf.h - STM32CubeF4 HAL 설정 (STM32F407VGT6)
 *
 * ST 표준 템플릿을 본 프로젝트에서 실제로 쓰는 모듈만 남기도록 정리한 것.
 * 활성 모듈: RCC, GPIO, CORTEX, ETH, I2C, RNG, RTC, IWDG, UART, TIM, PWR,
 *            FLASH, DMA, EXTI.  (그 외 SPI/SDIO/CAN/USB/DAC/ADC 등은 비활성)
 *
 * 주의:
 *  - HSE_VALUE = 8MHz. TODO(hw): 보드 크리스털 실제 값 확인(STM32F4-DISCO 는
 *    8MHz, 커스텀 보드면 25MHz 등일 수 있음). 잘못되면 클럭 전부 어긋남.
 *  - TICK_INT_PRIORITY: HAL 타임베이스(TIM6, bsp 의 HAL_InitTick override)용
 *    인터럽트 우선순위. FreeRTOS MAX_SYSCALL(=5) 이하 선점도(숫자 ≥ 5)여야
 *    *FromISR 충돌이 없다. 여기서는 15(가장 낮음) -> 안전.
 *  - USE_RTOS 매크로는 ST 권고에 따라 0 으로 둔다(HAL 내부 RTOS 잠금 비활성;
 *    동기화는 애플리케이션이 FreeRTOS 객체로 직접 처리).
 * ===========================================================================*/
#ifndef STM32F4xx_HAL_CONF_H
#define STM32F4xx_HAL_CONF_H

#ifdef __cplusplus
extern "C" {
#endif

/* =============================================================================
 * 1) 활성화할 HAL 모듈
 * ===========================================================================*/
#define HAL_MODULE_ENABLED
#define HAL_CORTEX_MODULE_ENABLED
#define HAL_RCC_MODULE_ENABLED
#define HAL_GPIO_MODULE_ENABLED
#define HAL_EXTI_MODULE_ENABLED
#define HAL_DMA_MODULE_ENABLED
#define HAL_FLASH_MODULE_ENABLED
#define HAL_PWR_MODULE_ENABLED
#define HAL_ETH_MODULE_ENABLED
#define HAL_I2C_MODULE_ENABLED
#define HAL_RNG_MODULE_ENABLED
#define HAL_RTC_MODULE_ENABLED
#define HAL_IWDG_MODULE_ENABLED
#define HAL_UART_MODULE_ENABLED
#define HAL_TIM_MODULE_ENABLED

/* 명시적으로 비활성(템플릿 흔적 제거 — 참고용 주석)
 * #define HAL_ADC_MODULE_ENABLED
 * #define HAL_CAN_MODULE_ENABLED
 * #define HAL_CRC_MODULE_ENABLED
 * #define HAL_DAC_MODULE_ENABLED
 * #define HAL_DCMI_MODULE_ENABLED      (카메라 기능 DROP)
 * #define HAL_SD_MODULE_ENABLED
 * #define HAL_SPI_MODULE_ENABLED
 * #define HAL_USART_MODULE_ENABLED     (UART 모듈로 충분)
 * #define HAL_PCD_MODULE_ENABLED       (USB 미사용)
 * #define HAL_WWDG_MODULE_ENABLED      (IWDG 사용)
 */

/* =============================================================================
 * 2) 발진기(Oscillator) 값
 * ===========================================================================*/
#if !defined  (HSE_VALUE)
  #define HSE_VALUE    8000000U   /* TODO(hw): 외부 HSE 크리스털 실제 주파수(Hz) */
#endif
#if !defined  (HSE_STARTUP_TIMEOUT)
  #define HSE_STARTUP_TIMEOUT    100U   /* ms */
#endif

#if !defined  (HSI_VALUE)
  #define HSI_VALUE    16000000U  /* 내부 RC 16MHz */
#endif

#if !defined  (LSI_VALUE)
  #define LSI_VALUE    32000U     /* IWDG/RTC 용 내부 저속 RC (~32kHz, 오차 큼) */
#endif

#if !defined  (LSE_VALUE)
  #define LSE_VALUE    32768U     /* TODO(hw): RTC 외부 32.768kHz 크리스털 유무 */
#endif
#if !defined  (LSE_STARTUP_TIMEOUT)
  #define LSE_STARTUP_TIMEOUT    5000U
#endif

#if !defined  (EXTERNAL_CLOCK_VALUE)
  #define EXTERNAL_CLOCK_VALUE   12288000U  /* I2S 등 미사용 — 템플릿 기본 */
#endif

/* =============================================================================
 * 3) 시스템 설정
 * ===========================================================================*/
#define  VDD_VALUE                    3300U   /* mV */
#define  TICK_INT_PRIORITY            15U     /* HAL 타임베이스(TIM6) IRQ 우선순위
                                                 (가장 낮은 선점도 -> RTOS 안전) */
#define  USE_RTOS                     0U
#define  PREFETCH_ENABLE              1U
#define  INSTRUCTION_CACHE_ENABLE     1U
#define  DATA_CACHE_ENABLE            1U

/* assert_param: 운영 빌드에서는 끈다(USE_FULL_ASSERT 정의 시 활성). */
/* #define USE_FULL_ASSERT    1U */

#define USE_HAL_ETH_REGISTER_CALLBACKS    0U
#define USE_HAL_I2C_REGISTER_CALLBACKS    0U
#define USE_HAL_RNG_REGISTER_CALLBACKS    0U
#define USE_HAL_RTC_REGISTER_CALLBACKS    0U
#define USE_HAL_TIM_REGISTER_CALLBACKS    0U
#define USE_HAL_UART_REGISTER_CALLBACKS   0U

/* =============================================================================
 * 4) Ethernet (LAN8720 PHY / RMII) 파라미터
 *    LwIP 와 stm32f4xx_hal_eth.c 가 참조한다.
 * ===========================================================================*/
/* RMII 모드는 25MHz REF_CLK 가 PHY/MCO 로 공급된다고 가정. */
#define ETH_TX_DESC_CNT         4U   /* 송신 DMA 디스크립터 개수 */
#define ETH_RX_DESC_CNT         4U   /* 수신 DMA 디스크립터 개수 */

/* LAN8720 PHY 주소. TODO(hw): 보드 스트랩 핀에 따라 0 또는 1. */
#define LAN8742_PHY_ADDRESS     0x00U   /* CubeF4 ETH 코드가 참조하는 매크로 */

/* MAC 주소 (locally-administered, 02:xx). TODO(hw): 노드별 고유값으로 교체. */
#define MAC_ADDR0   0x02U
#define MAC_ADDR1   0x00U
#define MAC_ADDR2   0x00U
#define MAC_ADDR3   0x00U
#define MAC_ADDR4   0x00U
#define MAC_ADDR5   0x01U

/* =============================================================================
 * 5) SysTick 관련 — FreeRTOS 가 SysTick 을 점유하므로 HAL 은 TIM6 타임베이스.
 *    (bsp.c 가 HAL_InitTick() 을 weak override 한다. 여기서는 별도 정의 없음.)
 * ===========================================================================*/

/* =============================================================================
 * 6) 모듈별 헤더 인클루드 (활성 모듈만)
 * ===========================================================================*/
#ifdef HAL_RCC_MODULE_ENABLED
  #include "stm32f4xx_hal_rcc.h"
#endif
#ifdef HAL_GPIO_MODULE_ENABLED
  #include "stm32f4xx_hal_gpio.h"
#endif
#ifdef HAL_EXTI_MODULE_ENABLED
  #include "stm32f4xx_hal_exti.h"
#endif
#ifdef HAL_DMA_MODULE_ENABLED
  #include "stm32f4xx_hal_dma.h"
#endif
#ifdef HAL_CORTEX_MODULE_ENABLED
  #include "stm32f4xx_hal_cortex.h"
#endif
#ifdef HAL_FLASH_MODULE_ENABLED
  #include "stm32f4xx_hal_flash.h"
#endif
#ifdef HAL_PWR_MODULE_ENABLED
  #include "stm32f4xx_hal_pwr.h"
#endif
#ifdef HAL_ETH_MODULE_ENABLED
  #include "stm32f4xx_hal_eth.h"
#endif
#ifdef HAL_I2C_MODULE_ENABLED
  #include "stm32f4xx_hal_i2c.h"
#endif
#ifdef HAL_RNG_MODULE_ENABLED
  #include "stm32f4xx_hal_rng.h"
#endif
#ifdef HAL_RTC_MODULE_ENABLED
  #include "stm32f4xx_hal_rtc.h"
#endif
#ifdef HAL_IWDG_MODULE_ENABLED
  #include "stm32f4xx_hal_iwdg.h"
#endif
#ifdef HAL_UART_MODULE_ENABLED
  #include "stm32f4xx_hal_uart.h"
#endif
#ifdef HAL_TIM_MODULE_ENABLED
  #include "stm32f4xx_hal_tim.h"
#endif

/* =============================================================================
 * 7) assert_param
 * ===========================================================================*/
#ifdef  USE_FULL_ASSERT
  #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__))
  void assert_failed(uint8_t *file, uint32_t line);
#else
  #define assert_param(expr) ((void)0U)
#endif

#ifdef __cplusplus
}
#endif

#endif /* STM32F4xx_HAL_CONF_H */
