#ifndef HOST_G4_WRAPPER
#define HOST_G4_WRAPPER
#include "device_registers.h"
#undef FLASH
#undef PWR
extern FLASH_TypeDef flash;
extern PWR_TypeDef pwr;
extern uint32_t SystemCoreClock;
#define FLASH (&flash)
#define PWR (&pwr)
#define __ISB() ((void)0)
#undef RCC
#undef GPIOA
#undef GPIOB
#undef GPIOF
#undef TIM1
#undef SPI2
extern RCC_TypeDef rcc;
extern GPIO_TypeDef ga,gb,gf;
extern TIM_TypeDef timer;
extern SPI_TypeDef spi;
#define RCC (&rcc)
#define GPIOA (&ga)
#define GPIOB (&gb)
#define GPIOF (&gf)
#define TIM1 (&timer)
#define SPI2 (&spi)
#ifdef HOST_INTEGRATED
void host_dsb(void);
void host_wait(void);
#define __DSB() host_dsb()
#define __WFI() host_wait()
#else
#define __DSB() ((void)0)
#endif

#undef ADC1
#undef ADC2
#undef ADC12_COMMON
extern ADC_TypeDef adc1,adc2;
extern ADC_Common_TypeDef adc_common;
#define ADC1 (&adc1)
#define ADC2 (&adc2)
#define ADC12_COMMON (&adc_common)

#undef TIM2
extern TIM_TypeDef timer2;
#define TIM2 (&timer2)
typedef struct {volatile uint32_t CTRL,LOAD,VAL,CALIB;} host_systick_type;
extern host_systick_type systick;
extern unsigned host_systick_config_calls;
#define SysTick (&systick)
#define SysTick_CTRL_ENABLE_Msk 1u
#define SysTick_CTRL_TICKINT_Msk 2u
#define SysTick_CTRL_CLKSOURCE_Msk 4u
#define SysTick_CTRL_COUNTFLAG_Msk (1u<<16)
static inline uint32_t SysTick_Config(uint32_t ticks){++host_systick_config_calls;if(ticks==0||ticks>0x1000000u)return 1;SysTick->LOAD=ticks-1;SysTick->VAL=0;SysTick->CTRL=7;return 0;}
#undef DMA1
#undef DMA1_Channel1
#undef DMAMUX1_Channel0
#undef DMAMUX1_ChannelStatus
extern DMA_TypeDef dma;
extern DMA_Channel_TypeDef dma_channel;
extern DMAMUX_Channel_TypeDef mux;
extern DMAMUX_ChannelStatus_TypeDef mux_status;
#define DMA1 (&dma)
#define DMA1_Channel1 (&dma_channel)
#define DMAMUX1_Channel0 (&mux)
#define DMAMUX1_ChannelStatus (&mux_status)
#ifdef HOST_INTEGRATED
#define __DMB() host_dsb()
#else
#define __DMB() ((void)0)
#endif
#endif
