fernvale: Get IRQs to at least do something

IRQs now do something.  They still don't work, though.
This commit is contained in:
Sean Cross 2014-08-26 17:09:42 +08:00
parent 624dbb2f2e
commit 8f18cfd58b
11 changed files with 633 additions and 134 deletions

130
main.c
View file

@ -1,8 +1,10 @@
#include <string.h>
#include "bionic.h"
#include "memio.h"
#include "irq.h"
#include "printf.h"
#include "serial.h"
#include "utils.h"
#include "bionic.h"
#include "printf.h"
//#define AUTOMATED
@ -79,36 +81,6 @@ static int serial_get_line(char *bfr, int len)
}
#endif
static inline void writeb(uint8_t value, uint32_t addr)
{
*((volatile uint8_t *)addr) = value;
}
static inline uint8_t readb(uint32_t addr)
{
return *(volatile uint8_t *)addr;
}
static inline void writew(uint16_t value, uint32_t addr)
{
*((volatile uint16_t *)addr) = value;
}
static inline uint16_t readw(uint32_t addr)
{
return *(volatile uint16_t *)addr;
}
static inline void writel(uint32_t value, uint32_t addr)
{
*((volatile uint32_t *)addr) = value;
}
static inline uint32_t readl(uint32_t addr)
{
return *(volatile uint32_t *)addr;
}
/*
static int wdt_kick(void)
{
@ -209,12 +181,12 @@ static int list_registers(void)
serial_puth(var, 8);
serial_puts("\n");
serial_puts("LR: ");
serial_puts("LR: ");
asm volatile ("mov %0, r14":"=r" (var));
serial_puth(var, 8);
serial_puts("\n");
serial_puts("PC: ");
serial_puts("PC: ");
asm volatile ("mov %0, r15":"=r" (var));
serial_puth(var, 8);
serial_puts("\n");
@ -222,45 +194,8 @@ static int list_registers(void)
return 0;
}
static int enable_irq(void)
{
register int var;
asm volatile ("mrs %0, cpsr":"=r" (var));
if (!(var & 0x80)) {
serial_puts("Interrupts already enabled\n");
return -1;
}
// serial_puts("Interrupts were disabled. Re-enabling...\n");
var &= ~0x80;
var &= ~0x1f;
var |= 0x10;
asm volatile ("msr cpsr, %0":"=r" (var));
return 0;
}
static int enable_fiq(void)
{
register int var;
asm volatile ("mrs %0, cpsr":"=r" (var));
if (!(var & 0x40)) {
serial_puts("FIQ already enabled\n");
return -1;
}
// serial_puts("FIQ was disabled. Re-enabling...\n");
var &= ~0x40;
asm volatile ("msr cpsr, %0":"=r" (var));
return 0;
}
static int do_init(void)
{
void *rv_start = (void *)0x88;
void *rv_end = (void *)0x88 + 256;
list_registers();
serial_init();
@ -272,10 +207,8 @@ static int do_init(void)
serial_puts("\n\nFernly shell\n");
/* Copy exception vectors to address 0 */
_memcpy((void *)0, rv_start, rv_end - rv_start);
enable_irq();
enable_fiq();
irq_init();
fiq_init();
return 0;
}
@ -404,8 +337,11 @@ static int loop(void)
#else /* AUTOMATED */
static int cmd_help(int argc, char **argv);
static int cmd_hex(int argc, char **argv);
static int cmd_swi(int argc, char **argv);
static int cmd_reboot(int argc, char **argv);
static int cmd_args(int argc, char **argv);
int cmd_irq(int argc, char **argv);
static struct {
int (*func)(int argc, char **argv);
@ -422,18 +358,35 @@ static struct {
.name = "reboot",
.help = "Reboot Fernvale",
},
{
.func = cmd_hex,
.name = "hex",
.help = "Print area of memory as hex",
},
{
.func = cmd_irq,
.name = "irq",
.help = "Manipulate IRQs",
},
{
.func = cmd_args,
.name = "args",
.help = "Print contents of arc and argv",
},
{
.func = cmd_swi,
.name = "swi",
.help = "Generate software interrupt",
},
};
int cmd_help(int argc, char **argv)
{
int i;
printf("Fernly shell help. Available commands:\n");
for (i = 0; i < sizeof(commands) / sizeof(*commands); i++) {
serial_putc('\t');
serial_puts(commands[i].name);
serial_putc('\t');
serial_puts(commands[i].help);
@ -455,6 +408,33 @@ int cmd_args(int argc, char **argv)
return 0;
}
int cmd_hex(int argc, char **argv)
{
uint32_t offset;
int count = 0x200;
if (argc < 1) {
printf("Usage: hex [offset] [[count]]\n");
return -1;
}
offset = _strtoul(argv[0], NULL, 0);
if (argc > 1)
count = _strtoul(argv[1], NULL, 0);
serial_print_hex((const void *)offset, count);
return 0;
}
int cmd_swi(int argc, char **argv)
{
printf("Generating SWI...\n");
asm volatile ("swi #0\n");
printf("Returned from SWI\n");
return 0;
}
int cmd_reboot(int argc, char **argv)
{
printf("Rebooting...\n");