struct flash_info flash_info;
// These are the functions in the HW specific driver we need to call.
-typedef void code_fun(void*);
+typedef void code_fun(void *);
externC code_fun flash_query;
externC code_fun flash_erase_block;
{
int err;
- if (flash_info.init) return FLASH_ERR_OK;
flash_info.pf = pf; // Do this before calling into the driver
+ if (flash_info.init) return FLASH_ERR_OK;
+
if ((err = flash_hwr_init()) != FLASH_ERR_OK) {
return err;
}
// Use this function to make function pointers anonymous - forcing the
// compiler to use jumps instead of branches when calling driver
// services.
-static void* __anonymizer(void* p)
+static void *__anonymizer(void *p)
{
return p;
}
// make sense to wait till device structure pointer arguments get
// added as well.
void
-flash_dev_query(void* data)
+flash_dev_query(void *data)
{
- typedef void code_fun(void*);
+ typedef void code_fun(void *);
code_fun *_flash_query;
int d_cache, i_cache;
- _flash_query = (code_fun*) __anonymizer(&flash_query);
+ _flash_query = (code_fun*)__anonymizer(&flash_query);
HAL_FLASH_CACHES_OFF(d_cache, i_cache);
(*_flash_query)(data);
return FLASH_ERR_NOT_INIT;
}
if (((CYG_ADDRESS)target >= (CYG_ADDRESS)flash_info.start) &&
- ((CYG_ADDRESS)target <= ( ((CYG_ADDRESS)flash_info.end) - 1) )) {
+ ((CYG_ADDRESS)target <= ((CYG_ADDRESS)flash_info.end - 1))) {
return FLASH_ERR_OK;
} else {
return FLASH_ERR_INVALID;
return FLASH_ERR_PROTECT;
#endif
- _flash_erase_block = (code_fun*) __anonymizer(&flash_erase_block);
+ _flash_erase_block = (code_fun*)__anonymizer(&flash_erase_block);
block = (unsigned short *)((CYG_ADDRESS)addr & flash_info.block_mask);
- end_addr = (unsigned short *)((CYG_ADDRESS)addr+len);
+ end_addr = (unsigned short *)((CYG_ADDRESS)addr + len);
/* Check to see if end_addr overflowed */
- if( (end_addr < block) && (len > 0) ){
- end_addr = (unsigned short *) ((CYG_ADDRESS) flash_info.end - 1);
+ if ((end_addr < block) && (len > 0)) {
+ end_addr = (unsigned short *)((CYG_ADDRESS)flash_info.end - 1);
}
#ifdef CYGSEM_IO_FLASH_CHATTER
- (*flash_info.pf)("... Erase from %p-%p: ", (void*)block, (void*)end_addr);
+ flash_info.pf("... Erase from %p-%p: ", block, end_addr);
#endif
HAL_FLASH_CACHES_OFF(d_cache, i_cache);
dp = (unsigned char *)block;
for (i = 0; i < flash_info.block_size; i++) {
- if (*dp++ != (unsigned char)0xFF) {
+ if (*dp++ != 0xFF) {
erased = false;
break;
}
stat = flash_hwr_map_error(stat);
}
if (stat) {
- *err_addr = (void *)block;
+ *err_addr = block;
break;
}
// Check to see if block will overflow
tmp_block = block + flash_info.block_size / sizeof(*block);
- if(tmp_block < block){
+ if (tmp_block < block) {
// If block address overflows, set block value to end on this loop
block = end_addr;
- }
- else{
+ } else {
block = tmp_block;
}
#ifdef CYGSEM_IO_FLASH_CHATTER
- (*flash_info.pf)(".");
+ flash_info.pf(".");
#endif
}
- FLASH_Disable(block, end_addr);
+ FLASH_Disable((void *)((CYG_ADDRESS)addr & flash_info.block_mask), end_addr);
HAL_FLASH_CACHES_ON(d_cache, i_cache);
#ifdef CYGSEM_IO_FLASH_CHATTER
- (*flash_info.pf)("\n");
+ flash_info.pf("\n");
#endif
- return (stat);
+ return stat;
}
int
int size;
typedef int code_fun(void *, void *, int, unsigned long, int);
code_fun *_flash_program_buf;
- unsigned char *addr = (unsigned char *)_addr;
- unsigned char *data = (unsigned char *)_data;
+ unsigned char *addr = _addr;
+ unsigned char *data = _data;
CYG_ADDRESS tmp;
int d_cache, i_cache;
return FLASH_ERR_PROTECT;
#endif
- _flash_program_buf = (code_fun*) __anonymizer(&flash_program_buf);
+ _flash_program_buf = (code_fun*)__anonymizer(&flash_program_buf);
#ifdef CYGSEM_IO_FLASH_CHATTER
- (*flash_info.pf)("... Program from %p-%p at %p: ", (void*)data,
- (void*)(((CYG_ADDRESS)data)+len), (void*)addr);
+ flash_info.pf("... Program from %p-%p at %p: ", data,
+ (void *)((CYG_ADDRESS)data + len), addr);
#endif
HAL_FLASH_CACHES_OFF(d_cache, i_cache);
- FLASH_Enable((unsigned short*)addr, (unsigned short *)(addr+len));
+ FLASH_Enable(addr, addr + len);
while (len > 0) {
size = len;
+#if defined(MXCFLASH_SELECT_NAND) || defined(MXCFLASH_SELECT_MMC)
+ if (flash_info.start != 0)
+#endif
if (size > flash_info.block_size) size = flash_info.block_size;
tmp = (CYG_ADDRESS)addr & ~flash_info.block_mask;
if (tmp) {
tmp = flash_info.block_size - tmp;
- if (size>tmp) size = tmp;
-
+ if (size > tmp) size = tmp;
}
stat = (*_flash_program_buf)(addr, data, size,
if (memcmp(addr, data, size) != 0) {
stat = 0x0BAD;
#ifdef CYGSEM_IO_FLASH_CHATTER
- (*flash_info.pf)("V");
+ flash_info.pf("V");
#endif
}
#endif
if (stat) {
- *err_addr = (void *)addr;
+ *err_addr = addr;
break;
}
#ifdef CYGSEM_IO_FLASH_CHATTER
- (*flash_info.pf)(".");
+ flash_info.pf(".");
#endif
len -= size;
addr += size/sizeof(*addr);
data += size/sizeof(*data);
}
- FLASH_Disable((unsigned short*)addr, (unsigned short *)(addr+len));
+ FLASH_Disable(_addr, addr);
HAL_FLASH_CACHES_ON(d_cache, i_cache);
#ifdef CYGSEM_IO_FLASH_CHATTER
- (*flash_info.pf)("\n");
+ flash_info.pf("\n");
#endif
- return (stat);
+ return stat;
}
int
int size;
typedef int code_fun(void *, void *, int, unsigned long, int);
code_fun *_flash_read_buf;
- unsigned char *addr = (unsigned char *)_addr;
- unsigned char *data = (unsigned char *)_data;
+ unsigned char *addr = _addr;
+ unsigned char *data = _data;
CYG_ADDRESS tmp;
int d_cache, i_cache;
return FLASH_ERR_NOT_INIT;
}
- _flash_read_buf = (code_fun*) __anonymizer(&flash_read_buf);
+ _flash_read_buf = (code_fun*)__anonymizer(&flash_read_buf);
-#ifdef CYGSEM_IO_FLASH_CHATTER
- (*flash_info.pf)("... Read from %p-%p at %p: ", (void*)data,
- (void*)(((CYG_ADDRESS)data)+len), (void*)addr);
+#ifdef CYGSEM_IO_FLASH_CHATTER_VERBOSE
+ flash_info.pf("... Read from %p-%p at %p: ", data,
+ (void *)((CYG_ADDRESS)data + len), addr);
#endif
HAL_FLASH_CACHES_OFF(d_cache, i_cache);
- FLASH_Enable((unsigned short*)addr, (unsigned short *)(addr+len));
+ FLASH_Enable(addr, addr + len);
while (len > 0) {
size = len;
+#if defined(MXCFLASH_SELECT_NAND) || defined(MXCFLASH_SELECT_MMC)
+ if (flash_info.start !=0)
+#endif
if (size > flash_info.block_size) size = flash_info.block_size;
tmp = (CYG_ADDRESS)addr & ~flash_info.block_mask;
stat = (*_flash_read_buf)(addr, data, size,
flash_info.block_mask, flash_info.buffer_size);
stat = flash_hwr_map_error(stat);
-#ifdef CYGSEM_IO_FLASH_VERIFY_PROGRAM_
+#ifdef CYGSEM_IO_FLASH_VERIFY_PROGRAM
if (0 == stat) // Claims to be OK
if (memcmp(addr, data, size) != 0) {
stat = 0x0BAD;
-#ifdef CYGSEM_IO_FLASH_CHATTER
- (*flash_info.pf)("V");
+#ifdef CYGSEM_IO_FLASH_CHATTER_VERBOSE
+ flash_info.pf("V");
#endif
}
#endif
if (stat) {
- *err_addr = (void *)addr;
+ *err_addr = addr;
break;
}
-#ifdef CYGSEM_IO_FLASH_CHATTER
- (*flash_info.pf)(".");
+#ifdef CYGSEM_IO_FLASH_CHATTER_VERBOSE
+ flash_info.pf(".");
#endif
len -= size;
- addr += size/sizeof(*addr);
- data += size/sizeof(*data);
+ addr += size / sizeof(*addr);
+ data += size / sizeof(*data);
}
- FLASH_Disable((unsigned short*)addr, (unsigned short *)(addr+len));
+ FLASH_Disable(_addr, addr);
HAL_FLASH_CACHES_ON(d_cache, i_cache);
-#ifdef CYGSEM_IO_FLASH_CHATTER
- (*flash_info.pf)("\n");
+#ifdef CYGSEM_IO_FLASH_CHATTER_VERBOSE
+ flash_info.pf("\n");
#endif
- return (stat);
+ return stat;
#else // CYGSEM_IO_FLASH_READ_INDIRECT
// Direct access to FLASH memory is possible - just move the requested bytes
if (!flash_info.init) {
return FLASH_ERR_PROTECT;
#endif
- _flash_lock_block = (code_fun*) __anonymizer(&flash_lock_block);
+ _flash_lock_block = (code_fun*)__anonymizer(&flash_lock_block);
block = (unsigned short *)((CYG_ADDRESS)addr & flash_info.block_mask);
- end_addr = (unsigned short *)((CYG_ADDRESS)addr+len);
+ end_addr = (unsigned short *)((CYG_ADDRESS)addr + len);
/* Check to see if end_addr overflowed */
- if( (end_addr < block) && (len > 0) ){
- end_addr = (unsigned short *) ((CYG_ADDRESS) flash_info.end - 1);
+ if ((end_addr < block) && (len > 0)) {
+ end_addr = (unsigned short *)((CYG_ADDRESS)flash_info.end - 1);
}
#ifdef CYGSEM_IO_FLASH_CHATTER
- (*flash_info.pf)("... Lock from %p-%p: ", block, end_addr);
+ flash_info.pf("... Lock from %p-%p: ", block, end_addr);
#endif
HAL_FLASH_CACHES_OFF(d_cache, i_cache);
stat = (*_flash_lock_block)(block);
stat = flash_hwr_map_error(stat);
if (stat) {
- *err_addr = (void *)block;
+ *err_addr = block;
break;
}
// Check to see if block will overflow
tmp_block = block + flash_info.block_size / sizeof(*block);
- if(tmp_block < block){
+ if (tmp_block < block) {
// If block address overflows, set block value to end on this loop
block = end_addr;
- }
- else{
+ } else {
block = tmp_block;
}
#ifdef CYGSEM_IO_FLASH_CHATTER
- (*flash_info.pf)(".");
+ flash_info.pf(".");
#endif
}
- FLASH_Disable(block, end_addr);
+ FLASH_Disable((void *)((CYG_ADDRESS)addr & flash_info.block_mask),
+ end_addr);
HAL_FLASH_CACHES_ON(d_cache, i_cache);
#ifdef CYGSEM_IO_FLASH_CHATTER
- (*flash_info.pf)("\n");
+ flash_info.pf("\n");
#endif
- return (stat);
+ return stat;
}
int
flash_unlock(void *addr, int len, void **err_addr)
{
- unsigned short *block, *end_addr;
- int stat = 0;
- typedef int code_fun(unsigned short *, int, int);
- code_fun *_flash_unlock_block;
- int d_cache, i_cache;
+ unsigned short *block, *end_addr;
+ int stat = 0;
+ typedef int code_fun(unsigned short *, int, int);
+ code_fun *_flash_unlock_block;
+ int d_cache, i_cache;
- if (!flash_info.init) {
- return FLASH_ERR_NOT_INIT;
- }
+ if (!flash_info.init) {
+ return FLASH_ERR_NOT_INIT;
+ }
#ifdef CYGSEM_IO_FLASH_SOFT_WRITE_PROTECT
- if (plf_flash_query_soft_wp(addr,len))
- return FLASH_ERR_PROTECT;
+ if (plf_flash_query_soft_wp(addr,len))
+ return FLASH_ERR_PROTECT;
#endif
- _flash_unlock_block = (code_fun*) __anonymizer(&flash_unlock_block);
+ _flash_unlock_block = (code_fun*)__anonymizer(&flash_unlock_block);
- block = (unsigned short *)((CYG_ADDRESS)addr & flash_info.block_mask);
- end_addr = (unsigned short *)((CYG_ADDRESS)addr+len);
+ block = (unsigned short *)((CYG_ADDRESS)addr & flash_info.block_mask);
+ end_addr = (unsigned short *)((CYG_ADDRESS)addr + len);
- /* Check to see if end_addr overflowed */
- if( (end_addr < block) && (len > 0) ){
- end_addr = (unsigned short *) ((CYG_ADDRESS) flash_info.end - 1);
- }
+ /* Check to see if end_addr overflowed */
+ if ((end_addr < block) && (len > 0)) {
+ end_addr = (unsigned short *)((CYG_ADDRESS)flash_info.end - 1);
+ }
#ifdef CYGSEM_IO_FLASH_CHATTER
- (*flash_info.pf)("... Unlock from %p-%p: ", block, end_addr);
+ flash_info.pf("... Unlock from %p-%p: ", block, end_addr);
#endif
- HAL_FLASH_CACHES_OFF(d_cache, i_cache);
- FLASH_Enable(block, end_addr);
- while (block < end_addr) {
- unsigned short *tmp_block;
- stat = (*_flash_unlock_block)(block, flash_info.block_size, flash_info.blocks);
- stat = flash_hwr_map_error(stat);
- if (stat) {
- *err_addr = (void *)block;
- break;
- }
-
- tmp_block = block + flash_info.block_size / sizeof(*block);
- if(tmp_block < block){
- // If block address overflows, set block value to end on this loop
- block = end_addr;
- }
- else{
- block = tmp_block;
- }
+ HAL_FLASH_CACHES_OFF(d_cache, i_cache);
+ FLASH_Enable(block, end_addr);
+ while (block < end_addr) {
+ unsigned short *tmp_block;
+ stat = (*_flash_unlock_block)(block, flash_info.block_size, flash_info.blocks);
+ stat = flash_hwr_map_error(stat);
+ if (stat) {
+ *err_addr = block;
+ break;
+ }
+
+ tmp_block = block + flash_info.block_size / sizeof(*block);
+ if (tmp_block < block) {
+ // If block address overflows, set block value to end on this loop
+ block = end_addr;
+ } else {
+ block = tmp_block;
+ }
#ifdef CYGSEM_IO_FLASH_CHATTER
- (*flash_info.pf)(".");
+ flash_info.pf(".");
#endif
- }
- FLASH_Disable(block, end_addr);
- HAL_FLASH_CACHES_ON(d_cache, i_cache);
+ }
+ FLASH_Disable((void *)((CYG_ADDRESS)addr & flash_info.block_mask),
+ end_addr);
+ HAL_FLASH_CACHES_ON(d_cache, i_cache);
#ifdef CYGSEM_IO_FLASH_CHATTER
- (*flash_info.pf)("\n");
+ flash_info.pf("\n");
#endif
- return (stat);
+ return stat;
}
#endif