]> rtime.felk.cvut.cz Git - lincan.git/blob - embedded/arch/arm/mach-lpc21xx/libs/iap/iap_kvpb.c
Update of system-less architecture and board support code to actual uLAN.sf.net version.
[lincan.git] / embedded / arch / arm / mach-lpc21xx / libs / iap / iap_kvpb.c
1 #include <string.h>
2 #include <keyvalpb.h>
3 #include <lpciap.h>
4
5 unsigned long lpciap_buff[ISP_RAM2FLASH_BLOCK_SIZE/4];
6 char *lpciap_addr_base=NULL;
7
8 #define ISP_RAM2FLASH_BLOCK_SIZE_MASK (ISP_RAM2FLASH_BLOCK_SIZE-1)
9
10 int lpcisp_kvpb_erase(struct kvpb_block *store, void *base,int size)
11 {
12   return lpcisp_erase(base, size);
13 }
14
15 int lpcisp_kvpb_flush(struct kvpb_block *store) 
16 {
17   if (lpciap_addr_base==NULL) return -1;
18   lpcisp_write(lpciap_addr_base,lpciap_buff,ISP_RAM2FLASH_BLOCK_SIZE);
19   lpciap_addr_base=NULL;
20   return 0;
21 }
22
23 int lpcisp_kvpb_copy(struct kvpb_block *store,void *des, const void *src, int len)
24 {
25   char *addr_base,*addr_src=(char*)src;
26   int cp_len;
27
28   while(len) {
29     addr_base=(char*)((unsigned long)des&~ISP_RAM2FLASH_BLOCK_SIZE_MASK);
30     cp_len=ISP_RAM2FLASH_BLOCK_SIZE-((unsigned long)des&ISP_RAM2FLASH_BLOCK_SIZE_MASK);
31     if (len<cp_len) cp_len=len;
32     if (lpciap_addr_base) {
33       if (lpciap_addr_base!=addr_base) {
34         lpcisp_kvpb_flush(store);
35         memcpy(lpciap_buff,addr_base,ISP_RAM2FLASH_BLOCK_SIZE);
36         lpciap_addr_base=addr_base;
37       }
38     } else {
39       memcpy(lpciap_buff,addr_base,ISP_RAM2FLASH_BLOCK_SIZE);
40       lpciap_addr_base=addr_base;
41     }
42     memcpy((char*)lpciap_buff+((unsigned long)des&ISP_RAM2FLASH_BLOCK_SIZE_MASK),addr_src,cp_len);
43     des=(char*)des+cp_len;
44     addr_src+=cp_len;
45     len-=cp_len;
46     if (((unsigned long)des&ISP_RAM2FLASH_BLOCK_SIZE_MASK)==0x00) 
47       lpcisp_kvpb_flush(store);
48   }
49   return 1;
50 }