#include "lamp_i2c_pins.h"
#include "stm32g0xx.h"
static bool initialized;
#define GROUP ((1u<<3)|(1u<<4)|(1u<<5)|(1u<<6)|(1u<<7)|(1u<<8))
#define SELECTED ((1u<<6)|(1u<<7))
#define MODES ((3u<<6)|(3u<<8)|(3u<<10)|(3u<<12)|(3u<<14)|(3u<<16))
#define EXPECTED ((3u<<6)|(3u<<8)|(3u<<10)|(2u<<12)|(2u<<14)|(3u<<16))
static bool locked(void){return (GPIOB->LCKR&(1u<<16))!=0u && (GPIOB->LCKR&GROUP)!=0u;}
bool lamp_i2c_pins_available(void){
    return initialized && (RCC->IOPENR&RCC_IOPENR_GPIOBEN)!=0u &&
        (RCC->APBENR1&RCC_APBENR1_I2C1EN)!=0u && !locked() &&
        (GPIOB->MODER&MODES)==EXPECTED && (GPIOB->PUPDR&MODES)==0u &&
        (GPIOB->OTYPER&SELECTED)==SELECTED &&
        (GPIOB->AFR[0]&0xfffff000u)==0x55000000u &&
        (GPIOB->AFR[1]&15u)==0u;
}
bool lamp_i2c_pins_init(void){
    initialized=false;
    RCC->IOPENR|=RCC_IOPENR_GPIOBEN;(void)RCC->IOPENR;
    RCC->APBENR1|=RCC_APBENR1_I2C1EN;(void)RCC->APBENR1;
    if(locked() || (I2C1->CR1&I2C_CR1_PE)!=0u)return false;
    /* Neutralize ALL internal drivers before configuring either bonded pad. */
    GPIOB->MODER|=MODES;
    GPIOB->PUPDR&=~MODES;
    GPIOB->AFR[0]=(GPIOB->AFR[0]&~0xfffff000u)|0x55000000u;
    GPIOB->AFR[1]&=~15u;
    GPIOB->BSRR=SELECTED;
    GPIOB->OTYPER|=SELECTED;
    GPIOB->OSPEEDR&=~MODES;
    __DSB();
    GPIOB->MODER=(GPIOB->MODER&~MODES)|EXPECTED;
    __DSB();
    initialized=true;
    if(!lamp_i2c_pins_available()){initialized=false;return false;}
    return true;
}
