#include "stm32g4xx.h"
#include <assert.h>
#include <stdio.h>
#include <string.h>
void drill_safe_boot(void);
RCC_TypeDef host_rcc;
GPIO_TypeDef host_gpio_a,host_gpio_b,host_gpio_c;
static void check(GPIO_TypeDef *p,unsigned pin,unsigned high) {
 unsigned b=1u<<pin;
 assert(((p->MODER>>(2*pin))&3)==1);
 assert((p->OTYPER&b)==0);
 assert(((p->OSPEEDR>>(2*pin))&3)==0);
 assert(((p->PUPDR>>(2*pin))&3)==0);
 assert((p->BSRR&(high?b:b<<16))!=0);
 assert((p->BSRR&(high?b<<16:b))==0);
}
int main(void) {
 for(unsigned prior=0;prior<2;prior++) {
  memset(&host_rcc,0,sizeof host_rcc);
  memset(&host_gpio_a,prior?255:0,sizeof host_gpio_a);
  memset(&host_gpio_b,prior?255:0,sizeof host_gpio_b);
  memset(&host_gpio_c,prior?255:0,sizeof host_gpio_c);
  unsigned a=host_gpio_a.MODER,b=host_gpio_b.MODER,c=host_gpio_c.MODER;
  drill_safe_boot();
  /* Independent expected physical pins from netlist and DS12589 LQFP48. */
  check(&host_gpio_a,5,0); /* U1pin13 RUN request to connector10 */
  check(&host_gpio_c,14,0); /* U1pin3 sleep to connector9 */
  check(&host_gpio_a,8,0);check(&host_gpio_a,9,0);check(&host_gpio_a,10,0);
  check(&host_gpio_a,7,0);check(&host_gpio_b,0,0);check(&host_gpio_b,1,0);
  check(&host_gpio_a,12,1); /* U1pin34 charger enable_N default disabled */
  assert((host_rcc.AHB2ENR&(RCC_AHB2ENR_GPIOAEN|RCC_AHB2ENR_GPIOBEN|RCC_AHB2ENR_GPIOCEN))==(RCC_AHB2ENR_GPIOAEN|RCC_AHB2ENR_GPIOBEN|RCC_AHB2ENR_GPIOCEN));
  unsigned am=(3u<<10)|(3u<<14)|(3u<<16)|(3u<<18)|(3u<<20)|(3u<<24);
  unsigned bm=3u|(3u<<2),cm=3u<<28;
  assert((host_gpio_a.MODER&~am)==(a&~am));assert((host_gpio_b.MODER&~bm)==(b&~bm));assert((host_gpio_c.MODER&~cm)==(c&~cm));
 }
 puts("PASS: actual drill_safe_boot writes physical RUN/sleep/PWM-off and charger-disable pins from both prior register states; unrelated GPIO modes preserved. No physical voltages measured.");
}
