main: Add firmware load/jump
This commit is contained in:
parent
8f13d99dd4
commit
7e6500a28e
4 changed files with 102 additions and 18 deletions
1
Makefile
1
Makefile
|
@ -17,6 +17,7 @@ SRC_C = \
|
||||||
cmd-sleep.c \
|
cmd-sleep.c \
|
||||||
cmd-spi.c \
|
cmd-spi.c \
|
||||||
cmd-led.c \
|
cmd-led.c \
|
||||||
|
cmd-load.c \
|
||||||
cmd-bl.c \
|
cmd-bl.c \
|
||||||
cmd-lcd.c \
|
cmd-lcd.c \
|
||||||
emi.c \
|
emi.c \
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
int serial_putc(uint8_t c);
|
int serial_putc(uint8_t c);
|
||||||
int serial_puts(const void *s);
|
int serial_puts(const void *s);
|
||||||
void serial_puth(uint32_t hex, int digits); /* Put hex */
|
void serial_puth(uint32_t hex, int digits); /* Put hex */
|
||||||
|
int serial_read(void *data, int bytes);
|
||||||
|
|
||||||
uint8_t serial_getc(void);
|
uint8_t serial_getc(void);
|
||||||
void serial_init(void);
|
void serial_init(void);
|
||||||
|
|
15
main.c
15
main.c
|
@ -186,6 +186,8 @@ static int do_init(void)
|
||||||
{
|
{
|
||||||
list_registers();
|
list_registers();
|
||||||
|
|
||||||
|
serial_init();
|
||||||
|
|
||||||
/* Disable system watchdog */
|
/* Disable system watchdog */
|
||||||
writel(0x2200, 0xa0030000);
|
writel(0x2200, 0xa0030000);
|
||||||
|
|
||||||
|
@ -342,6 +344,8 @@ extern int cmd_reboot(int argc, char **argv);
|
||||||
extern int cmd_led(int argc, char **argv);
|
extern int cmd_led(int argc, char **argv);
|
||||||
extern int cmd_bl(int argc, char **argv);
|
extern int cmd_bl(int argc, char **argv);
|
||||||
extern int cmd_lcd(int argc, char **argv);
|
extern int cmd_lcd(int argc, char **argv);
|
||||||
|
extern int cmd_load(int argc, char **argv);
|
||||||
|
extern int cmd_loadjump(int argc, char **argv);
|
||||||
|
|
||||||
static const struct {
|
static const struct {
|
||||||
int (*func)(int argc, char **argv);
|
int (*func)(int argc, char **argv);
|
||||||
|
@ -408,6 +412,17 @@ static const struct {
|
||||||
.name = "lcd",
|
.name = "lcd",
|
||||||
.help = "Manipulate the LCD",
|
.help = "Manipulate the LCD",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.func = cmd_load,
|
||||||
|
.name = "load",
|
||||||
|
.help = "Load data to a specific area in memory",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.func = cmd_loadjump,
|
||||||
|
.name = "loadjmp",
|
||||||
|
.help = "Load data to a specific area in memory, "
|
||||||
|
"then jump to it",
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
int cmd_help(int argc, char **argv)
|
int cmd_help(int argc, char **argv)
|
||||||
|
|
103
serial.c
103
serial.c
|
@ -1,7 +1,7 @@
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include "serial.h"
|
#include "serial.h"
|
||||||
|
#include "memio.h"
|
||||||
|
|
||||||
#define PUTS_HANDLE_NEWLINE
|
|
||||||
#define SERIAL_USB
|
#define SERIAL_USB
|
||||||
|
|
||||||
#ifdef SERIAL_UART
|
#ifdef SERIAL_UART
|
||||||
|
@ -119,6 +119,12 @@ int serial_puts(const void *s)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int serial_read(void *data, int bytes)
|
||||||
|
{
|
||||||
|
while (--bytes)
|
||||||
|
((uint8_t *)data++) = serial_getc();
|
||||||
|
}
|
||||||
|
|
||||||
void serial_init(void)
|
void serial_init(void)
|
||||||
{
|
{
|
||||||
int tmp;
|
int tmp;
|
||||||
|
@ -147,45 +153,106 @@ void serial_init(void)
|
||||||
}
|
}
|
||||||
#else /* SERIAL_USB */
|
#else /* SERIAL_USB */
|
||||||
|
|
||||||
static void (*rom_usb_read)(void *data, int bytes, int timeout) = (void *)0xfff03639;
|
#include "fernvale-usb.h"
|
||||||
static void (*rom_usb_write)(const void *data, int bytes, int timeout) = (void *)0xfff03653;
|
|
||||||
static void (*rom_usb_flush)(void) = (void *)0xfff04845;
|
static void usb_handle_irqs(void)
|
||||||
|
{
|
||||||
|
(void)readb(USB_CTRL_INTRUSB);
|
||||||
|
}
|
||||||
|
|
||||||
int serial_putc(uint8_t c)
|
int serial_putc(uint8_t c)
|
||||||
{
|
{
|
||||||
if (c == '\n')
|
while (readb(USB_CTRL_INTRIN))
|
||||||
serial_putc('\r');
|
usb_handle_irqs();
|
||||||
rom_usb_write(&c, 1, -1);
|
|
||||||
rom_usb_flush();
|
writeb(1, USB_CTRL_INDEX);
|
||||||
|
writeb(c, USB_CTRL_EP1_FIFO_DB0);
|
||||||
|
writeb(USB_CTRL_EP_INCSR1_INPKTRDY, USB_CTRL_EP_INCSR1);
|
||||||
|
|
||||||
|
while (!readb(USB_CTRL_INTRIN))
|
||||||
|
usb_handle_irqs();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static uint8_t *recv_bfr = (uint8_t *)0x70000000;
|
||||||
|
static int recv_bfr_size = 0;
|
||||||
|
static int recv_bfr_offset = 0;
|
||||||
|
|
||||||
|
static void usb_receive(uint8_t endpoint_number)
|
||||||
|
{
|
||||||
|
while (!readb(USB_CTRL_INTROUT))
|
||||||
|
usb_handle_irqs();
|
||||||
|
|
||||||
|
/* Wait for an event to happen */
|
||||||
|
writeb(endpoint_number, USB_CTRL_INDEX);
|
||||||
|
|
||||||
|
while (!readb(USB_CTRL_EP_OUTCSR1 & USB_CTRL_EP_OUTCSR1_RXPKTRDY));
|
||||||
|
|
||||||
|
recv_bfr_size = readb(USB_CTRL_EP_COUNT1) & 0xff;
|
||||||
|
recv_bfr_size |= (readb(USB_CTRL_EP_COUNT2) << 8) & 0xff00;
|
||||||
|
|
||||||
|
for (recv_bfr_offset = 0; recv_bfr_offset < recv_bfr_size; recv_bfr_offset++)
|
||||||
|
recv_bfr[recv_bfr_offset] = readb(USB_CTRL_EP1_FIFO_DB0);
|
||||||
|
|
||||||
|
recv_bfr_offset = 0;
|
||||||
|
|
||||||
|
/* Clear FIFO */
|
||||||
|
writeb(0, USB_CTRL_EP_OUTCSR1);
|
||||||
|
}
|
||||||
|
|
||||||
uint8_t serial_getc(void)
|
uint8_t serial_getc(void)
|
||||||
{
|
{
|
||||||
uint8_t bfr;
|
/* Refill the buffer if it's empty */
|
||||||
rom_usb_read(&bfr, 1, -1);
|
if (recv_bfr_offset == recv_bfr_size)
|
||||||
return bfr;
|
usb_receive(1);
|
||||||
|
|
||||||
|
return recv_bfr[recv_bfr_offset++];
|
||||||
}
|
}
|
||||||
|
|
||||||
int serial_puts(const void *s)
|
int serial_puts(const void *s)
|
||||||
{
|
{
|
||||||
#ifdef PUTS_HANDLE_NEWLINE
|
|
||||||
const char *str = s;
|
const char *str = s;
|
||||||
while(*str) {
|
while(*str) {
|
||||||
if (*str == '\n')
|
if (*str == '\n')
|
||||||
serial_putc('\r');
|
serial_putc('\r');
|
||||||
serial_putc(*str++);
|
serial_putc(*str++);
|
||||||
}
|
}
|
||||||
#else
|
return 0;
|
||||||
uint32_t len = _strlen(s);
|
}
|
||||||
rom_usb_write(s, len, -1);
|
|
||||||
rom_usb_flush();
|
int serial_read(void *data, int bytes)
|
||||||
#endif
|
{
|
||||||
|
while (--bytes) {
|
||||||
|
*((uint8_t *)data) = serial_getc();
|
||||||
|
data++;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void serial_init(void)
|
void serial_init(void)
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
|
(void)readb(USB_CTRL_INTROUT);
|
||||||
|
(void)readb(USB_CTRL_INTRIN);
|
||||||
|
(void)readb(USB_CTRL_INTRUSB);
|
||||||
|
|
||||||
|
writeb(0, USB_CTRL_INTROUTE);
|
||||||
|
writeb(USB_CTRL_INTROUTE_EP1_OUT_ENABLE, USB_CTRL_INTROUTE);
|
||||||
|
|
||||||
|
recv_bfr_size = readb(USB_CTRL_EP_COUNT1) & 0xff;
|
||||||
|
recv_bfr_size |= (readb(USB_CTRL_EP_COUNT2) << 8) & 0xff00;
|
||||||
|
|
||||||
|
for (recv_bfr_offset = 0; recv_bfr_offset < recv_bfr_size; recv_bfr_offset++)
|
||||||
|
recv_bfr[recv_bfr_offset] = readb(USB_CTRL_EP1_FIFO_DB0);
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Clear FIFO */
|
||||||
|
//writeb(0, USB_CTRL_EP_OUTCSR1);
|
||||||
|
|
||||||
|
recv_bfr_offset = 0;
|
||||||
|
recv_bfr_size = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* UART */
|
#endif /* !UART */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue