Line 14... |
Line 14... |
#include "uart.h"
|
#include "uart.h"
|
|
|
static int led_status = 0;
|
static int led_status = 0;
|
static volatile int hashes_per_second = 0;
|
static volatile int hashes_per_second = 0;
|
|
|
void exception_handler(uint32_t cause, void * epc)
|
// Handle an exception/interrupt.
|
|
// Arguments:
|
|
// - cause: exception cause, see potato.h for values
|
|
// - epc: exception return address
|
|
// - regbase: base of the stored context, can be used for printing all
|
|
// registers with regbase[0] = x1 and upwards.
|
|
void exception_handler(uint32_t cause, void * epc, void * regbase)
|
|
{
|
|
if(cause == (CAUSE_IRQ_BASE + 5)) // Timer interrupt
|
{
|
{
|
uart_puts(IO_ADDRESS(UART_BASE), "Hashes per second: ");
|
uart_puts(IO_ADDRESS(UART_BASE), "Hashes per second: ");
|
uart_puth(IO_ADDRESS(UART_BASE), hashes_per_second);
|
uart_puth(IO_ADDRESS(UART_BASE), hashes_per_second);
|
uart_puts(IO_ADDRESS(UART_BASE), "\n\r");
|
uart_puts(IO_ADDRESS(UART_BASE), "\n\r");
|
|
|
Line 29... |
Line 37... |
} else {
|
} else {
|
gpio_set_output(IO_ADDRESS(GPIO2_BASE), 0);
|
gpio_set_output(IO_ADDRESS(GPIO2_BASE), 0);
|
led_status = 0;
|
led_status = 0;
|
}
|
}
|
|
|
timer_reset(IO_ADDRESS(TIMER_BASE));
|
|
hashes_per_second = 0;
|
hashes_per_second = 0;
|
|
timer_reset(IO_ADDRESS(TIMER_BASE));
|
|
} else {
|
|
uart_puts(IO_ADDRESS(UART_BASE), "Unhandled exception!\n\r");
|
|
uart_puts(IO_ADDRESS(UART_BASE), "Cause: ");
|
|
uart_puth(IO_ADDRESS(UART_BASE), cause);
|
|
uart_puts(IO_ADDRESS(UART_BASE), "\n\r");
|
|
uart_puts(IO_ADDRESS(UART_BASE), "EPC: ");
|
|
uart_puth(IO_ADDRESS(UART_BASE), (uint32_t) epc);
|
|
uart_puts(IO_ADDRESS(UART_BASE), "\n\r");
|
|
|
|
while(1) asm volatile("nop\n");
|
|
}
|
}
|
}
|
|
|
int main(void)
|
int main(void)
|
{
|
{
|
// Configure GPIOs:
|
// Configure GPIOs:
|
gpio_set_direction(IO_ADDRESS(GPIO1_BASE), 0x0000); // Switches
|
gpio_set_direction(IO_ADDRESS(GPIO1_BASE), 0x0000); // Switches
|
gpio_set_direction(IO_ADDRESS(GPIO2_BASE), 0xffff); // LEDs
|
gpio_set_direction(IO_ADDRESS(GPIO2_BASE), 0xffff); // LEDs
|
|
|
// Set up the timer:
|
// Set up the timer:
|
timer_set(IO_ADDRESS(TIMER_BASE), 50000000);
|
timer_set(IO_ADDRESS(TIMER_BASE), SYSTEM_CLK_FREQ);
|
|
|
// Print a startup message:
|
// Print a startup message:
|
uart_puts(IO_ADDRESS(UART_BASE), "The Potato Processor SHA256 Benchmark\n\r\n\r");
|
uart_puts(IO_ADDRESS(UART_BASE), "The Potato Processor SHA256 Benchmark\n\r\n\r");
|
|
|
// Enable interrupts:
|
// Enable interrupts:
|