diff --git a/Makefile b/Makefile index 48d0f94..59222a0 100644 --- a/Makefile +++ b/Makefile @@ -44,22 +44,14 @@ SRC_S = \ OBJ = $(addprefix $(BUILD)/, $(SRC_S:.S=.o) $(SRC_C:.c=.o)) all: $(BUILD)/firmware.bin \ - $(BUILD)/loader.bin \ $(BUILD)/usb-loader.bin \ - $(BUILD)/fernly-loader \ $(BUILD)/fernly-usb-loader clean: $(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 $(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 objcopy -S -O binary $(BUILD)/usb-loader.o $@ diff --git a/fernly-loader.c b/fernly-loader.c deleted file mode 100644 index bb7375d..0000000 --- a/fernly-loader.c +++ /dev/null @@ -1,151 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include - -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; -} diff --git a/loader.S b/loader.S deleted file mode 100644 index f97b6bf..0000000 --- a/loader.S +++ /dev/null @@ -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