fernly: Remove serial loader
Everything is done via USB now, so it is no longer needed. Signed-off-by: Sean Cross <xobs@kosagi.com>
This commit is contained in:
parent
bf5535da01
commit
54bf2397ec
3 changed files with 0 additions and 288 deletions
8
Makefile
8
Makefile
|
@ -44,22 +44,14 @@ SRC_S = \
|
||||||
OBJ = $(addprefix $(BUILD)/, $(SRC_S:.S=.o) $(SRC_C:.c=.o))
|
OBJ = $(addprefix $(BUILD)/, $(SRC_S:.S=.o) $(SRC_C:.c=.o))
|
||||||
|
|
||||||
all: $(BUILD)/firmware.bin \
|
all: $(BUILD)/firmware.bin \
|
||||||
$(BUILD)/loader.bin \
|
|
||||||
$(BUILD)/usb-loader.bin \
|
$(BUILD)/usb-loader.bin \
|
||||||
$(BUILD)/fernly-loader \
|
|
||||||
$(BUILD)/fernly-usb-loader
|
$(BUILD)/fernly-usb-loader
|
||||||
clean:
|
clean:
|
||||||
$(RM) -rf $(BUILD)
|
$(RM) -rf $(BUILD)
|
||||||
|
|
||||||
$(BUILD)/fernly-loader: fernly-loader.c
|
|
||||||
$(CC_NATIVE) fernly-loader.c -o $@
|
|
||||||
|
|
||||||
$(BUILD)/fernly-usb-loader: fernly-usb-loader.c sha1.c sha1.h
|
$(BUILD)/fernly-usb-loader: fernly-usb-loader.c sha1.c sha1.h
|
||||||
$(CC_NATIVE) fernly-usb-loader.c sha1.c -o $@
|
$(CC_NATIVE) fernly-usb-loader.c sha1.c -o $@
|
||||||
|
|
||||||
$(BUILD)/loader.bin: $(BUILD)/loader.o
|
|
||||||
objcopy -S -O binary $(BUILD)/loader.o $@
|
|
||||||
|
|
||||||
$(BUILD)/usb-loader.bin: $(BUILD)/usb-loader.o
|
$(BUILD)/usb-loader.bin: $(BUILD)/usb-loader.o
|
||||||
objcopy -S -O binary $(BUILD)/usb-loader.o $@
|
objcopy -S -O binary $(BUILD)/usb-loader.o $@
|
||||||
|
|
||||||
|
|
151
fernly-loader.c
151
fernly-loader.c
|
@ -1,151 +0,0 @@
|
||||||
#include <stdio.h>
|
|
||||||
#include <termios.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
int fernvale_reset(void) {
|
|
||||||
int fd;
|
|
||||||
uint8_t b;
|
|
||||||
|
|
||||||
fd = open("/sys/class/gpio/gpio17/value", O_WRONLY);
|
|
||||||
b = '0';
|
|
||||||
write(fd, &b, 1);
|
|
||||||
close(fd);
|
|
||||||
|
|
||||||
usleep(250000);
|
|
||||||
|
|
||||||
fd = open("/sys/class/gpio/gpio17/value", O_WRONLY);
|
|
||||||
b = '1';
|
|
||||||
write(fd, &b, 1);
|
|
||||||
close(fd);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int fernvale_banner(int fd) {
|
|
||||||
uint8_t b;
|
|
||||||
|
|
||||||
while (-1 != read(fd, &b, 1)) {
|
|
||||||
if (b == '>')
|
|
||||||
return 0;
|
|
||||||
printf("%c", b);
|
|
||||||
fflush(stdout);
|
|
||||||
if (b == '\n')
|
|
||||||
printf("\t");
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int fernvale_print_line(int fd) {
|
|
||||||
uint8_t b;
|
|
||||||
|
|
||||||
while (-1 != read(fd, &b, 1)) {
|
|
||||||
printf("%c", b);
|
|
||||||
if (b == '\n')
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
|
||||||
int serfd, binfd;
|
|
||||||
int ret;
|
|
||||||
struct stat stats;
|
|
||||||
int i;
|
|
||||||
int bytes_to_write;
|
|
||||||
struct termios t;
|
|
||||||
|
|
||||||
if (argc != 2) {
|
|
||||||
printf("Usage: %s firmware.bin\n", argv[0]);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
serfd = open("/dev/ttymxc2", O_RDWR);
|
|
||||||
if (-1 == serfd) {
|
|
||||||
perror("Unable to open serial port");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
binfd = open(argv[1], O_RDONLY);
|
|
||||||
if (-1 == binfd) {
|
|
||||||
perror("Unable to open firmware file");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (-1 == fstat(binfd, &stats)) {
|
|
||||||
perror("Unable to get file stats");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("Setting serial port parameters... ");
|
|
||||||
fflush(stdout);
|
|
||||||
ret = tcgetattr(serfd, &t);
|
|
||||||
if (-1 == ret) {
|
|
||||||
perror("Failed to get attributes");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
cfsetispeed(&t, B115200);
|
|
||||||
cfsetospeed(&t, B115200);
|
|
||||||
ret = tcsetattr(serfd, TCSANOW, &t);
|
|
||||||
if (-1 == ret) {
|
|
||||||
perror("Failed to set attributes");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
printf("Ok.\n");
|
|
||||||
|
|
||||||
printf("Resetting Fernvale... ");
|
|
||||||
fflush(stdout);
|
|
||||||
fernvale_reset();
|
|
||||||
printf("Ok.\n");
|
|
||||||
|
|
||||||
printf("Waiting for banner... ");
|
|
||||||
fflush(stdout);
|
|
||||||
fernvale_banner(serfd);
|
|
||||||
printf("Ok.\n");
|
|
||||||
|
|
||||||
bytes_to_write = stats.st_size;
|
|
||||||
printf("Writing %d bytes...", bytes_to_write);
|
|
||||||
fflush(stdout);
|
|
||||||
bytes_to_write += 1; // Wait for us to hit 'enter'
|
|
||||||
{
|
|
||||||
uint8_t b;
|
|
||||||
|
|
||||||
b = bytes_to_write & 0xff;
|
|
||||||
write(serfd, &b, 1);
|
|
||||||
|
|
||||||
b = bytes_to_write >> 8 & 0xff;
|
|
||||||
write(serfd, &b, 1);
|
|
||||||
|
|
||||||
b = bytes_to_write >> 16 & 0xff;
|
|
||||||
write(serfd, &b, 1);
|
|
||||||
|
|
||||||
b = bytes_to_write >> 24 & 0xff;
|
|
||||||
write(serfd, &b, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < stats.st_size; i++) {
|
|
||||||
uint8_t b;
|
|
||||||
if (-1 == read(binfd, &b, 1)) {
|
|
||||||
perror("Error while reading binary");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
if (-1 == write(serfd, &b, 1)) {
|
|
||||||
perror("Error while writing binary to serial port");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
printf(" Done.\n");
|
|
||||||
|
|
||||||
// printf("Result: ");
|
|
||||||
// fernvale_print_line(serfd);
|
|
||||||
|
|
||||||
close(serfd);
|
|
||||||
close(binfd);
|
|
||||||
return execl("/usr/bin/screen", "screen", "/dev/ttymxc2", "115200", NULL);
|
|
||||||
return 0;
|
|
||||||
}
|
|
129
loader.S
129
loader.S
|
@ -1,129 +0,0 @@
|
||||||
.text
|
|
||||||
|
|
||||||
.global _start
|
|
||||||
_start:
|
|
||||||
ldr r0, =0x7000cffc // stack_start
|
|
||||||
mov sp, r0
|
|
||||||
mov r2, #0xffffffff
|
|
||||||
ldr r1, =0x7000c000 // stack_end
|
|
||||||
|
|
||||||
clear_stack:
|
|
||||||
cmp r1, r0
|
|
||||||
str r2, [r0]
|
|
||||||
sub r0, r0, #4
|
|
||||||
bcc clear_stack
|
|
||||||
|
|
||||||
bl wdt_disable
|
|
||||||
|
|
||||||
clear_psram:
|
|
||||||
mov r0, #0
|
|
||||||
mov r1, #0x00800000
|
|
||||||
mov r2, #0
|
|
||||||
clear_psram_loop:
|
|
||||||
cmp r1, r0
|
|
||||||
str r2, [r0], #4
|
|
||||||
bcc clear_psram_loop
|
|
||||||
|
|
||||||
print_welcome_banner:
|
|
||||||
adr r0, welcome_banner
|
|
||||||
bl uart_puts
|
|
||||||
|
|
||||||
load_program:
|
|
||||||
bl uart_getc
|
|
||||||
mov r5, r0
|
|
||||||
lsls r5, r5, #0
|
|
||||||
mov r4, r5
|
|
||||||
|
|
||||||
bl uart_getc
|
|
||||||
mov r5, r0
|
|
||||||
lsls r5, r5, #8
|
|
||||||
orr r4, r5
|
|
||||||
|
|
||||||
bl uart_getc
|
|
||||||
mov r5, r0
|
|
||||||
lsls r5, r5, #16
|
|
||||||
orr r4, r5
|
|
||||||
|
|
||||||
bl uart_getc
|
|
||||||
mov r5, r0
|
|
||||||
lsls r5, r5, #24
|
|
||||||
orr r4, r5
|
|
||||||
|
|
||||||
# r4 now contains the number of bytes to load.
|
|
||||||
# r5 contains the current offset to write to.
|
|
||||||
# Load bytes from the serial port into RAM.
|
|
||||||
mov r5, #0
|
|
||||||
loader_loop:
|
|
||||||
bl uart_getc
|
|
||||||
strb r0, [r5], #1
|
|
||||||
sub r4, #1
|
|
||||||
cmp r4, #0
|
|
||||||
bne loader_loop
|
|
||||||
|
|
||||||
jump_to_new_program:
|
|
||||||
adr r0, launch_message
|
|
||||||
bl uart_puts
|
|
||||||
mov r0, #0
|
|
||||||
mov pc, r0
|
|
||||||
|
|
||||||
.align 4
|
|
||||||
welcome_banner:
|
|
||||||
.ascii "Fernvale bootloader\r\nWrite four bytes of program size, then\r\n"
|
|
||||||
.asciz "write program data...\r\n>"
|
|
||||||
launch_message:
|
|
||||||
.asciz "Launching program...\r\n"
|
|
||||||
.align 4
|
|
||||||
|
|
||||||
uart_putc:
|
|
||||||
stmfd sp!, {lr}
|
|
||||||
ldr r2, =0xa0080014 // uart offset
|
|
||||||
uart_putc_ready_wait:
|
|
||||||
ldrb r1, [r2]
|
|
||||||
tst r1, #0x20
|
|
||||||
beq uart_putc_ready_wait
|
|
||||||
|
|
||||||
sub r2, r2, #0x14
|
|
||||||
strb r0, [r2]
|
|
||||||
ldmfd sp!, {pc}
|
|
||||||
|
|
||||||
uart_puts:
|
|
||||||
stmfd sp!, {lr}
|
|
||||||
mov r3, r0
|
|
||||||
|
|
||||||
uart_puts_loop:
|
|
||||||
ldrb r0, [r3], #1
|
|
||||||
cmp r0, #0
|
|
||||||
beq uart_exit
|
|
||||||
bl uart_putc
|
|
||||||
b uart_puts_loop
|
|
||||||
uart_exit:
|
|
||||||
ldmfd sp!, {pc}
|
|
||||||
|
|
||||||
uart_getc:
|
|
||||||
stmfd sp!, {lr}
|
|
||||||
ldr r2, =0xa0080014 // uart offset
|
|
||||||
uart_getc_ready_wait:
|
|
||||||
ldrb r1, [r2]
|
|
||||||
tst r1, #0x01
|
|
||||||
beq uart_getc_ready_wait
|
|
||||||
|
|
||||||
sub r2, r2, #0x14
|
|
||||||
ldrb r0, [r2]
|
|
||||||
ldmfd sp!, {pc}
|
|
||||||
|
|
||||||
asm_memcpy:
|
|
||||||
mov r3, r1
|
|
||||||
add r3, r3, r2
|
|
||||||
|
|
||||||
asm_memcpy_loop:
|
|
||||||
cmp r1, r3
|
|
||||||
ldrcc r2, [r1], #4
|
|
||||||
strcc r2, [r0], #4
|
|
||||||
bcc asm_memcpy_loop
|
|
||||||
bx lr
|
|
||||||
|
|
||||||
wdt_disable:
|
|
||||||
ldr r1, =0xa0030000
|
|
||||||
mov r0, #0x2200
|
|
||||||
str r0, [r1]
|
|
||||||
bx lr
|
|
Loading…
Add table
Add a link
Reference in a new issue