Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: MbedFileServer_1768MiniDK2 RedWireBridge IssueDebug_gcc MiMicRemoteMCU-for-Mbed ... more
core/flash/NyLPC_cOnchipFlashWriter.cpp@2:b96c1e90d120, 2013-03-27 (annotated)
- Committer:
- nyatla
- Date:
- Wed Mar 27 12:07:47 2013 +0000
- Revision:
- 2:b96c1e90d120
???????????
Who changed what in which revision?
| User | Revision | Line number | New 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 |
MiMic Webservice library