diff packages/io/flash/current/src/flash.c @ 119:77cec8369160 ecos-sw-2000-09-01

Merge from eCos master repository on 2000-09-01-07:47:03-BST
author jlarmour
date Fri, 01 Sep 2000 13:45:23 +0000
parents bd1a71e3e476
children 6bd9d475ed4b
line wrap: on
line diff
--- a/packages/io/flash/current/src/flash.c
+++ b/packages/io/flash/current/src/flash.c
@@ -41,6 +41,9 @@
 //
 //==========================================================================
 
+#include <pkgconf/system.h>
+#include <pkgconf/io_flash.h>
+
 #include <cyg/hal/hal_arch.h>
 #include <cyg/hal/hal_intr.h>
 #include <cyg/hal/hal_cache.h>
@@ -186,6 +189,91 @@ flash_program(void *_addr, void *_data, 
     return (stat);
 }
 
+#ifdef CYGHWR_IO_FLASH_BLOCK_LOCKING
+
+int
+flash_lock(void *addr, int len, void **err_addr)
+{
+    unsigned short *block, *end_addr;
+    int stat = 0;
+    extern char flash_lock_block, flash_lock_block_end;
+    int code_len;
+    typedef int code_fun(unsigned short *);
+    code_fun *_flash_lock_block;
+
+    if (!flash_info.init) {
+        return FLASH_ERR_NOT_INIT;
+    }
+
+    // Copy 'lock' code to RAM for execution
+    code_len = (unsigned long)&flash_lock_block_end - (unsigned long)&flash_lock_block;
+    _flash_lock_block = (code_fun *)flash_info.work_space;
+    memcpy(_flash_lock_block, &flash_lock_block, code_len);
+    HAL_DCACHE_SYNC();  // Should guarantee this code will run
+    HAL_ICACHE_DISABLE(); // is also required to avoid old contents
+
+    block = (unsigned short *)((unsigned long)addr & flash_info.block_mask);
+    end_addr = (unsigned short *)((unsigned long)addr+len);
+
+    printf("... Lock from %p-%p: ", block, end_addr);
+
+    while (block < end_addr) {
+        stat = (*_flash_lock_block)(block);
+        stat = flash_hwr_map_error(stat);
+        if (stat) {
+            *err_addr = (void *)block;
+            break;
+        }
+        block += flash_info.block_size / sizeof(*block);
+        printf(".");
+    }
+    HAL_ICACHE_ENABLE();
+    printf("\n");
+    return (stat);
+}
+
+int
+flash_unlock(void *addr, int len, void **err_addr)
+{
+    unsigned short *block, *end_addr;
+    int stat = 0;
+    extern char flash_unlock_block, flash_unlock_block_end;
+    int code_len;
+    typedef int code_fun(unsigned short *, int, int);
+    code_fun *_flash_unlock_block;
+
+    if (!flash_info.init) {
+        return FLASH_ERR_NOT_INIT;
+    }
+
+    // Copy 'lock' code to RAM for execution
+    code_len = (unsigned long)&flash_unlock_block_end - (unsigned long)&flash_unlock_block;
+    _flash_unlock_block = (code_fun *)flash_info.work_space;
+    memcpy(_flash_unlock_block, &flash_unlock_block, code_len);
+    HAL_DCACHE_SYNC();  // Should guarantee this code will run
+    HAL_ICACHE_DISABLE(); // is also required to avoid old contents
+
+    block = (unsigned short *)((unsigned long)addr & flash_info.block_mask);
+    end_addr = (unsigned short *)((unsigned long)addr+len);
+
+    printf("... Unlock from %p-%p: ", block, end_addr);
+
+    while (block < end_addr) {
+        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;
+        }
+        block += flash_info.block_size / sizeof(*block);
+        printf(".");
+    }
+    HAL_ICACHE_ENABLE();
+    printf("\n");
+    return (stat);
+}
+#endif
+
 char *
 flash_errmsg(int err)
 {