**Raw HAL**
```rust
let peripherals = esp_hal::init(
Config::default()
);
let mut led = Output::new(
peripherals.GPIO3,
Level::Low,
OutputConfig::default(),
);
led.set_high();
```
**uFerris BSP**
```rust
let peripherals = esp_hal::init(
Config::default()
);
let mut uferris = uferris_init(peripherals);
uferris.led1_on();
```
---
## It's Not Magic
The BSP is just Rust code that does exactly what you've been doing — but packages it up with meaningful names. Open the source and you'll see `Output::new()`, `I2c::new()`, and all the same patterns.
- **No pin lookup errors** — the board knows its own pin assignments
- **Sensible defaults** — configurations chosen for the specific board's hardware
- **Convenience** — less boilerplate for common setups