1 #include "NyLPC_config.h"
2 #if NyLPC_MCU==NyLPC_MCU_LPC4088 || NyLPC_MCU==NyLPC_MCU_LPC17xx
3 #include "LPC17xx_IAP.h"
4 #include "NyLPC_cOnchipFlashWriter.h"
8 * 指定したアドレスが、オンチップフラッシュかどうか
10 NyLPC_TBool NyLPC_cOnchipFlashWriter_isOnchipFlash(const void* i_addr)
13 return LPC17xx_IAP_addr2Sector(i_addr,&snum)==LPC17xx_IAP_CMD_SUCCESS;
16 NyLPC_TUInt8 _work[256];
19 NyLPC_TBool NyLPC_cOnchipFlashWriter_write(const void* i_dest,const void* i_src,NyLPC_TUInt32 i_size)
24 const char* fblock_addr;
25 const char* dest_addr;
27 NyLPC_TUInt16 s_padding;
28 NyLPC_TUInt16 free_size;
30 NyLPC_OnErrorGoto(Error);
32 if(((NyLPC_TUInt32)i_dest)%4!=0){
33 NyLPC_OnErrorGoto(Error);
36 src=(const char*)i_src;
37 dest_addr=(const char*)i_dest;
40 s_padding=((NyLPC_TUInt32)dest_addr)%256;
42 fblock_addr=dest_addr-s_padding;
44 free_size=256-s_padding;
46 wsize=(free_size>size)?size:free_size;
47 //Flashから一時RAMへ前方パディングを読む
49 memcpy(_work,fblock_addr,s_padding);
52 memcpy(_work+s_padding,src,wsize);
54 if(256-(wsize+s_padding)>0){
55 memcpy(_work+s_padding+wsize,fblock_addr+(wsize+s_padding),256-(wsize+s_padding));
60 if(!LPC17xx_IAP_addr2Sector(fblock_addr,&snum)){
61 NyLPC_OnErrorGoto(Error);
65 if(LPC17xx_IAP_CMD_SUCCESS!=LPC17xx_IAP_prepare(snum,snum)){
66 NyLPC_OnErrorGoto(Error);
69 if(LPC17xx_IAP_CMD_SUCCESS!=LPC17xx_IAP_copyRam2Flash(fblock_addr,_work,256)){
70 NyLPC_OnErrorGoto(Error);
76 return NyLPC_TBool_TRUE;
78 return NyLPC_TBool_FALSE;
82 * セクタ+オフセット形式で、データを書き込みます。
84 NyLPC_TBool NyLPC_cOnchipFlashWriter_writeSector(NyLPC_TUInt16 i_sector,NyLPC_TUInt32 i_offset,const void* i_src,NyLPC_TUInt32 i_size)
87 if(!LPC17xx_IAP_sector2Addr(i_sector,&addr)){
88 return NyLPC_TBool_FALSE;
90 addr=(void*)((NyLPC_TUInt32)addr+i_offset);
91 return NyLPC_cOnchipFlashWriter_write(addr,i_src,i_size);
95 * FlashRomのセクタ番号Nにイレースを実行します。
97 NyLPC_TBool NyLPC_cOnchipFlashWriter_elase(NyLPC_TUInt16 i_sector_s,NyLPC_TUInt16 i_sector_e)
99 if(LPC17xx_IAP_CMD_SUCCESS!=LPC17xx_IAP_prepare(i_sector_s,i_sector_e)){
100 return NyLPC_TBool_FALSE;
102 if(LPC17xx_IAP_CMD_SUCCESS!=LPC17xx_IAP_erase(i_sector_s,i_sector_e)){
103 return NyLPC_TBool_FALSE;
105 return NyLPC_TBool_TRUE;
112 unsigned long buf[128]={0x1,0x2,0x03,0x04,0x05};
113 #define MIMIC_CONFIG_ADDR ((long*)(0x00018000+1280))
116 NyLPC_TcFlashWriter_t writer;
117 NyLPC_cFlashWriter_initialize(&writer);
119 NyLPC_cFlashWriter_elase(&writer,29);
120 // NyLPC_cFlashWriter_write(&writer,MIMIC_CONFIG_ADDR-8,buf,5*4);
121 NyLPC_cFlashWriter_finalize(&writer);