+++ /dev/null
-#include "../driver/flash/LPC17xx_IAP.h"\r
-#include "NyLPC_cOnchipFlashWriter.h"\r
-\r
-\r
-/**\r
- * 指定したアドレスが、オンチップフラッシュかどうか\r
- */\r
-NyLPC_TBool NyLPC_cOnchipFlashWriter_isOnchipFlash(const void* i_addr)\r
-{\r
- unsigned long snum;\r
- return LPC17xx_IAP_addr2Sector(i_addr,&snum)==LPC17xx_IAP_CMD_SUCCESS;\r
-}\r
-\r
-NyLPC_TUInt8 _work[256];\r
-\r
-\r
-NyLPC_TBool NyLPC_cOnchipFlashWriter_write(const void* i_dest,const void* i_src,NyLPC_TUInt32 i_size)\r
-{\r
- NyLPC_TUInt32 size;\r
- const char* src;\r
- NyLPC_TUInt32 snum;\r
- const char* fblock_addr;\r
- const char* 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=(const char*)i_src;\r
- dest_addr=(const char*)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(_work,fblock_addr,s_padding);\r
- }\r
- //書き込むデータを一時RAMへ書き込む\r
- memcpy(_work+s_padding,src,wsize);\r
- //後半\r
- if(256-(wsize+s_padding)>0){\r
- memcpy(_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,_work,256)){\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_TUInt16 i_sector,NyLPC_TUInt32 i_offset,const void* i_src,NyLPC_TUInt32 i_size)\r
-{\r
- void* addr;\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(addr,i_src,i_size);\r
-\r
-}\r
-/**\r
- * FlashRomのセクタ番号Nにイレースを実行します。\r
- */\r
-NyLPC_TBool NyLPC_cOnchipFlashWriter_elase(NyLPC_TUInt16 i_sector_s,NyLPC_TUInt16 i_sector_e)\r
-{\r
- if(LPC17xx_IAP_CMD_SUCCESS!=LPC17xx_IAP_prepare(i_sector_s,i_sector_e)){\r
- return NyLPC_TBool_FALSE;\r
- }\r
- if(LPC17xx_IAP_CMD_SUCCESS!=LPC17xx_IAP_erase(i_sector_s,i_sector_e)){\r
- return NyLPC_TBool_FALSE;\r
- }\r
- return NyLPC_TBool_TRUE;\r
-}\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