Adds the GWM brand (Haval H6 2019-26, full ACC/steering support):
- opendbc/car/gwm: brand interface, carstate, carcontroller, gwmcan, values
(adapted to sunnypilot CP_SP API and deprecated field group)
- car.capnp: SafetyModel.gwm @36
- values.py: GWM in the Platform union
- docs_definitions.py: CarHarness.gwm
- safety: gwm.h, SAFETY_GWM 36, registration (behind ALLOW_DEBUG)
- dbc generator for gwm_haval_h6_mk3, torque params for GWM_HAVAL_H6
- car_list.json: Haval H6 now appears in the vehicle selector
- rebuilt panda firmware with the GWM safety mode (DEV-dc833705)
Adds the MG brand (MG 5 EV 2021, dashcam-only) to c3xl-dev's opendbc:
- opendbc/car/mg: brand interface, carstate, carcontroller, mgcan, values
- car.capnp: SafetyModel.mg @35
- values.py: MG in the Platform union
- safety: mg.h, SAFETY_MG 35, registration (behind ALLOW_DEBUG)
- dbc/mg.dbc, torque override for MG_5_EV
- car_list.json: include dashcam-only platforms so MG appears in the
vehicle selector
- rebuilt panda firmware with the MG safety mode (DEV-a53d9321)
The SPI panda boot loop called recover_internal_panda() whenever the panda
did not appear within 20s after a reset. recover() erases both the bootstub
and app sectors (dfu.py program_bootstub erases sectors 0+1) before
reflashing, so a working panda that booted slowly lost its app firmware.
Fix:
- pandad.py: wait up to 60s for the panda, retry the normal reset 3x, and
only enter the ROM bootloader (recover) when the panda is confirmed in DFU
or all normal resets failed - preserving provisioning of blank boards.
- hardware.py: align recover_internal_panda() timing with the working manual
flash scripts (0.2s reset hold, 1s settle, keep BOOT0 high).
- spi.py: raise the SPI bootloader ack timeout from 0.01s to 0.1s so the DFU
flash reliably succeeds instead of erasing then failing.
FrogPilot handles the GM SystemPowerMode message on both bus 0 and bus 2
(SDGM cars send it on bus 2). C3XL-dev only checked bus 0, so GM cars with
0x1F1 on bus 2 never set ignition_can and the device would not auto power-on.
Mirror FrogPilot: check 0x1F1 on bus 2 as well, keep other exceptions bus-0 only.