From f2c202861aff252306b60eaa173b7bc5028bd5a4 Mon Sep 17 00:00:00 2001 From: rebane Date: Mon, 22 Aug 2016 17:37:32 +0300 Subject: [PATCH] bugfixes --- .gitignore | 1 + Makefile | 14 ++++- README.md | 2 +- rtl8710.h | 69 ++++++++++++++++++++++ rtl8710_cpu.ocd => rtl8710_cpu.tcl | 0 rtl8710_flasher.ocd => rtl8710_flasher.tcl | 27 ++------- script/rtl8710.ocd | 28 ++------- 7 files changed, 94 insertions(+), 47 deletions(-) rename rtl8710_cpu.ocd => rtl8710_cpu.tcl (100%) rename rtl8710_flasher.ocd => rtl8710_flasher.tcl (91%) diff --git a/.gitignore b/.gitignore index e454e07..51d02f0 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ make_array rtl8710_flasher.bin rtl8710_flasher.elf rtl8710.ocd +dump.bin diff --git a/Makefile b/Makefile index a79a187..d7418e3 100644 --- a/Makefile +++ b/Makefile @@ -7,16 +7,17 @@ all: arm-none-eabi-gcc -Wall -g -Os -mlittle-endian -mlong-calls -mthumb -mcpu=cortex-m3 -mfloat-abi=soft -mthumb-interwork -ffunction-sections -ffreestanding -fsingle-precision-constant -Wstrict-aliasing=0 -Wl,-T,rtl8710.ld -nostartfiles -nostdlib -u main -Wl,--section-start=.text=$(FIRMWARE_ADDRESS) -DBUFFER_ADDRESS=$(BUFFER_ADDRESS) rtl8710_flasher.c spi_flash.c -o rtl8710_flasher.elf arm-none-eabi-objcopy -O binary rtl8710_flasher.elf rtl8710_flasher.bin gcc make_array.c -o make_array - cp rtl8710_cpu.ocd rtl8710.ocd + cp rtl8710_cpu.tcl rtl8710.ocd echo "set rtl8710_flasher_firmware_ptr $(FIRMWARE_ADDRESS)" >>rtl8710.ocd echo "set rtl8710_flasher_buffer $(BUFFER_ADDRESS)" >>rtl8710.ocd echo "set rtl8710_flasher_buffer_size $(BUFFER_SIZE)" >>rtl8710.ocd + echo "set rtl8710_flasher_sector_size $(FLASH_SECTOR_SIZE)" >>rtl8710.ocd echo >>rtl8710.ocd echo "array set rtl8710_flasher_code {" >>rtl8710.ocd ./make_array >rtl8710.ocd echo "}" >>rtl8710.ocd echo >>rtl8710.ocd - cat rtl8710_flasher.ocd >>rtl8710.ocd + cat rtl8710_flasher.tcl >>rtl8710.ocd cp rtl8710.ocd script/rtl8710.ocd clean: @@ -25,3 +26,12 @@ clean: test: openocd -f interface/stlink-v2-1.cfg -f rtl8710.ocd -c "init" -c "reset halt" -c "rtl8710_flash_read_id" -c "shutdown" +dump: + openocd -f interface/stlink-v2-1.cfg -f rtl8710.ocd -c "init" -c "reset halt" -c "rtl8710_flash_read_id" -c "rtl8710_flash_read dump.bin 0 1048576" -c "shutdown" + +restore: + openocd -f interface/stlink-v2-1.cfg -f rtl8710.ocd -c "init" -c "reset halt" -c "rtl8710_flash_auto_erase 1" -c "rtl8710_flash_write dump.bin 0" -c shutdown + +reset: + openocd -f interface/stlink-v2-1.cfg -f rtl8710.ocd -c "init" -c "reset halt" -c "rtl8710_reboot" -c shutdown + diff --git a/README.md b/README.md index aa119dc..9b0819e 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ write file (filename) to flash offset (offset) ### rtl8710_flash_verify [filename] [offset] compare file (filename) with flash offset (offset) ### rtl8710_flash_auto_erase [1/0] -set auto_erase option on/off. flash pages will be autoerased when writing +set auto_erase option on/off. flash sectors will be autoerased when writing ### rtl8710_flash_auto_verify [1/0] set auto_verify option on/off. each block of data will be auto verified when writing ## examples: diff --git a/rtl8710.h b/rtl8710.h index 07d7bc2..c9fde98 100644 --- a/rtl8710.h +++ b/rtl8710.h @@ -216,5 +216,74 @@ typedef struct{ #define PERI_ON_CPU_PERIPHERAL_CTRL_LOG_UART_IR_EN (((uint32_t)0x01) << 21) #define PERI_ON_CPU_PERIPHERAL_CTRL_LOG_UART_PIN_SEL (((uint32_t)0x03) << 22) +typedef struct{ + union{ + volatile uint32_t RBR; + volatile uint32_t THR; + volatile uint32_t DLL; + volatile uint32_t RBR_THR_DLL; + }; + union{ + volatile uint32_t IER; + volatile uint32_t DLH; + volatile uint32_t IER_DLH; + }; + union{ + volatile uint32_t IIR; + volatile uint32_t FCR; + volatile uint32_t IIR_FCR; + }; + volatile uint32_t LCR; + volatile uint32_t MCR; + volatile uint32_t LSR; + volatile uint32_t MSR; + uint32_t RESERVED1[24]; + volatile uint32_t USR; +}__attribute__((packed)) LOG_UART_TypeDef; + +#define LOG_UART ((LOG_UART_TypeDef *)0x40003000) + +// LOG_UART_IER +#define LOG_UART_IER_ERBFI (((uint32_t)0x01) << 0) +#define LOG_UART_IER_ETBEI (((uint32_t)0x01) << 1) +#define LOG_UART_IER_ELSI (((uint32_t)0x01) << 2) +#define LOG_UART_IER_EDSSI (((uint32_t)0x01) << 3) + +// LOG_UART_FCR +#define LOG_UART_FCR_FIFOE (((uint32_t)0x01) << 0) +#define LOG_UART_FCR_RFIFOR (((uint32_t)0x01) << 1) +#define LOG_UART_FCR_XFIFOR (((uint32_t)0x01) << 2) +#define LOG_UART_FCR_DMAM (((uint32_t)0x01) << 3) +#define LOG_UART_FCR_TET (((uint32_t)0x03) << 4) +#define LOG_UART_FCR_RT (((uint32_t)0x03) << 6) + +// LOG_UART_LCR +#define LOG_UART_LCR_DLS (((uint32_t)0x03) << 0) +#define LOG_UART_LCR_STOP (((uint32_t)0x01) << 2) +#define LOG_UART_LCR_PEN (((uint32_t)0x01) << 3) +#define LOG_UART_LCR_EPS (((uint32_t)0x01) << 4) +#define LOG_UART_LCR_STICK_PAR (((uint32_t)0x01) << 5) +#define LOG_UART_LCR_BC (((uint32_t)0x01) << 6) +#define LOG_UART_LCR_DLAB (((uint32_t)0x01) << 7) + +// LOG_UART_MCR +#define LOG_UART_MCR_DTR (((uint32_t)0x01) << 0) +#define LOG_UART_MCR_RTS (((uint32_t)0x01) << 1) +#define LOG_UART_MCR_OUT1 (((uint32_t)0x01) << 2) +#define LOG_UART_MCR_OUT2 (((uint32_t)0x01) << 3) +#define LOG_UART_MCR_LOOPBACK (((uint32_t)0x01) << 4) +#define LOG_UART_MCR_AFCE (((uint32_t)0x01) << 5) + +// LOG_UART_LSR +#define LOG_UART_LSR_DR (((uint32_t)0x01) << 0) +#define LOG_UART_LSR_OE (((uint32_t)0x01) << 1) +#define LOG_UART_LSR_PE (((uint32_t)0x01) << 2) +#define LOG_UART_LSR_FE (((uint32_t)0x01) << 3) +#define LOG_UART_LSR_BI (((uint32_t)0x01) << 4) +#define LOG_UART_LSR_THRE (((uint32_t)0x01) << 5) +#define LOG_UART_LSR_TEMT (((uint32_t)0x01) << 6) +#define LOG_UART_LSR_RFE (((uint32_t)0x01) << 7) +#define LOG_UART_LSR_ADDR_RCVD (((uint32_t)0x01) << 8) + #endif diff --git a/rtl8710_cpu.ocd b/rtl8710_cpu.tcl similarity index 100% rename from rtl8710_cpu.ocd rename to rtl8710_cpu.tcl diff --git a/rtl8710_flasher.ocd b/rtl8710_flasher.tcl similarity index 91% rename from rtl8710_flasher.ocd rename to rtl8710_flasher.tcl index c7f04fe..9c056b4 100644 --- a/rtl8710_flasher.ocd +++ b/rtl8710_flasher.tcl @@ -1,8 +1,3 @@ -set rtl8710_flasher_firmware_ptr 0x10001D00 -set rtl8710_flasher_buffer 0x10008000 -set rtl8710_flasher_buffer_size 262144 -set rtl8710_flasher_sector_size 4096 - set rtl8710_flasher_command_read_id 0 set rtl8710_flasher_command_mass_erase 1 set rtl8710_flasher_command_sector_erase 2 @@ -16,24 +11,12 @@ set rtl8710_flasher_auto_erase 0 set rtl8710_flasher_auto_verify 0 set rtl8710_flasher_auto_erase_sector 0xFFFFFFFF -proc array2file {a local_filename loc} { - for {set offset 0} {$offset < [array size a]} {set offset [expr {$offset + 1}]} { - append bindata [binary format c $a([expr $offset])] - } - set fp [open $local_filename "a+"] - close $fp - set fp [open $local_filename "r+"] - fconfigure $fp -translation binary - seek $fp $loc - puts -nonewline $fp $bindata - close $fp -} - proc rtl8710_flasher_init {} { global rtl8710_flasher_firmware_ptr global rtl8710_flasher_buffer global rtl8710_flasher_capacity global rtl8710_flasher_ready + global rtl8710_flasher_code if {[expr {$rtl8710_flasher_ready == 0}]} { echo "initializing RTL8710 SPI programmer" @@ -154,6 +137,7 @@ proc rtl8710_flash_sector_erase {offset} { } proc rtl8710_flash_read {local_filename loc size} { + global rtl8710_flasher_buffer global rtl8710_flasher_buffer_size rtl8710_flasher_init for {set offset 0} {$offset < $size} {set offset [expr {$offset + $rtl8710_flasher_buffer_size}]} { @@ -164,9 +148,8 @@ proc rtl8710_flash_read {local_filename loc size} { set flash_offset [expr {$loc + $offset}] echo "read offset $flash_offset" rtl8710_flasher_read_block $flash_offset $len - set a "" - mem2array a 8 [expr {$rtl8710_flasher_buffer + 0x20}] $len - array2file a $local_filename $offset + dump_image /tmp/_rtl8710_flasher.bin [expr {$rtl8710_flasher_buffer + 0x20}] $len + exec dd conv=notrunc if=/tmp/_rtl8710_flasher.bin "of=$local_filename" bs=1 "seek=$offset" } } @@ -191,7 +174,7 @@ proc rtl8710_flash_write {local_filename loc} { set sector [expr {$i / $rtl8710_flasher_sector_size}] if {[expr {$rtl8710_flasher_auto_erase_sector != $sector}]} { echo "erase sector $sector" - rtl8710_flasher_sector_erase [expr {$sector * $rtl8710_flasher_sector_size}] + rtl8710_flash_sector_erase [expr {$sector * $rtl8710_flasher_sector_size}] set rtl8710_flasher_auto_erase_sector $sector } } diff --git a/script/rtl8710.ocd b/script/rtl8710.ocd index f572fe2..0a0d533 100644 --- a/script/rtl8710.ocd +++ b/script/rtl8710.ocd @@ -49,6 +49,7 @@ if {![using_hla]} { set rtl8710_flasher_firmware_ptr 0x10001000 set rtl8710_flasher_buffer 0x10008000 set rtl8710_flasher_buffer_size 262144 +set rtl8710_flasher_sector_size 4096 array set rtl8710_flasher_code { 0 0xB671B57F 1 0x25FF4B58 2 0x6B196B1A 3 0x7040F042 4 0x69D96318 5 0xF4414E55 @@ -96,11 +97,6 @@ array set rtl8710_flasher_code { 252 0xF0004798 253 0xB2C10002 254 0xD0F82900 255 0xBF00BD08 256 0x100012D5 } -set rtl8710_flasher_firmware_ptr 0x10001D00 -set rtl8710_flasher_buffer 0x10008000 -set rtl8710_flasher_buffer_size 262144 -set rtl8710_flasher_sector_size 4096 - set rtl8710_flasher_command_read_id 0 set rtl8710_flasher_command_mass_erase 1 set rtl8710_flasher_command_sector_erase 2 @@ -114,24 +110,12 @@ set rtl8710_flasher_auto_erase 0 set rtl8710_flasher_auto_verify 0 set rtl8710_flasher_auto_erase_sector 0xFFFFFFFF -proc array2file {a local_filename loc} { - for {set offset 0} {$offset < [array size a]} {set offset [expr {$offset + 1}]} { - append bindata [binary format c $a([expr $offset])] - } - set fp [open $local_filename "a+"] - close $fp - set fp [open $local_filename "r+"] - fconfigure $fp -translation binary - seek $fp $loc - puts -nonewline $fp $bindata - close $fp -} - proc rtl8710_flasher_init {} { global rtl8710_flasher_firmware_ptr global rtl8710_flasher_buffer global rtl8710_flasher_capacity global rtl8710_flasher_ready + global rtl8710_flasher_code if {[expr {$rtl8710_flasher_ready == 0}]} { echo "initializing RTL8710 SPI programmer" @@ -252,6 +236,7 @@ proc rtl8710_flash_sector_erase {offset} { } proc rtl8710_flash_read {local_filename loc size} { + global rtl8710_flasher_buffer global rtl8710_flasher_buffer_size rtl8710_flasher_init for {set offset 0} {$offset < $size} {set offset [expr {$offset + $rtl8710_flasher_buffer_size}]} { @@ -262,9 +247,8 @@ proc rtl8710_flash_read {local_filename loc size} { set flash_offset [expr {$loc + $offset}] echo "read offset $flash_offset" rtl8710_flasher_read_block $flash_offset $len - set a "" - mem2array a 8 [expr {$rtl8710_flasher_buffer + 0x20}] $len - array2file a $local_filename $offset + dump_image /tmp/_rtl8710_flasher.bin [expr {$rtl8710_flasher_buffer + 0x20}] $len + exec dd conv=notrunc if=/tmp/_rtl8710_flasher.bin "of=$local_filename" bs=1 "seek=$offset" } } @@ -289,7 +273,7 @@ proc rtl8710_flash_write {local_filename loc} { set sector [expr {$i / $rtl8710_flasher_sector_size}] if {[expr {$rtl8710_flasher_auto_erase_sector != $sector}]} { echo "erase sector $sector" - rtl8710_flasher_sector_erase [expr {$sector * $rtl8710_flasher_sector_size}] + rtl8710_flash_sector_erase [expr {$sector * $rtl8710_flasher_sector_size}] set rtl8710_flasher_auto_erase_sector $sector } }