Ryo Iizuka / libMiMic

Dependents:   MbedFileServer_1768MiniDK2 RedWireBridge IssueDebug_gcc MiMicRemoteMCU-for-Mbed ... more

Committer:
nyatla
Date:
Wed Mar 27 12:07:47 2013 +0000
Revision:
2:b96c1e90d120
???????????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nyatla 2:b96c1e90d120 1 #include "../driver/flash/LPC17xx_IAP.h"
nyatla 2:b96c1e90d120 2 #include "NyLPC_cOnchipFlashWriter.h"
nyatla 2:b96c1e90d120 3
nyatla 2:b96c1e90d120 4
nyatla 2:b96c1e90d120 5 /**
nyatla 2:b96c1e90d120 6 * 指定したアドレスが、オンチップフラッシュかどうか
nyatla 2:b96c1e90d120 7 */
nyatla 2:b96c1e90d120 8 NyLPC_TBool NyLPC_cOnchipFlashWriter_isOnchipFlash(const void* i_addr)
nyatla 2:b96c1e90d120 9 {
nyatla 2:b96c1e90d120 10 unsigned long snum;
nyatla 2:b96c1e90d120 11 return LPC17xx_IAP_addr2Sector(i_addr,&snum)==LPC17xx_IAP_CMD_SUCCESS;
nyatla 2:b96c1e90d120 12 }
nyatla 2:b96c1e90d120 13
nyatla 2:b96c1e90d120 14 NyLPC_TUInt8 _work[256];
nyatla 2:b96c1e90d120 15
nyatla 2:b96c1e90d120 16
nyatla 2:b96c1e90d120 17 NyLPC_TBool NyLPC_cOnchipFlashWriter_write(const void* i_dest,const void* i_src,NyLPC_TUInt32 i_size)
nyatla 2:b96c1e90d120 18 {
nyatla 2:b96c1e90d120 19 NyLPC_TUInt32 size;
nyatla 2:b96c1e90d120 20 const char* src;
nyatla 2:b96c1e90d120 21 NyLPC_TUInt32 snum;
nyatla 2:b96c1e90d120 22 const char* fblock_addr;
nyatla 2:b96c1e90d120 23 const char* dest_addr;
nyatla 2:b96c1e90d120 24 NyLPC_TUInt32 wsize;
nyatla 2:b96c1e90d120 25 NyLPC_TUInt16 s_padding;
nyatla 2:b96c1e90d120 26 NyLPC_TUInt16 free_size;
nyatla 2:b96c1e90d120 27 if(i_size%4!=0){
nyatla 2:b96c1e90d120 28 NyLPC_OnErrorGoto(Error);
nyatla 2:b96c1e90d120 29 }
nyatla 2:b96c1e90d120 30 if(((NyLPC_TUInt32)i_dest)%4!=0){
nyatla 2:b96c1e90d120 31 NyLPC_OnErrorGoto(Error);
nyatla 2:b96c1e90d120 32 }
nyatla 2:b96c1e90d120 33 size=i_size;
nyatla 2:b96c1e90d120 34 src=(const char*)i_src;
nyatla 2:b96c1e90d120 35 dest_addr=(const char*)i_dest;
nyatla 2:b96c1e90d120 36 for(;size>0;){
nyatla 2:b96c1e90d120 37 //開始位置の端数を調べる
nyatla 2:b96c1e90d120 38 s_padding=((NyLPC_TUInt32)dest_addr)%256;
nyatla 2:b96c1e90d120 39 //書き込みアドレス取得
nyatla 2:b96c1e90d120 40 fblock_addr=dest_addr-s_padding;
nyatla 2:b96c1e90d120 41 //書込み可能サイズを計算
nyatla 2:b96c1e90d120 42 free_size=256-s_padding;
nyatla 2:b96c1e90d120 43 //書込みサイズを決定
nyatla 2:b96c1e90d120 44 wsize=free_size>size?size:free_size;
nyatla 2:b96c1e90d120 45 //Flashから一時RAMへ前方パディングを読む
nyatla 2:b96c1e90d120 46 if(s_padding>0){
nyatla 2:b96c1e90d120 47 memcpy(_work,fblock_addr,s_padding);
nyatla 2:b96c1e90d120 48 }
nyatla 2:b96c1e90d120 49 //書き込むデータを一時RAMへ書き込む
nyatla 2:b96c1e90d120 50 memcpy(_work+s_padding,src,wsize);
nyatla 2:b96c1e90d120 51 //後半
nyatla 2:b96c1e90d120 52 if(256-(wsize+s_padding)>0){
nyatla 2:b96c1e90d120 53 memcpy(_work+s_padding+wsize,fblock_addr+(wsize+s_padding),256-(wsize+s_padding));
nyatla 2:b96c1e90d120 54 }
nyatla 2:b96c1e90d120 55
nyatla 2:b96c1e90d120 56 //Flashへ書込み
nyatla 2:b96c1e90d120 57 //開始セクタ
nyatla 2:b96c1e90d120 58 if(!LPC17xx_IAP_addr2Sector(fblock_addr,&snum)){
nyatla 2:b96c1e90d120 59 NyLPC_OnErrorGoto(Error);
nyatla 2:b96c1e90d120 60 }
nyatla 2:b96c1e90d120 61 //IAPのprepareコマンド
nyatla 2:b96c1e90d120 62
nyatla 2:b96c1e90d120 63 if(LPC17xx_IAP_CMD_SUCCESS!=LPC17xx_IAP_prepare(snum,snum)){
nyatla 2:b96c1e90d120 64 NyLPC_OnErrorGoto(Error);
nyatla 2:b96c1e90d120 65 }
nyatla 2:b96c1e90d120 66 //IAPのwriteコマンド
nyatla 2:b96c1e90d120 67 if(LPC17xx_IAP_CMD_SUCCESS!=LPC17xx_IAP_copyRam2Flash(fblock_addr,_work,256)){
nyatla 2:b96c1e90d120 68 NyLPC_OnErrorGoto(Error);
nyatla 2:b96c1e90d120 69 }
nyatla 2:b96c1e90d120 70 dest_addr+=wsize;
nyatla 2:b96c1e90d120 71 src+=wsize;
nyatla 2:b96c1e90d120 72 size-=wsize;
nyatla 2:b96c1e90d120 73 }
nyatla 2:b96c1e90d120 74 return NyLPC_TBool_TRUE;
nyatla 2:b96c1e90d120 75 Error:
nyatla 2:b96c1e90d120 76 return NyLPC_TBool_FALSE;
nyatla 2:b96c1e90d120 77 }
nyatla 2:b96c1e90d120 78
nyatla 2:b96c1e90d120 79 /**
nyatla 2:b96c1e90d120 80 * セクタ+オフセット形式で、データを書き込みます。
nyatla 2:b96c1e90d120 81 */
nyatla 2:b96c1e90d120 82 NyLPC_TBool NyLPC_cOnchipFlashWriter_writeSector(NyLPC_TUInt16 i_sector,NyLPC_TUInt32 i_offset,const void* i_src,NyLPC_TUInt32 i_size)
nyatla 2:b96c1e90d120 83 {
nyatla 2:b96c1e90d120 84 void* addr;
nyatla 2:b96c1e90d120 85 if(!LPC17xx_IAP_sector2Addr(i_sector,&addr)){
nyatla 2:b96c1e90d120 86 return NyLPC_TBool_FALSE;
nyatla 2:b96c1e90d120 87 }
nyatla 2:b96c1e90d120 88 addr=(void*)((NyLPC_TUInt32)addr+i_offset);
nyatla 2:b96c1e90d120 89 return NyLPC_cOnchipFlashWriter_write(addr,i_src,i_size);
nyatla 2:b96c1e90d120 90
nyatla 2:b96c1e90d120 91 }
nyatla 2:b96c1e90d120 92 /**
nyatla 2:b96c1e90d120 93 * FlashRomのセクタ番号Nにイレースを実行します。
nyatla 2:b96c1e90d120 94 */
nyatla 2:b96c1e90d120 95 NyLPC_TBool NyLPC_cOnchipFlashWriter_elase(NyLPC_TUInt16 i_sector_s,NyLPC_TUInt16 i_sector_e)
nyatla 2:b96c1e90d120 96 {
nyatla 2:b96c1e90d120 97 if(LPC17xx_IAP_CMD_SUCCESS!=LPC17xx_IAP_prepare(i_sector_s,i_sector_e)){
nyatla 2:b96c1e90d120 98 return NyLPC_TBool_FALSE;
nyatla 2:b96c1e90d120 99 }
nyatla 2:b96c1e90d120 100 if(LPC17xx_IAP_CMD_SUCCESS!=LPC17xx_IAP_erase(i_sector_s,i_sector_e)){
nyatla 2:b96c1e90d120 101 return NyLPC_TBool_FALSE;
nyatla 2:b96c1e90d120 102 }
nyatla 2:b96c1e90d120 103 return NyLPC_TBool_TRUE;
nyatla 2:b96c1e90d120 104 }
nyatla 2:b96c1e90d120 105
nyatla 2:b96c1e90d120 106
nyatla 2:b96c1e90d120 107
nyatla 2:b96c1e90d120 108 #ifdef TEST
nyatla 2:b96c1e90d120 109 #include "stdio.h"
nyatla 2:b96c1e90d120 110 unsigned long buf[128]={0x1,0x2,0x03,0x04,0x05};
nyatla 2:b96c1e90d120 111 #define MIMIC_CONFIG_ADDR ((long*)(0x00018000+1280))
nyatla 2:b96c1e90d120 112 void setup(void)
nyatla 2:b96c1e90d120 113 {
nyatla 2:b96c1e90d120 114 NyLPC_TcFlashWriter_t writer;
nyatla 2:b96c1e90d120 115 NyLPC_cFlashWriter_initialize(&writer);
nyatla 2:b96c1e90d120 116 unsigned long p;
nyatla 2:b96c1e90d120 117 NyLPC_cFlashWriter_elase(&writer,29);
nyatla 2:b96c1e90d120 118 // NyLPC_cFlashWriter_write(&writer,MIMIC_CONFIG_ADDR-8,buf,5*4);
nyatla 2:b96c1e90d120 119 NyLPC_cFlashWriter_finalize(&writer);
nyatla 2:b96c1e90d120 120 return;
nyatla 2:b96c1e90d120 121 }
nyatla 2:b96c1e90d120 122 void loop(void)
nyatla 2:b96c1e90d120 123 {
nyatla 2:b96c1e90d120 124 //Implementation
nyatla 2:b96c1e90d120 125 //ここにメインタスクを書きます。
nyatla 2:b96c1e90d120 126 for(;;){}
nyatla 2:b96c1e90d120 127 }
nyatla 2:b96c1e90d120 128 #endif