Mercurial > louis > kiibohd-controller
diff Bootloader/main.c @ 334:9ac304aa1ab5
Adding initial dfu-upload code and debugging for Bootloader.
author | Jacob Alexander <haata@kiibohd.com> |
---|---|
date | Mon, 27 Apr 2015 00:57:34 -0700 |
parents | 9e31d92caf12 |
children | 795cc567b018 |
line wrap: on
line diff
--- a/Bootloader/main.c Mon Apr 20 00:55:58 2015 -0700 +++ b/Bootloader/main.c Mon Apr 27 00:57:34 2015 -0700 @@ -21,6 +21,8 @@ #include "mchck.h" #include "dfu.desc.h" +#include "debug.h" + // ----- Variables ----- @@ -34,9 +36,60 @@ // ----- Functions ----- +void sector_print( void* buf, size_t sector, size_t chunks ) +{ + uint8_t* start = (uint8_t*)buf + sector * USB_DFU_TRANSFER_SIZE; + uint8_t* end = (uint8_t*)buf + (sector + 1) * USB_DFU_TRANSFER_SIZE; + uint8_t* pos = start; + + print( NL ); + print("Block "); + printHex( sector ); + print(" "); + printHex( (size_t)start ); + print(" -> "); + printHex( (size_t)end ); + print( NL ); + + // Display sector + for ( size_t line = 0; pos < end - 24; line++ ) + { + // Each Line + printHex_op( (size_t)pos, 4 ); + print(" "); + + // Each 2 byte chunk + for ( size_t chunk = 0; chunk < chunks; chunk++ ) + { + // Print out the two bytes (second one first) + printHex_op( *(pos + 1), 2 ); + printHex_op( *pos, 2 ); + print(" "); + pos += 2; + } + + print( NL ); + } +} + +static enum dfu_status setup_read( size_t off, size_t *len, void **buf ) +{ + // Calculate starting address from offset + *buf = (void*)&_app_rom + (USB_DFU_TRANSFER_SIZE / 4) * off; + + // Calculate length of transfer + *len = *buf > (void*)(&_app_rom_end) - USB_DFU_TRANSFER_SIZE + ? 0 : USB_DFU_TRANSFER_SIZE; + + // Check for error + if ( *buf > (void*)&_app_rom_end ) + return (DFU_STATUS_errADDRESS); + + return (DFU_STATUS_OK); +} + static enum dfu_status setup_write( size_t off, size_t len, void **buf ) { - GPIOA_PCOR |= (1<<5); static int last = 0; if ( len > sizeof(staging) ) @@ -67,6 +120,9 @@ if ( !target ) return (DFU_STATUS_errADDRESS); memcpy( target, buf, len ); + print("BUF: "); + printHex( off ); + sector_print( target, 0, 16 ); // Depending on the error return a different status switch ( flash_program_sector(off + (uintptr_t)&_app_rom, FLASH_SECTOR_SIZE) ) @@ -91,7 +147,7 @@ void init_usb_bootloader( int config ) { - dfu_init(setup_write, finish_write, &dfu_ctx); + dfu_init( setup_read, setup_write, finish_write, &dfu_ctx ); } void main() @@ -115,26 +171,25 @@ #error "Incompatible chip for bootloader" #endif - //for (uint8_t c = 0; c < 20; c++) - /* - while( 1 ) - { - GPIOA_PTOR |= (1<<5); - for (uint32_t d = 0; d < 7200000; d++ ); - } - */ + uart_serial_setup(); + printNL( NL "Bootloader DFU-Mode" ); + + // TODO REMOVEME + for ( uint8_t sector = 0; sector < 3; sector++ ) + sector_print( &_app_rom, sector, 16 ); + print( NL ); // XXX REMOVEME /* GPIOB_PDDR |= (1<<16); PORTB_PCR16 = PORT_PCR_SRE | PORT_PCR_DSE | PORT_PCR_MUX(1); GPIOB_PSOR |= (1<<16); - */ + // RST GPIOC_PDDR |= (1<<8); PORTC_PCR8 = PORT_PCR_SRE | PORT_PCR_DSE | PORT_PCR_MUX(1); GPIOC_PSOR |= (1<<8); - /* + // CS1B GPIOC_PDDR |= (1<<4); PORTC_PCR4 = PORT_PCR_SRE | PORT_PCR_DSE | PORT_PCR_MUX(1); @@ -151,31 +206,14 @@ PORTC_PCR3 = PORT_PCR_SRE | PORT_PCR_DSE | PORT_PCR_MUX(1); GPIOC_PCOR |= (1<<3); - - flash_prepare_flashing(); - uint32_t *position = &_app_rom; + //uint32_t *position = &_app_rom; usb_init( &dfu_device ); + for (;;) { usb_poll(); - - /* - for ( ; position < &_app_rom + 0x201; position++ ) - //for ( ; position < &_app_rom + 0x800; position++ ) - { - if ( *position != 0xFFFFFFFF ) - { - while( 1 ) - { - GPIOA_PTOR |= (1<<5); - for (uint32_t d = 0; d < 7200000; d++ ); - } - } - } - */ - } }