1 #include <system_def.h>
3 #include <hal_machperiph.h>
8 #define IAP_CMD_PREPARE 50
9 #define IAP_CMD_WRITE 51
10 #define IAP_CMD_ERASE 52
11 #define IAP_CMD_READ_PARTID 54
13 unsigned int command[5];
14 unsigned int result[5];
16 #define IAP_LOCATION 0x1FFF1FF1
18 typedef void (*IAP)(unsigned int [],unsigned int[]);
19 IAP iap_entry = (IAP) IAP_LOCATION;
21 static inline int addr2sec(unsigned long addr)
31 int lpcisp_read_partid()
33 command[0] = IAP_CMD_READ_PARTID;
34 iap_entry(command, result);
38 int lpcisp_prepare_sectors(unsigned char start, unsigned char end)
40 command[0] = IAP_CMD_PREPARE;
44 iap_entry(command, result);
46 return (CMD_SUCCESS == *result);
49 int lpcisp_erase_sectors(unsigned char start, unsigned char end)
51 command[0] = IAP_CMD_ERASE;
54 command[3] = system_frequency/1000;
56 iap_entry(command, result);
58 return (CMD_SUCCESS == *result);
61 int lpcisp_erase(void *addr, int len)
66 start=addr2sec((unsigned long)addr);
67 end=addr2sec((unsigned long)addr+len-1);
69 if (end<start) return 0;
73 lpcisp_prepare_sectors(start,end);
74 if (CMD_SUCCESS != *result) return 0;
76 lpcisp_erase_sectors(start,end);
80 return (CMD_SUCCESS == *result);
83 int lpcisp_write(void *addr_des, const void *addr_src, int len)
88 start=addr2sec((unsigned long)addr_des);
93 lpcisp_prepare_sectors(start,end);
94 if (CMD_SUCCESS != *result) return 0;
96 command[0] = IAP_CMD_WRITE;
97 command[1] = (unsigned int)addr_des;
98 command[2] = (unsigned int)addr_src;
100 command[4] = system_frequency/1000;
102 iap_entry(command, result);
104 restore_flags(flags);
106 return (CMD_SUCCESS == *result);