⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bootloader__smbus_8c-source.html

📁 用AVR453开发的电池保护板的C语言程序,希望对大家有用!
💻 HTML
📖 第 1 页 / 共 5 页
字号:
<a name="l00132"></a><a class="code" href="bootloader__smbus_8c.html#a93bb9475312d52163242a36b2652bb4">00132</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> <a class="code" href="bootloader__smbus_8c.html#a93bb9475312d52163242a36b2652bb4">himemptr</a>;<a name="l00133"></a><a class="code" href="bootloader__smbus_8c.html#8e3bac330c64c9deefbd3605f77323e4">00133</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> __flash *<a class="code" href="bootloader__smbus_8c.html#8e3bac330c64c9deefbd3605f77323e4">fptr</a>;<a name="l00134"></a><a class="code" href="bootloader__smbus_8c.html#ece2a19d58ca9b881d1280c7fbe977c6">00134</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="bootloader__smbus_8c.html#ece2a19d58ca9b881d1280c7fbe977c6">eptr</a>;<a name="l00135"></a>00135 <a name="l00136"></a><a class="code" href="bootloader__smbus_8c.html#1cd95335409307dbc90c0758d969f5f5">00136</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> <a class="code" href="bootloader__smbus_8c.html#1cd95335409307dbc90c0758d969f5f5">SRAMbuffer</a>[128];          <span class="comment">//this is the size of a Flash page (64 *WORDS*)</span><a name="l00137"></a>00137 <a name="l00138"></a>00138 <span class="comment">//This byte contains flags from the TWI handler to tell the Foreground code what to do.</span><a name="l00139"></a>00139 <span class="comment">//If this byte is ever non-zero, the foreground code will act on its contents.</span><a name="l00140"></a>00140 <span class="comment">//Although it is written by both the Handler and the Foreground code, it does not</span><a name="l00141"></a>00141 <span class="comment">//  need to be declared VOLATILE because the SMBus is halted until the foreground</span><a name="l00142"></a>00142 <span class="comment">//  code finishes processing the associated command and has cleared this flag byte.</span><a name="l00143"></a><a class="code" href="bootloader__smbus_8c.html#72f0b2eb64dd62ffa6bb85ef96947543">00143</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> <a class="code" href="bootloader__smbus_8c.html#72f0b2eb64dd62ffa6bb85ef96947543">TWI_CmdFlags</a>;<a name="l00144"></a><a class="code" href="bootloader__smbus_8c.html#75ae04e7aaa973e59f86209a3e8f7d3c">00144</a> <span class="preprocessor">  #define SMB_GenBusTimeout 1   </span><span class="comment">/* Tell Foreground to generate a bus timeout, as we saw an error! */</span><a name="l00145"></a><a class="code" href="bootloader__smbus_8c.html#1fef3300524ef987fa146cc892813b20">00145</a> <span class="preprocessor">  #define SMB_SetUpReply 2      </span><span class="comment">/* Have Foreground set up TW_TxBuf[]. */</span><a name="l00146"></a><a class="code" href="bootloader__smbus_8c.html#07b00aac11ba389d5b53e2f9d54bd0bd">00146</a> <span class="preprocessor">  #define SMB_GotCmdData 4      </span><span class="comment">/* Have Foreground interpret the complete received command. */</span><a name="l00147"></a>00147 <a name="l00148"></a>00148 <a name="l00149"></a><a class="code" href="bootloader__smbus_8c.html#5eb4c6bfb0fa42aab6bbd6d25337fd6f">00149</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> <a class="code" href="bootloader__smbus_8c.html#5eb4c6bfb0fa42aab6bbd6d25337fd6f">Status</a>;           <span class="comment">//this is a global variable and is the sole response to a READ using cmd 0x2F.</span><a name="l00150"></a><a class="code" href="bootloader__smbus_8c.html#a90cac659d18e8ef6294c7ae337f6b58">00150</a> <span class="preprocessor">  #define SUCCESS 0</span><a name="l00151"></a><a class="code" href="bootloader__smbus_8c.html#b5be0aaddb58ffb9cb20c12530d66316">00151</a> <span class="preprocessor"></span><span class="preprocessor">  #define BUSY    1</span><a name="l00152"></a><a class="code" href="bootloader__smbus_8c.html#9ad73643b862d17f759047e3fd0f5cd5">00152</a> <span class="preprocessor"></span><span class="preprocessor">  #define BADPARAM 2</span><a name="l00153"></a><a class="code" href="bootloader__smbus_8c.html#428c1bb99a2b2e3ecd49a647df228c4e">00153</a> <span class="preprocessor"></span><span class="preprocessor">  #define CRCERROR 3</span><a name="l00154"></a><a class="code" href="bootloader__smbus_8c.html#6d58f9ac447476b4e084d7ca383f5183">00154</a> <span class="preprocessor"></span><span class="preprocessor">  #define FAILURE  0xFF</span><a name="l00155"></a>00155 <span class="preprocessor"></span><a name="l00156"></a>00156 <a name="l00157"></a>00157 <span class="comment">//=======================================================================</span><a name="l00158"></a>00158 <a name="l00159"></a>00159 <span class="comment">// Reset Management theory:</span><a name="l00160"></a>00160 <span class="comment">//</span><a name="l00161"></a>00161 <span class="comment">// To make it easier to enter the bootloader when the OptionalMfgCmd5 command is received</span><a name="l00162"></a>00162 <span class="comment">// while running the SMBus interpreter in the application code, we monitor the Reset</span><a name="l00163"></a>00163 <span class="comment">// Source flags.  If we arrive here without any flags being asserted, then we can assume</span><a name="l00164"></a>00164 <span class="comment">// that we have jumped here from the application, and we can therefore assume that it is</span><a name="l00165"></a>00165 <span class="comment">// intended that the bootloader code be run.</span><a name="l00166"></a>00166 <span class="comment">// Otherwise, if any reset flag IS asserted when we enter, we check if there is a valid</span><a name="l00167"></a>00167 <span class="comment">// vector present at 0x0000; if not, we run the bootloader in order to retrieve a valid</span><a name="l00168"></a>00168 <span class="comment">// image, otherwise, we jump down to the application program and run it.</span><a name="l00169"></a>00169 <span class="comment">//</span><a name="l00173"></a>00173 <span class="comment"></span><a name="l00174"></a><a class="code" href="bootloader__smbus_8c.html#e6e9b988b436cbf2a1c487e85b7da284">00174</a> <span class="keywordtype">void</span> <a class="code" href="bootloader__smbus_8c.html#e6e9b988b436cbf2a1c487e85b7da284">__low_level_init</a>(<span class="keywordtype">void</span>)<a name="l00175"></a>00175 {<a name="l00176"></a>00176   <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> __flash * ptr = 0;<a name="l00177"></a>00177 <a name="l00178"></a>00178   <span class="keywordflow">if</span>(!(MCUSR))    <span class="comment">//If no reset source is asserted, we probably came here from the App code deliberately.</span><a name="l00179"></a>00179     <span class="keywordflow">return</span>;       <span class="comment">//Assume we need to run the BootLoader.</span><a name="l00180"></a>00180 <a name="l00181"></a>00181   <span class="comment">// Some reset source was asserted. If it was Wdog, there may be a code problem and we</span><a name="l00182"></a>00182   <span class="comment">// may need to handle it differently from other reset sources.  If so, add that code here.</span><a name="l00183"></a>00183   <span class="keywordflow">if</span>(MCUSR &amp; (1&lt;&lt;WDRF))<a name="l00184"></a>00184   {<a name="l00186"></a>00186   }<a name="l00187"></a>00187 <a name="l00188"></a>00188   <span class="comment">//Some reset source was asserted, so if Reset vector is FFFF, assume we need to run the bootloader,</span><a name="l00189"></a>00189   <span class="comment">// otherwise jump to the application code reset vector at 0x0000 and assume the App code is OK.</span><a name="l00190"></a>00190   <span class="keywordflow">if</span>((*ptr++ != 0xFF) || (*ptr != 0xFF))<a name="l00191"></a>00191   {<a name="l00192"></a>00192     MCUCR &amp;= (1&lt;&lt;IVSEL);<a name="l00193"></a>00193     <span class="keyword">asm</span>(<span class="stringliteral">"jmp 0"</span>);<a name="l00194"></a>00194   }<a name="l00195"></a>00195 <a name="l00196"></a>00196   <span class="comment">//At this point, we apparently need to run the Bootloader code, as App section image appears invalid.</span><a name="l00197"></a>00197 }<a name="l00198"></a>00198 <a name="l00199"></a>00199 <a name="l00200"></a>00200 <a name="l00201"></a>00201 <a name="l00202"></a><a class="code" href="bootloader__smbus_8c.html#032b86b5f939827a0002366ac7fc8bec">00202</a> <span class="keywordtype">void</span> <a class="code" href="bootloader__smbus_8c.html#032b86b5f939827a0002366ac7fc8bec">init_boot</a>(<span class="keywordtype">void</span>)<a name="l00203"></a>00203 {<a name="l00204"></a>00204   __disable_interrupt();<a name="l00205"></a>00205   <a class="code" href="bootloader__smbus_8c.html#1b712ae6a56048cf3cce7c93ed2ed6c1">TW_TxBufCnt</a> = 0;      <span class="comment">//how many valid bytes are in the buffer</span><a name="l00206"></a>00206   <a class="code" href="bootloader__smbus_8c.html#ce8ce6c26dcb95748ab5026ce7157bf7">TW_TxBufIndex</a> = 0;<a name="l00207"></a>00207   <a class="code" href="bootloader__smbus_8c.html#d200369e2af9e1b8a915e2e856190208">TW_RxBufCnt</a> = 0;<a name="l00208"></a>00208   <a class="code" href="bootloader__smbus_8c.html#98071e48f8969fdd79e1fa2337d0b6dd">TW_RxBufIndex</a> = 0;<a name="l00209"></a>00209   <a class="code" href="bootloader__smbus_8c.html#92d370ad8db899645afdd375ba4a8130">TW_state</a> = 0;<a name="l00210"></a>00210   <a class="code" href="bootloader__smbus_8c.html#fd9b3e99365b45af6cf763b2dda41546">UsePEC</a> = 0;<a name="l00211"></a>00211   <a class="code" href="bootloader__smbus_8c.html#5eb4c6bfb0fa42aab6bbd6d25337fd6f">Status</a> = <a class="code" href="bootloader__smbus_8c.html#a90cac659d18e8ef6294c7ae337f6b58">SUCCESS</a>;<a name="l00212"></a>00212   <a class="code" href="bootloader__smbus_8c.html#f33d081c122ae07ed5bc40dde462f294">LoopFlag</a> = 0;<a name="l00213"></a>00213   <a class="code" href="bootloader__smbus_8c.html#e5fb78965cdd51da0320fc04a23cc31b">BigData</a> = 0;<a name="l00214"></a>00214 <a name="l00215"></a>00215   <a class="code" href="bootloader__smbus_8c.html#a43740bb86658af2f20234cc35e87e1c">SMB_RestoreBus</a>();<a name="l00216"></a>00216   TWBCSR = (1&lt;&lt;TWBCIF) | (1&lt;&lt;TWBDT1) | (1&lt;&lt;TWBDT0) | (0&lt;&lt;TWBCIP);<a name="l00217"></a>00217 }<a name="l00218"></a>00218 <a name="l00219"></a>00219 <a name="l00220"></a>00220 <span class="comment">/* ************************************************************* */</span><a name="l00221"></a>00221 <span class="comment">/* ************************************************************* */</span><a name="l00222"></a>00222 <span class="comment">/* ************************************************************* */</span><a name="l00223"></a>00223 <a name="l00224"></a>00224 <span class="comment">//The following functions are included to demonstrate how the incoming</span><a name="l00225"></a>00225 <span class="comment">// data should be set up for SMBus-based ISP commands.</span><a name="l00226"></a>00226 <a name="l00227"></a>00227 <span class="preprocessor">#ifdef ENABLE_TESTCODE</span><a name="l00228"></a>00228 <span class="preprocessor"></span><a name="l00229"></a>00229 <span class="keywordtype">void</span> BOOT_TEST_EF(<span class="keywordtype">void</span>)<a name="l00230"></a>00230 {<a name="l00231"></a>00231   <span class="comment">//Test the Flash Page Erase functionality (put junk at 0x0000-0x007F first)</span><a name="l00232"></a>00232   <a class="code" href="bootloader__smbus_8c.html#72f0b2eb64dd62ffa6bb85ef96947543">TWI_CmdFlags</a> = <a class="code" href="bootloader__smbus_8c.html#07b00aac11ba389d5b53e2f9d54bd0bd">SMB_GotCmdData</a>;<a name="l00233"></a>00233   <a class="code" href="bootloader__smbus_8c.html#49479463989e8f9b15cb6aa66d0667e7">TW_RxBuf</a>[<a class="code" href="bootldr_8h.html#a6b1406a3ded6ea3def7319dd62d7c8d">TWRX_CMD</a>] = <span class="charliteral">'E'</span>;     <span class="comment">//Erase</span><a name="l00234"></a>00234   <a class="code" href="bootloader__smbus_8c.html#49479463989e8f9b15cb6aa66d0667e7">TW_RxBuf</a>[<a class="code" href="bootldr_8h.html#f122e625ae38e7c9c16f6640c651c7e8">TWRX_MEM</a>] = <span class="charliteral">'F'</span>;     <span class="comment">//flash</span><a name="l00235"></a>00235   <a class="code" href="bootloader__smbus_8c.html#49479463989e8f9b15cb6aa66d0667e7">TW_RxBuf</a>[<a class="code" href="bootldr_8h.html#a27fad614b6b509fe1e28c01adbc15d8">TWRX_LOADDR</a>] = 0x80;<a name="l00236"></a>00236   <a class="code" href="bootloader__smbus_8c.html#49479463989e8f9b15cb6aa66d0667e7">TW_RxBuf</a>[<a class="code" href="bootldr_8h.html#b17ffa480c03b59856acae152bb90f90">TWRX_HIADDR</a>] = 0;<a name="l00237"></a>00237   <a class="code" href="bootloader__smbus_8c.html#fd9b3e99365b45af6cf763b2dda41546">UsePEC</a> = 0;<a name="l00238"></a>00238 }<a name="l00239"></a>00239 <a name="l00240"></a>00240 <span class="keywordtype">void</span> BOOT_TEST_EE(<span class="keywordtype">void</span>)<a name="l00241"></a>00241 {<a name="l00242"></a>00242   <span class="comment">//Test the EEPROM Erase functionality (put junk at 0x1F0-0x1FF first; should only erase through 0x1F9)</span>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -