OSDN Git Service

git-svn-id: http://svn.osdn.jp/svnroot/mimic/trunk@42 47198e57-cb75-475f-84c4-a814cd6...
authornyatla <nyatla@47198e57-cb75-475f-84c4-a814cd6f29e0>
Mon, 17 Oct 2011 15:02:54 +0000 (15:02 +0000)
committernyatla <nyatla@47198e57-cb75-475f-84c4-a814cd6f29e0>
Mon, 17 Oct 2011 15:02:54 +0000 (15:02 +0000)
lib/src/flash/NyLPC_cOnchipFlashWriter.c [new file with mode: 0644]
lib/src/flash/NyLPC_cOnchipFlashWriter.h [new file with mode: 0644]

diff --git a/lib/src/flash/NyLPC_cOnchipFlashWriter.c b/lib/src/flash/NyLPC_cOnchipFlashWriter.c
new file mode 100644 (file)
index 0000000..e6aa014
--- /dev/null
@@ -0,0 +1,126 @@
+#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
diff --git a/lib/src/flash/NyLPC_cOnchipFlashWriter.h b/lib/src/flash/NyLPC_cOnchipFlashWriter.h
new file mode 100644 (file)
index 0000000..944e2cf
--- /dev/null
@@ -0,0 +1,22 @@
+#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