API Reference¶
Note
Navigation: Home | Getting Started | Hardware | Software | Tutorials | Development | Troubleshooting
This section provides comprehensive documentation for KISS Fuzzer software interfaces and development APIs.
Design Philosophy¶
The KISS Fuzzer APIs are designed with the following principles:
Consistency: Function names clearly indicate their purpose and expected behavior Error Handling: All functions provide clear return values indicating success or failure conditions Non-blocking Operations: Long-running functions do not halt system operation Comprehensive Documentation: Every function, parameter, and return value is fully documented
Display System API¶
The display API provides control over the 240×64 OLED banner display for status information and user feedback.
Core Functions¶
Display Initialization
bool display_init(void);
Initializes the display subsystem and establishes I2C communication.
Returns: true if initialization successful, false if display hardware error
Text Output
void display_write_line(uint8_t line, const char* text, bool scroll);
Outputs text to specified display line with optional scrolling for long content.
Parameters:
line: Display line number (0-7, where 0 is top line)text: Null-terminated string to displayscroll: Enable horizontal scrolling for text longer than display width
Display Management
void display_clear(void);
void display_update(void);
Clear display buffer and force immediate display update respectively.
Usage Examples¶
// Initialize display system
if (!display_init()) {
printf("Display initialization failed\n");
return ERROR_DISPLAY;
}
// Display static status message
display_write_line(0, "KISS Fuzzer Ready", false);
// Display scrolling message for long text
display_write_line(1, "Scanning target device for JTAG interfaces", true);
JTAG Engine API¶
The JTAG API provides direct control over JTAG/SWD operations for device scanning and communication.
System Control¶
JTAG Initialization
bool jtag_init(void);
Initializes JTAG engine and configures PIO programs for timing-critical operations.
Returns: true if successful, false if PIO configuration failed
Device Scanning
bool jtag_scan_chain(jtag_scan_result_t* result);
Performs comprehensive scan of JTAG chain to identify connected devices.
Parameters:
result: Pointer to structure for storing scan results
Returns: true if scan completed, false if communication error
Returns: true if scan successful, false on error
jtag_memory_dump()¶
uint32_t jtag_memory_dump(uint32_t start_addr, uint32_t length, uint8_t* data);
Perform memory dump via JTAG interface.
Parameters:
start_addr: Starting memory addresslength: Number of bytes to dumpdata: Buffer to store dumped data
Returns: Number of bytes successfully dumped
Data Structures¶
jtag_device_t¶
typedef struct {
uint32_t idcode; // Device IDCODE
uint8_t ir_length; // IR length in bits
uint32_t manufacturer_id; // Manufacturer ID
uint32_t part_number; // Part number
uint32_t version; // Device version
char description[64]; // Human-readable description
} jtag_device_t;
jtag_scan_result_t¶
typedef struct {
uint8_t device_count; // Number of devices found
jtag_device_t devices[16]; // Device information
uint8_t total_ir_length; // Total IR chain length
bool chain_valid; // Chain integrity check
} jtag_scan_result_t;
Crash Detection API¶
The crash detection subsystem monitors for target faults (timeouts, TAP stuck, hardfault, heartbeat loss) and now supports intelligent crash deduplication, which ensures reporting and triage focus only on unique bug-triggering events.
Core Functions¶
Initialization
void crash_detection_init(void);
Initializes the crash detection system, resetting statistics and deduplication database.
Crash State Check
crash_type_t crash_detection_check(void);
Checks the target for crash conditions. Returns a crash_type_t value.
Crash Handling
void crash_detection_handle(crash_type_t type);
Handles a detected crash event, records deduplication, and attempts recovery or reset.
Intelligent Crash Deduplication¶
KISS implements intelligent crash deduplication as of v0.9.x. Each crash is fingerprinted using the program counter (PC) via JTAG/SWD. Only new, unseen PC values are treated as unique.
Deduplication API:
bool crash_signature_known(uint32_t pc);
void crash_signature_add(uint32_t pc);
Flow Example:
if (detected_crash) {
uint32_t pc = get_crash_pc(); // platform-specific PC retrieval
if (!crash_signature_known(pc)) {
crash_signature_add(pc);
// Log/report as a unique crash
} else {
// Handle as duplicate
}
}
Default deduplication buffer: 32 unique crash PCs (configurable ring buffer).
Crash Types¶
typedef enum {
CRASH_NONE, // No crash detected
CRASH_TIMEOUT, // Target not responsive
CRASH_HARDFAULT, // CPU in fault/reset handler
CRASH_NO_HEARTBEAT, // Heartbeat or polling failure
CRASH_TAP_STUCK // JTAG TAP stuck or unresponsive
} crash_type_t;
Example Command Handlers¶
cmd_result_t cmd_crash_check(int argc, char* argv[], char* response, size_t response_size);
cmd_result_t cmd_crash_handle(int argc, char* argv[], char* response, size_t response_size);
cmd_result_t cmd_crash_info (int argc, char* argv[], char* response, size_t response_size);
Power API¶
Functions¶
power_init()¶
bool power_init(void);
Initialize power monitoring system.
Returns: true if successful, false on error
power_get_battery_percent()¶
uint8_t power_get_battery_percent(void);
Get current battery charge percentage.
Returns: Battery percentage (0-100)
power_is_charging()¶
bool power_is_charging(void);
Check if device is currently charging.
Returns: true if charging, false otherwise
Storage API¶
Functions¶
storage_init()¶
bool storage_init(void);
Initialize SD card storage system.
Returns: true if successful, false on error
storage_write_log()¶
bool storage_write_log(uint32_t timestamp, const char* level, const char* message);
Write entry to log file.
Parameters:
timestamp: Log entry timestamplevel: Log level stringmessage: Log message
Returns: true if written successfully, false on error
Wi-Fi API¶
Functions¶
wifi_init()¶
bool wifi_init(void);
Initialize Wi-Fi module and start access point.
Returns: true if successful, false on error
wifi_start_ap()¶
bool wifi_start_ap(void);
Start Wi-Fi access point mode.
Returns: true if AP started successfully, false on error
REST API Endpoints¶
The web interface provides a REST API for remote control:
Status Endpoint¶
GET /api/status
Returns current system status in JSON format.
Response:
{
"battery_percent": 85,
"charging": false,
"wifi_connected": true,
"jtag_scanning": false,
"uptime_seconds": 3600
}
Scan Control¶
POST /api/scan/start
Content-Type: application/json
{
"frequency": 1000000,
"voltage": 3.3
}
Start JTAG scanning with specified parameters.
POST /api/scan/stop
Stop current JTAG scanning operation.
Log Access¶
GET /api/logs?lines=100&level=INFO
Retrieve recent log entries.
Parameters:
lines: Number of lines to return (default: 50)level: Minimum log level (DEBUG, INFO, WARN, ERROR)
File Operations¶
GET /api/files
List files on SD card.
GET /api/download/{filename}
Download a specific file from SD card.
Error Codes¶
Common Error Codes¶
typedef enum {
KISS_OK = 0, // Success
KISS_ERROR_INVALID_PARAM = -1, // Invalid parameter
KISS_ERROR_HARDWARE_FAULT = -2, // Hardware failure
KISS_ERROR_TIMEOUT = -3, // Operation timeout
KISS_ERROR_NO_MEMORY = -4, // Memory allocation failed
KISS_ERROR_NOT_INITIALIZED = -5, // Module not initialized
KISS_ERROR_BUSY = -6, // Resource busy
KISS_ERROR_NOT_SUPPORTED = -7 // Feature not supported
} kiss_error_t;
JTAG Specific Errors¶
typedef enum {
JTAG_ERROR_NO_DEVICES = -100, // No devices detected
JTAG_ERROR_CHAIN_BROKEN = -101, // JTAG chain integrity failure
JTAG_ERROR_IR_MISMATCH = -102, // IR length mismatch
JTAG_ERROR_UNKNOWN_DEVICE = -103 // Unrecognized device IDCODE
} jtag_error_t;
Configuration Constants¶
System Configuration¶
// Task priorities
#define SYSTEM_TASK_PRIORITY (tskIDLE_PRIORITY + 4)
#define WIFI_TASK_PRIORITY (tskIDLE_PRIORITY + 3)
#define JTAG_TASK_PRIORITY (tskIDLE_PRIORITY + 2)
#define UI_TASK_PRIORITY (tskIDLE_PRIORITY + 2)
#define POWER_TASK_PRIORITY (tskIDLE_PRIORITY + 1)
// Hardware pins
#define JTAG_TCK_PIN 16
#define JTAG_TMS_PIN 17
#define JTAG_TDI_PIN 18
#define JTAG_TDO_PIN 19
// Display configuration
#define DISPLAY_WIDTH 240
#define DISPLAY_HEIGHT 64
#define FONT_WIDTH 6
#define FONT_HEIGHT 8
Protocol Limits¶
// JTAG configuration
#define JTAG_MAX_FREQUENCY 10000000 // 10 MHz
#define JTAG_MIN_FREQUENCY 1000 // 1 kHz
#define JTAG_MAX_CHAIN_LENGTH 16 // Maximum devices
#define JTAG_MAX_IR_LENGTH 32 // Maximum IR bits
// Memory operations
#define MAX_DUMP_SIZE (1024*1024) // 1MB maximum dump
#define DUMP_BLOCK_SIZE 1024 // Read block size
Development & Testing¶
Building the Project¶
# Standard build
mkdir build && cd build
cmake ..
make
# Build with tests
mkdir build_test && cd build_test
cmake -DBUILD_TESTS=ON ..
make
ctest --output-on-failure
Running Tests¶
The project includes comprehensive unit and integration tests:
# Run all tests
make run_tests
# Run specific test suites
./test_display
./test_jtag
./test_power
./test_ui
./test_storage
Test Coverage¶
Unit Tests: Each module has dedicated unit tests
Integration Tests: End-to-end functionality testing
Mock Framework: Hardware abstraction for testing without physical hardware
Continuous Integration: Automated testing on code changes
Hardware Testing¶
Physical testing requires the KISS Fuzzer hardware:
# Flash to device
make flash
# Monitor debug output
minicom -D /dev/ttyACM0 -b 115200
# Access web interface
# Connect to "KISS-Fuzzer" Wi-Fi network
# Browse to http://192.168.4.1