283 lines
7.3 KiB
Markdown
283 lines
7.3 KiB
Markdown
# ESP32-S3 BMC Firmware
|
|
|
|
A Baseboard Management Controller (BMC) firmware for ESP32-S3 that provides remote management capabilities for external boards via Ethernet.
|
|
|
|
## Features
|
|
|
|
- **Ethernet Connectivity**: W5500 SPI Ethernet module support
|
|
- **GPIO Control**: 16 GPIO pins for power control, status monitoring, and user functions
|
|
- **Serial Console**: UART bridge with WebSocket support for remote console access
|
|
- **Web Interface**: Modern HTML/CSS dashboard for easy management
|
|
- **REST API**: Full REST API for programmatic control
|
|
|
|
## Hardware Requirements
|
|
|
|
- ESP32-S3 development board
|
|
- W5500 SPI Ethernet module
|
|
- Target board to manage
|
|
|
|
### Pin Connections
|
|
|
|
#### W5500 SPI Ethernet
|
|
| ESP32-S3 | W5500 |
|
|
|----------|-------|
|
|
| GPIO 11 | MOSI |
|
|
| GPIO 13 | MISO |
|
|
| GPIO 12 | SCLK |
|
|
| GPIO 10 | CS |
|
|
| GPIO 9 | RST |
|
|
| GPIO 14 | INT |
|
|
|
|
#### UART Serial
|
|
| ESP32-S3 | Target Board |
|
|
|----------|--------------|
|
|
| GPIO 43 | TX |
|
|
| GPIO 44 | RX |
|
|
|
|
#### BMC GPIOs
|
|
| GPIO | Name | Description |
|
|
|------|------|-------------|
|
|
| 4 | POWER_ON | Power control output |
|
|
| 5 | POWER_OFF | Power control output |
|
|
| 6 | RESET | Reset control (active-low) |
|
|
| 7 | STATUS_LED | Status LED |
|
|
| 15 | PWR_GOOD | Power good input |
|
|
| 16 | TEMP_ALERT | Temperature alert input |
|
|
| 17 | FAN_CTRL | Fan control PWM |
|
|
| 18-25 | USER_1-8 | User configurable GPIOs |
|
|
| 35-38 | USER_5-8 | Input-only GPIOs |
|
|
|
|
## Building
|
|
|
|
### Prerequisites
|
|
|
|
- ESP-IDF v5.0 or later
|
|
- Python 3.8+
|
|
- CMake 3.16+
|
|
|
|
### Setup ESP-IDF
|
|
|
|
```bash
|
|
# Install ESP-IDF (if not already installed)
|
|
git clone --recursive https://github.com/espressif/esp-idf.git
|
|
cd esp-idf
|
|
./install.sh esp32s3
|
|
source export.sh
|
|
```
|
|
|
|
### Build and Flash
|
|
|
|
```bash
|
|
# Navigate to project directory
|
|
cd esp32-bmc
|
|
|
|
# Configure the project (optional)
|
|
idf.py menuconfig
|
|
|
|
# Build
|
|
idf.py build
|
|
|
|
# Flash to ESP32-S3
|
|
idf.py -p /dev/ttyUSB0 flash
|
|
|
|
# Monitor serial output
|
|
idf.py -p /dev/ttyUSB0 monitor
|
|
```
|
|
|
|
## Configuration
|
|
|
|
### Network Settings
|
|
|
|
By default, the firmware uses DHCP. To configure static IP:
|
|
|
|
1. Run `idf.py menuconfig`
|
|
2. Navigate to "BMC Configuration"
|
|
3. Disable "Use DHCP" and set static IP, netmask, and gateway
|
|
|
|
Or use the REST API to change network settings at runtime.
|
|
|
|
### GPIO Configuration
|
|
|
|
GPIO pins can be configured in `main/config.h`. Modify the `bmc_gpio_defaults` array to change pin assignments, names, and default modes.
|
|
|
|
## REST API
|
|
|
|
### GPIO Endpoints
|
|
|
|
| Method | Endpoint | Description |
|
|
|--------|----------|-------------|
|
|
| GET | `/api/gpio` | Get all GPIO states |
|
|
| POST | `/api/gpio/set?pin=X` | Set GPIO value (body: `{"value": 0/1}`) |
|
|
| PUT | `/api/gpio/config?pin=X` | Configure GPIO mode (body: `{"mode": "input/output"}`) |
|
|
|
|
### Power Control Endpoints
|
|
|
|
| Method | Endpoint | Description |
|
|
|--------|----------|-------------|
|
|
| GET | `/api/power/status` | Get power status |
|
|
| POST | `/api/power/on` | Turn board power on |
|
|
| POST | `/api/power/off` | Turn board power off |
|
|
| POST | `/api/power/reset` | Reset the board |
|
|
|
|
### Serial Endpoints
|
|
|
|
| Method | Endpoint | Description |
|
|
|--------|----------|-------------|
|
|
| GET | `/api/serial/config` | Get serial configuration |
|
|
| PUT | `/api/serial/config` | Set serial configuration |
|
|
| POST | `/api/serial/send` | Send data to serial |
|
|
| GET | `/api/serial/ws` | WebSocket for serial console |
|
|
|
|
### System Endpoints
|
|
|
|
| Method | Endpoint | Description |
|
|
|--------|----------|-------------|
|
|
| GET | `/api/system/info` | Get system information |
|
|
| GET | `/api/system/status` | Get BMC status |
|
|
|
|
### OTA Endpoints
|
|
|
|
| Method | Endpoint | Description |
|
|
|--------|----------|-------------|
|
|
| GET | `/api/ota/status` | Get OTA status and running partition |
|
|
| POST | `/api/ota/update` | Start OTA update from URL |
|
|
| POST | `/api/ota/upload` | Upload firmware file directly |
|
|
|
|
## Web Interface
|
|
|
|
Access the web interface by navigating to `http://<ip-address>/` in your browser.
|
|
|
|
Features:
|
|
- Power control panel with on/off/reset buttons
|
|
- Real-time GPIO monitoring
|
|
- Serial console with WebSocket support
|
|
- System information display
|
|
- OTA firmware update
|
|
|
|
## Example Usage
|
|
|
|
### Power On
|
|
|
|
```bash
|
|
curl -X POST http://192.168.1.100/api/power/on
|
|
```
|
|
|
|
### Set GPIO
|
|
|
|
```bash
|
|
curl -X POST "http://192.168.1.100/api/gpio/set?pin=18" \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"value": 1}'
|
|
```
|
|
|
|
### Get System Info
|
|
|
|
```bash
|
|
curl http://192.168.1.100/api/system/info
|
|
```
|
|
|
|
### Serial Console via WebSocket
|
|
|
|
```javascript
|
|
const ws = new WebSocket('ws://192.168.1.100/api/serial/ws');
|
|
ws.onmessage = (event) => console.log(event.data);
|
|
ws.send('command\n');
|
|
```
|
|
|
|
### OTA Firmware Update
|
|
|
|
```bash
|
|
# Check OTA status
|
|
curl http://192.168.1.100/api/ota/status
|
|
|
|
# Start OTA update from URL
|
|
curl -X POST http://192.168.1.100/api/ota/update \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"url": "http://server/firmware.bin"}'
|
|
|
|
# Upload firmware file directly
|
|
curl -X POST http://192.168.1.100/api/ota/upload \
|
|
-F "firmware=@firmware.bin"
|
|
```
|
|
|
|
The web interface also supports drag-and-drop firmware upload - simply drag a `.bin` file onto the upload zone.
|
|
|
|
## Project Structure
|
|
|
|
```
|
|
esp32-bmc/
|
|
├── CMakeLists.txt # Project CMake configuration
|
|
├── partitions.csv # Partition table for OTA
|
|
├── sdkconfig.defaults # Default SDK configuration
|
|
├── .clang-format # Code formatter configuration
|
|
├── main/
|
|
│ ├── CMakeLists.txt # Main component CMake
|
|
│ ├── main.c # Application entry point
|
|
│ ├── config.h # Pin definitions and settings
|
|
│ ├── gpio_controller.c/h # GPIO management
|
|
│ ├── uart_handler.c/h # UART serial communication
|
|
│ ├── ethernet_manager.c/h # W5500 Ethernet setup
|
|
│ ├── web_server.c/h # HTTP server and routes
|
|
│ ├── ota_handler.c/h # OTA update handling
|
|
│ └── html/
|
|
│ └── index.html # Web interface
|
|
└── README.md
|
|
```
|
|
|
|
## Code Quality Tools
|
|
|
|
This project uses clang-format for code formatting.
|
|
|
|
### clang-format
|
|
|
|
Format all C source files:
|
|
|
|
```bash
|
|
# Format all files in-place
|
|
find main -name "*.c" -o -name "*.h" | xargs clang-format -i
|
|
|
|
# Format a specific file
|
|
clang-format -i main/web_server.c
|
|
|
|
# Check formatting without modifying (dry run)
|
|
clang-format --dry-run --Werror main/web_server.c
|
|
```
|
|
|
|
### VS Code Integration
|
|
|
|
The project includes VS Code settings for automatic formatting on save. Install the following extensions:
|
|
- **C/C++** (ms-vscode.cpptools) - IntelliSense and debugging
|
|
- **clang-format** (xaver.clang-format) - Code formatting
|
|
- **ESP-IDF** (espressif.esp-idf-extension) - ESP-IDF development
|
|
|
|
With these extensions installed, code will be automatically formatted when you save files.
|
|
|
|
## Troubleshooting
|
|
|
|
### Ethernet Not Connecting
|
|
|
|
1. Check W5500 module connections
|
|
2. Verify SPI pins are correct
|
|
3. Check Ethernet cable and link lights
|
|
4. Monitor serial output for error messages
|
|
|
|
### GPIO Not Working
|
|
|
|
1. Verify pin is not input-only (GPIO 35-38 on ESP32-S3)
|
|
2. Check pin is not already used by Ethernet or UART
|
|
3. Ensure proper GPIO mode is set
|
|
|
|
### Serial Console Issues
|
|
|
|
1. Verify UART TX/RX connections
|
|
2. Check baud rate matches target board
|
|
3. Ensure WebSocket connection is established
|
|
|
|
## License
|
|
|
|
MIT License
|
|
|
|
## Contributing
|
|
|
|
Contributions are welcome! Please submit pull requests or open issues for any improvements.
|