--- /dev/null
+#include "../driver/flash/LPC17xx_IAP.h"\r
+#include "NyLPC_cOnchipFlashWriter.h"\r
+\r
+void NyLPC_cOnchipFlashWriter_initialize(NyLPC_TcFlashWriter_t* i_inst)\r
+{\r
+ (void)i_inst;\r
+}\r
+\r
+/**\r
+ * アドレスi_destに、i_srcの内容を書き込みます。\r
+ * 書き込みは、FlashROMがイレース済なものとして実行します。書込み範囲以外のデータは、変更されません。\r
+ * 既に書込み済みのデータがある場合(0xFFFFFFFF以外)は、期待した結果が得られないので、注意してください。\r
+ * この関数は、IAPインタフェイス経由で256バイト単位でデータを書き込みます。\r
+ * IAPは0x1000000から32バイトをワークエリアとして使用します。\r
+ * 関数はワークエリアの待避と復帰を行いますが、安全の為、使用前にRTOSを一旦停止させてください。\r
+ */\r
+NyLPC_TBool NyLPC_cOnchipFlashWriter_write(NyLPC_TcFlashWriter_t* i_inst,void* i_dest,const void* i_src,NyLPC_TUInt32 i_size)\r
+{\r
+ NyLPC_TUInt32 size;\r
+ const void* src;\r
+ NyLPC_TUInt32 snum;\r
+ void* fblock_addr;\r
+ void* dest_addr;\r
+ NyLPC_TUInt32 wsize;\r
+ NyLPC_TUInt16 s_padding;\r
+ NyLPC_TUInt16 free_size;\r
+ if(i_size%4!=0){\r
+ NyLPC_OnErrorGoto(Error);\r
+ }\r
+ if(((NyLPC_TUInt32)i_dest)%4!=0){\r
+ NyLPC_OnErrorGoto(Error);\r
+ }\r
+ size=i_size;\r
+ src=i_src;\r
+ dest_addr=i_dest;\r
+ for(;size>0;){\r
+ //開始位置の端数を調べる\r
+ s_padding=((NyLPC_TUInt32)dest_addr)%256;\r
+ //書き込みアドレス取得\r
+ fblock_addr=dest_addr-s_padding;\r
+ //書込み可能サイズを計算\r
+ free_size=256-s_padding;\r
+ //書込みサイズを決定\r
+ wsize=free_size>size?size:free_size;\r
+ //Flashから一時RAMへ前方パディングを読む\r
+ if(s_padding>0){\r
+ memcpy(i_inst->_work,fblock_addr,s_padding);\r
+ }\r
+ //書き込むデータを一時RAMへ書き込む\r
+ memcpy(i_inst->_work+s_padding,src,wsize);\r
+ //後半\r
+ if(256-(wsize+s_padding)>0){\r
+ memcpy(i_inst->_work+s_padding+wsize,fblock_addr+(wsize+s_padding),256-(wsize+s_padding));\r
+ }\r
+\r
+ //Flashへ書込み\r
+ //開始セクタ\r
+ if(!LPC17xx_IAP_addr2Sector(fblock_addr,&snum)){\r
+ NyLPC_OnErrorGoto(Error);\r
+ }\r
+ //IAPのprepareコマンド\r
+\r
+ if(LPC17xx_IAP_CMD_SUCCESS!=LPC17xx_IAP_prepare(snum,snum)){\r
+ NyLPC_OnErrorGoto(Error);\r
+ }\r
+ //IAPのwriteコマンド\r
+ if(LPC17xx_IAP_CMD_SUCCESS!=LPC17xx_IAP_copyRam2Flash(fblock_addr,i_inst->_work,256,configCPU_CLOCK_HZ/1000)){\r
+ NyLPC_OnErrorGoto(Error);\r
+ }\r
+ dest_addr+=wsize;\r
+ src+=wsize;\r
+ size-=wsize;\r
+ }\r
+ return NyLPC_TBool_TRUE;\r
+Error:\r
+ return NyLPC_TBool_FALSE;\r
+}\r
+\r
+/**\r
+ * セクタ+オフセット形式で、データを書き込みます。\r
+ */\r
+NyLPC_TBool NyLPC_cOnchipFlashWriter_writeSector(NyLPC_TcFlashWriter_t* i_inst,NyLPC_TUInt16 i_sector,NyLPC_TUInt32 i_offset,const void* i_src,NyLPC_TUInt32 i_size)\r
+{\r
+ void* addr;\r
+ (void)i_inst;\r
+ if(!LPC17xx_IAP_sector2Addr(i_sector,&addr)){\r
+ return NyLPC_TBool_FALSE;\r
+ }\r
+ addr=(void*)((NyLPC_TUInt32)addr+i_offset);\r
+ return NyLPC_cOnchipFlashWriter_write(i_inst,addr,i_src,i_size);\r
+\r
+}\r
+/**\r
+ * FlashRomのセクタ番号Nにイレースを実行します。\r
+ */\r
+NyLPC_TBool NyLPC_cOnchipFlashWriter_elase(NyLPC_TcFlashWriter_t* i_inst,NyLPC_TUInt16 i_sector)\r
+{\r
+ (void)i_inst;\r
+ if(LPC17xx_IAP_CMD_SUCCESS!=LPC17xx_IAP_prepare(i_sector,i_sector)){\r
+ return NyLPC_TBool_FALSE;\r
+ }\r
+ return LPC17xx_IAP_erase(i_sector,i_sector)==LPC17xx_IAP_CMD_SUCCESS;\r
+}\r
+\r
+\r
+#ifdef TEST\r
+#include "stdio.h"\r
+unsigned long buf[128]={0x1,0x2,0x03,0x04,0x05};\r
+#define MIMIC_CONFIG_ADDR ((long*)(0x00018000+1280))\r
+void setup(void)\r
+{\r
+ NyLPC_TcFlashWriter_t writer;\r
+ NyLPC_cFlashWriter_initialize(&writer);\r
+ unsigned long p;\r
+ NyLPC_cFlashWriter_elase(&writer,29);\r
+// NyLPC_cFlashWriter_write(&writer,MIMIC_CONFIG_ADDR-8,buf,5*4);\r
+ NyLPC_cFlashWriter_finalize(&writer);\r
+ return;\r
+}\r
+void loop(void)\r
+{\r
+ //Implementation\r
+ //ここにメインタスクを書きます。\r
+ for(;;){}\r
+}\r
+#endif\r
--- /dev/null
+#ifndef cOnchipFlashWriter_h\r
+#define cOnchipFlashWriter_h\r
+\r
+\r
+#include "NyLPC_stdlib.h"\r
+typedef struct NyLPC_TcFlashWriter NyLPC_TcFlashWriter_t;\r
+\r
+struct NyLPC_TcFlashWriter\r
+{\r
+ NyLPC_TUInt8 _work[256];\r
+};\r
+\r
+void NyLPC_cOnchipFlashWriter_initialize(NyLPC_TcFlashWriter_t* i_inst);\r
+\r
+#define NyLPC_cOnchipFlashWriter_finalize(i)\r
+\r
+NyLPC_TBool NyLPC_cOnchipFlashWriter_write(NyLPC_TcFlashWriter_t* i_inst,void* i_dest,const void* i_src,NyLPC_TUInt32 i_size);\r
+NyLPC_TBool NyLPC_cOnchipFlashWriter_writeSector(NyLPC_TcFlashWriter_t* i_inst,NyLPC_TUInt16 i_sector,NyLPC_TUInt32 i_offset,const void* i_src,NyLPC_TUInt32 i_size);\r
+NyLPC_TBool NyLPC_cOnchipFlashWriter_elase(NyLPC_TcFlashWriter_t* i_inst,NyLPC_TUInt16 i_sector);\r
+\r
+\r
+#endif\r