]> git.kernelconcepts.de Git - karo-tx-redboot.git/blobdiff - packages/io/flash/v2_0/src/flash.c
unified MX27, MX25, MX37 trees
[karo-tx-redboot.git] / packages / io / flash / v2_0 / src / flash.c
index 4276a6053693f292f2402bebaef2e7b902997d53..f9527131266b8d3fb1cb38e3e57e65838e70aa65 100644 (file)
@@ -73,7 +73,7 @@
 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;
@@ -87,8 +87,9 @@ flash_init(_printf *pf)
 {
     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;
     }
@@ -100,7 +101,7 @@ flash_init(_printf *pf)
 // 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;
 }
@@ -109,13 +110,13 @@ static void* __anonymizer(void* p)
 // make sense to wait till device structure pointer arguments get
 // added as well.
 void
-flash_dev_query(voiddata)
+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);
@@ -129,7 +130,7 @@ flash_verify_addr(void *target)
         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;
@@ -176,18 +177,18 @@ flash_erase(void *addr, int len, void **err_addr)
         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);
@@ -202,7 +203,7 @@ flash_erase(void *addr, int len, void **err_addr)
 
         dp = (unsigned char *)block;
         for (i = 0;  i < flash_info.block_size;  i++) {
-            if (*dp++ != (unsigned char)0xFF) {
+            if (*dp++ != 0xFF) {
                 erased = false;
                 break;
             }
@@ -216,29 +217,28 @@ flash_erase(void *addr, int len, void **err_addr)
             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
@@ -248,8 +248,8 @@ flash_program(void *_addr, void *_data, int len, void **err_addr)
     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;
 
@@ -262,24 +262,26 @@ flash_program(void *_addr, void *_data, int len, void **err_addr)
         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, 
@@ -290,27 +292,27 @@ flash_program(void *_addr, void *_data, int len, void **err_addr)
             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
@@ -321,8 +323,8 @@ flash_read(void *_addr, void *_data, int len, void **err_addr)
     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;
 
@@ -330,17 +332,20 @@ flash_read(void *_addr, void *_data, int len, void **err_addr)
         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;
@@ -353,32 +358,32 @@ flash_read(void *_addr, void *_data, int len, void **err_addr)
         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) {
@@ -409,18 +414,18 @@ flash_lock(void *addr, int len, void **err_addr)
         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);
@@ -430,92 +435,92 @@ flash_lock(void *addr, int len, void **err_addr)
         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