@ -20,6 +20,7 @@
*/
# include <common.h>
# include <errno.h>
# include <malloc.h>
# include <mmc.h>
# include <fat.h>
@ -41,8 +42,34 @@ static int dfu_find_alt_num(const char *s)
return + + i ;
}
static unsigned char __aligned ( CONFIG_SYS_CACHELINE_SIZE )
dfu_buf [ DFU_DATA_BUF_SIZE ] ;
static unsigned char * dfu_buf ;
static unsigned long dfu_buf_size = CONFIG_SYS_DFU_DATA_BUF_SIZE ;
static unsigned char * dfu_free_buf ( void )
{
free ( dfu_buf ) ;
dfu_buf = NULL ;
return dfu_buf ;
}
static unsigned char * dfu_get_buf ( void )
{
char * s ;
if ( dfu_buf ! = NULL )
return dfu_buf ;
s = getenv ( " dfu_bufsiz " ) ;
dfu_buf_size = s ? ( unsigned long ) simple_strtol ( s , NULL , 16 ) :
CONFIG_SYS_DFU_DATA_BUF_SIZE ;
dfu_buf = memalign ( CONFIG_SYS_CACHELINE_SIZE , dfu_buf_size ) ;
if ( dfu_buf = = NULL )
printf ( " %s: Could not memalign 0x%lx bytes \n " ,
__func__ , dfu_buf_size ) ;
return dfu_buf ;
}
static int dfu_write_buffer_drain ( struct dfu_entity * dfu )
{
@ -87,8 +114,10 @@ int dfu_write(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num)
dfu - > offset = 0 ;
dfu - > bad_skip = 0 ;
dfu - > i_blk_seq_num = 0 ;
dfu - > i_buf_start = dfu_buf ;
dfu - > i_buf_end = dfu_buf + sizeof ( dfu_buf ) ;
dfu - > i_buf_start = dfu_get_buf ( ) ;
if ( dfu - > i_buf_start = = NULL )
return - ENOMEM ;
dfu - > i_buf_end = dfu_get_buf ( ) + dfu_buf_size ;
dfu - > i_buf = dfu - > i_buf_start ;
dfu - > inited = 1 ;
@ -148,11 +177,12 @@ int dfu_write(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num)
printf ( " \n DFU complete CRC32: 0x%08x \n " , dfu - > crc ) ;
/* clear everything */
dfu_free_buf ( ) ;
dfu - > crc = 0 ;
dfu - > offset = 0 ;
dfu - > i_blk_seq_num = 0 ;
dfu - > i_buf_start = dfu_buf ;
dfu - > i_buf_end = dfu_buf + sizeof ( dfu_buf ) ;
dfu - > i_buf_end = dfu_buf ;
dfu - > i_buf = dfu - > i_buf_start ;
dfu - > inited = 0 ;
@ -229,8 +259,10 @@ int dfu_read(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num)
dfu - > i_blk_seq_num = 0 ;
dfu - > crc = 0 ;
dfu - > offset = 0 ;
dfu - > i_buf_start = dfu_buf ;
dfu - > i_buf_end = dfu_buf + sizeof ( dfu_buf ) ;
dfu - > i_buf_start = dfu_get_buf ( ) ;
if ( dfu - > i_buf_start = = NULL )
return - ENOMEM ;
dfu - > i_buf_end = dfu_get_buf ( ) + dfu_buf_size ;
dfu - > i_buf = dfu - > i_buf_start ;
dfu - > b_left = 0 ;
@ -257,11 +289,12 @@ int dfu_read(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num)
debug ( " %s: %s CRC32: 0x%x \n " , __func__ , dfu - > name , dfu - > crc ) ;
puts ( " \n UPLOAD ... done \n Ctrl+C to exit ... \n " ) ;
dfu_free_buf ( ) ;
dfu - > i_blk_seq_num = 0 ;
dfu - > crc = 0 ;
dfu - > offset = 0 ;
dfu - > i_buf_start = dfu_buf ;
dfu - > i_buf_end = dfu_buf + sizeof ( dfu_buf ) ;
dfu - > i_buf_end = dfu_buf ;
dfu - > i_buf = dfu - > i_buf_start ;
dfu - > b_left = 0 ;