forked from YosysHQ/picorv32
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
f0b824a
commit d433149
Showing
7 changed files
with
203 additions
and
158 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,5 +1,5 @@ | ||
/tests/*.o | ||
/firmware/start.o | ||
/firmware/*.o | ||
/firmware/firmware.bin | ||
/firmware/firmware.elf | ||
/firmware/firmware.hex | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
#ifndef FIRMWARE_H | ||
#define FIRMWARE_H | ||
|
||
#include <stdint.h> | ||
#include <stdbool.h> | ||
|
||
// irq.c | ||
uint32_t *irq(uint32_t *regs, uint32_t irqs); | ||
|
||
// print.c | ||
void print_chr(char ch); | ||
void print_str(const char *p); | ||
void print_dec(int val); | ||
void print_hex(unsigned int val); | ||
|
||
// sieve.c | ||
void sieve(); | ||
|
||
// stats.c | ||
void stats(); | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,111 @@ | ||
|
||
#include "firmware.h" | ||
|
||
uint32_t *irq(uint32_t *regs, uint32_t irqs) | ||
{ | ||
static int ext_irq_4_count = 0; | ||
static int ext_irq_5_count = 0; | ||
static int timer_irq_count = 0; | ||
|
||
if ((irqs & (1<<4)) != 0) { | ||
ext_irq_4_count++; | ||
// print_str("[EXT-IRQ-4]"); | ||
} | ||
|
||
if ((irqs & (1<<5)) != 0) { | ||
ext_irq_5_count++; | ||
// print_str("[EXT-IRQ-5]"); | ||
} | ||
|
||
if ((irqs & 1) != 0) { | ||
timer_irq_count++; | ||
// print_str("[TIMER-IRQ]"); | ||
} | ||
|
||
if ((irqs & 6) != 0) | ||
{ | ||
int i, k; | ||
uint32_t pc = regs[0] - 4; | ||
uint32_t instr = *(uint32_t*)pc; | ||
|
||
print_str("\n"); | ||
print_str("------------------------------------------------------------\n"); | ||
|
||
if ((irqs & 2) != 0) { | ||
if (instr == 0x00100073) { | ||
print_str("SBREAK instruction at 0x"); | ||
print_hex(pc); | ||
print_str("\n"); | ||
} else { | ||
print_str("Illegal Instruction at 0x"); | ||
print_hex(pc); | ||
print_str(": 0x"); | ||
print_hex(instr); | ||
print_str("\n"); | ||
} | ||
} | ||
|
||
if ((irqs & 4) != 0) { | ||
print_str("Bus error in Instruction at 0x"); | ||
print_hex(pc); | ||
print_str(": 0x"); | ||
print_hex(instr); | ||
print_str("\n"); | ||
} | ||
|
||
for (i = 0; i < 8; i++) | ||
for (k = 0; k < 4; k++) | ||
{ | ||
int r = i + k*8; | ||
|
||
if (r == 0) { | ||
print_str("pc "); | ||
} else | ||
if (r < 10) { | ||
print_chr('x'); | ||
print_chr('0' + r); | ||
print_chr(' '); | ||
print_chr(' '); | ||
} else | ||
if (r < 20) { | ||
print_chr('x'); | ||
print_chr('1'); | ||
print_chr('0' + r - 10); | ||
print_chr(' '); | ||
} else | ||
if (r < 30) { | ||
print_chr('x'); | ||
print_chr('2'); | ||
print_chr('0' + r - 20); | ||
print_chr(' '); | ||
} else { | ||
print_chr('x'); | ||
print_chr('3'); | ||
print_chr('0' + r - 30); | ||
print_chr(' '); | ||
} | ||
|
||
print_hex(regs[r]); | ||
print_str(k == 3 ? "\n" : " "); | ||
} | ||
|
||
print_str("------------------------------------------------------------\n"); | ||
|
||
print_str("Number of fast external IRQs counted: "); | ||
print_dec(ext_irq_4_count); | ||
print_str("\n"); | ||
|
||
print_str("Number of slow external IRQs counted: "); | ||
print_dec(ext_irq_5_count); | ||
print_str("\n"); | ||
|
||
print_str("Number of timer IRQs counted: "); | ||
print_dec(timer_irq_count); | ||
print_str("\n"); | ||
|
||
__asm__("sbreak"); | ||
} | ||
|
||
return regs; | ||
} | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
|
||
#include "firmware.h" | ||
|
||
#define OUTPORT 0x10000000 | ||
|
||
void print_chr(char ch) | ||
{ | ||
*((volatile uint32_t*)OUTPORT) = ch; | ||
} | ||
|
||
void print_str(const char *p) | ||
{ | ||
while (*p != 0) | ||
*((volatile uint32_t*)OUTPORT) = *(p++); | ||
} | ||
|
||
void print_dec(int val) | ||
{ | ||
char buffer[10]; | ||
char *p = buffer; | ||
while (val || p == buffer) { | ||
*(p++) = val % 10; | ||
val = val / 10; | ||
} | ||
while (p != buffer) { | ||
*((volatile uint32_t*)OUTPORT) = '0' + *(--p); | ||
} | ||
} | ||
|
||
void print_hex(unsigned int val) | ||
{ | ||
int i; | ||
for (i = 32-4; i >= 0; i -= 4) | ||
*((volatile uint32_t*)OUTPORT) = "0123456789ABCDEF"[(val >> i) % 16]; | ||
} | ||
|
Oops, something went wrong.