Add debug helpers that communicate information via the LED.

Blink patterns and delay mechanisms allow for "easier" debugging using
just the onboard LED on the raspberry pi.
This commit is contained in:
Michael Lotz 2012-11-27 20:35:22 +01:00
parent 0d92f5576d
commit 57e6aff3f7
2 changed files with 118 additions and 0 deletions

View File

@ -0,0 +1,45 @@
/*
* Copyright 2012, Haiku Inc. All rights reserved.
* Distributed under the terms of the MIT License.
*/
#ifndef _PLATFORM_DEBUG_H_
#define _PLATFORM_DEBUG_H_
#define DEBUG_DELAY_SHORT 200
#define DEBUG_DELAY_MEDIUM 500
#define DEBUG_DELAY_LONG 1000
void debug_delay(int time);
void debug_set_led(bool on);
void debug_toggle_led(int count, int delay = DEBUG_DELAY_MEDIUM);
// Toggles the led count times with the delay for both on and off time.
void debug_blink_number(int number);
// Implements a blink pattern to output arbitrary numbers:
//
// 1. Led turns off and stays off for a long delay.
// 2. Led blinks x times with a short delay, where x is the current
// decimal place + 1 (so 0 values are easier to see).
// 3. Led stays off for a long delay to indicate the move to the next
// decimal place and step 2. is repeated until all the rest of the
// number is 0.
// 4. The led turns on and stays on with a long delay to indicate finish.
// 5. Led state is reset to the original value.
//
// The lowest decimal is output first, so the number will be reversed. As an
// example the number 205 would be blinked as follows:
// long off (start indicator), 6 blinks (indicating 5),
// long off (moving to next decimal), 1 blink (indicating 0)
// long off (moving to next decimal), 3 blinks (indicating 2)
// long on (finish indicator)
void debug_halt();
// Stalls execution in an endless loop.
void debug_assert(bool condition);
// Flashes the led 20 times rapidly and stalls execution if the condition
// isn't met.
#endif // _PLATFORM_DEBUG_H_

View File

@ -6,7 +6,9 @@
* All rights reserved. Distributed under the terms of the MIT License.
*/
#include "platform_debug.h"
#include "gpio.h"
#include "serial.h"
#include <boot/platform.h>
@ -14,6 +16,77 @@
#include <stdarg.h>
extern addr_t gPeripheralBase;
static bool sLedState = true;
void
debug_delay(int time)
{
for (; time >= 0; time--)
for (int i = 0; i < 10000; i++)
asm volatile ("nop");
}
void
debug_set_led(bool on)
{
gpio_write(gPeripheralBase + GPIO_BASE, 16, on ? 0 : 1);
sLedState = on;
}
void
debug_toggle_led(int count, int delay)
{
for (count *= 2; count > 0; count--) {
debug_set_led(!sLedState);
debug_delay(delay);
}
}
void
debug_blink_number(int number)
{
bool previousState = sLedState;
debug_set_led(false);
debug_delay(DEBUG_DELAY_LONG);
while (number > 0) {
debug_toggle_led(number % 10 + 1, DEBUG_DELAY_SHORT);
debug_delay(DEBUG_DELAY_LONG);
number /= 10;
}
debug_set_led(true);
debug_delay(DEBUG_DELAY_LONG);
debug_set_led(previousState);
}
void
debug_halt()
{
while (true)
debug_delay(DEBUG_DELAY_LONG);
}
void
debug_assert(bool condition)
{
if (condition)
return;
debug_toggle_led(20, 20);
debug_halt();
}
extern "C" void
panic(const char* format, ...)
{