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

📄 floppy.c

📁 linux0.11 version(301k)
💻 C
📖 第 1 页 / 共 4 页
字号:
<a name=L222 href="source/kernel/blk_drv/floppy.c#L222">222</a>                 if (status == (<a href="ident?i=STATUS_DIR">STATUS_DIR</a>|<a href="ident?i=STATUS_READY">STATUS_READY</a>|<a href="ident?i=STATUS_BUSY">STATUS_BUSY</a>)) {<a name=L223 href="source/kernel/blk_drv/floppy.c#L223">223</a>                         if (i &gt;= <a href="ident?i=MAX_REPLIES">MAX_REPLIES</a>)<a name=L224 href="source/kernel/blk_drv/floppy.c#L224">224</a>                                 break;<a name=L225 href="source/kernel/blk_drv/floppy.c#L225">225</a>                         <a href="ident?i=reply_buffer">reply_buffer</a>[i++] = <a href="ident?i=inb_p">inb_p</a>(<a href="ident?i=FD_DATA">FD_DATA</a>);<a name=L226 href="source/kernel/blk_drv/floppy.c#L226">226</a>                 }<a name=L227 href="source/kernel/blk_drv/floppy.c#L227">227</a>         }<a name=L228 href="source/kernel/blk_drv/floppy.c#L228">228</a>         <a href="ident?i=reset">reset</a> = 1;<a name=L229 href="source/kernel/blk_drv/floppy.c#L229">229</a>         <a href="ident?i=printk">printk</a>(<i>"Getstatus times out\n\r"</i>);<a name=L230 href="source/kernel/blk_drv/floppy.c#L230">230</a>         return -1;<a name=L231 href="source/kernel/blk_drv/floppy.c#L231">231</a> }<a name=L232 href="source/kernel/blk_drv/floppy.c#L232">232</a> <a name=L233 href="source/kernel/blk_drv/floppy.c#L233">233</a> static void <a href="ident?i=bad_flp_intr">bad_flp_intr</a>(void)<a name=L234 href="source/kernel/blk_drv/floppy.c#L234">234</a> {<a name=L235 href="source/kernel/blk_drv/floppy.c#L235">235</a>         <a href="ident?i=CURRENT">CURRENT</a>-&gt;errors++;<a name=L236 href="source/kernel/blk_drv/floppy.c#L236">236</a>         if (<a href="ident?i=CURRENT">CURRENT</a>-&gt;errors &gt; <a href="ident?i=MAX_ERRORS">MAX_ERRORS</a>) {<a name=L237 href="source/kernel/blk_drv/floppy.c#L237">237</a>                 <a href="ident?i=floppy_deselect">floppy_deselect</a>(<a href="ident?i=current_drive">current_drive</a>);<a name=L238 href="source/kernel/blk_drv/floppy.c#L238">238</a>                 <a href="ident?i=end_request">end_request</a>(0);<a name=L239 href="source/kernel/blk_drv/floppy.c#L239">239</a>         }<a name=L240 href="source/kernel/blk_drv/floppy.c#L240">240</a>         if (<a href="ident?i=CURRENT">CURRENT</a>-&gt;errors &gt; <a href="ident?i=MAX_ERRORS">MAX_ERRORS</a>/2)<a name=L241 href="source/kernel/blk_drv/floppy.c#L241">241</a>                 <a href="ident?i=reset">reset</a> = 1;<a name=L242 href="source/kernel/blk_drv/floppy.c#L242">242</a>         else<a name=L243 href="source/kernel/blk_drv/floppy.c#L243">243</a>                 <a href="ident?i=recalibrate">recalibrate</a> = 1;<a name=L244 href="source/kernel/blk_drv/floppy.c#L244">244</a> }       <a name=L245 href="source/kernel/blk_drv/floppy.c#L245">245</a> <a name=L246 href="source/kernel/blk_drv/floppy.c#L246">246</a> <b><i>/*</i></b><a name=L247 href="source/kernel/blk_drv/floppy.c#L247">247</a> <b><i> * Ok, this interrupt is called after a DMA read/write has succeeded,</i></b><a name=L248 href="source/kernel/blk_drv/floppy.c#L248">248</a> <b><i> * so we check the results, and copy any buffers.</i></b><a name=L249 href="source/kernel/blk_drv/floppy.c#L249">249</a> <b><i> */</i></b><a name=L250 href="source/kernel/blk_drv/floppy.c#L250">250</a> static void <a href="ident?i=rw_interrupt">rw_interrupt</a>(void)<a name=L251 href="source/kernel/blk_drv/floppy.c#L251">251</a> {<a name=L252 href="source/kernel/blk_drv/floppy.c#L252">252</a>         if (<a href="ident?i=result">result</a>() != 7 || (<a href="ident?i=ST0">ST0</a> &amp; 0xf8) || (<a href="ident?i=ST1">ST1</a> &amp; 0xbf) || (<a href="ident?i=ST2">ST2</a> &amp; 0x73)) {<a name=L253 href="source/kernel/blk_drv/floppy.c#L253">253</a>                 if (<a href="ident?i=ST1">ST1</a> &amp; 0x02) {<a name=L254 href="source/kernel/blk_drv/floppy.c#L254">254</a>                         <a href="ident?i=printk">printk</a>(<i>"Drive %d is write protected\n\r"</i>,<a href="ident?i=current_drive">current_drive</a>);<a name=L255 href="source/kernel/blk_drv/floppy.c#L255">255</a>                         <a href="ident?i=floppy_deselect">floppy_deselect</a>(<a href="ident?i=current_drive">current_drive</a>);<a name=L256 href="source/kernel/blk_drv/floppy.c#L256">256</a>                         <a href="ident?i=end_request">end_request</a>(0);<a name=L257 href="source/kernel/blk_drv/floppy.c#L257">257</a>                 } else<a name=L258 href="source/kernel/blk_drv/floppy.c#L258">258</a>                         <a href="ident?i=bad_flp_intr">bad_flp_intr</a>();<a name=L259 href="source/kernel/blk_drv/floppy.c#L259">259</a>                 <a href="ident?i=do_fd_request">do_fd_request</a>();<a name=L260 href="source/kernel/blk_drv/floppy.c#L260">260</a>                 return;<a name=L261 href="source/kernel/blk_drv/floppy.c#L261">261</a>         }<a name=L262 href="source/kernel/blk_drv/floppy.c#L262">262</a>         if (<a href="ident?i=command">command</a> == <a href="ident?i=FD_READ">FD_READ</a> &amp;&amp; (unsigned long)(<a href="ident?i=CURRENT">CURRENT</a>-&gt;buffer) &gt;= 0x100000)<a name=L263 href="source/kernel/blk_drv/floppy.c#L263">263</a>                 <a href="ident?i=copy_buffer">copy_buffer</a>(<a href="ident?i=tmp_floppy_area">tmp_floppy_area</a>,<a href="ident?i=CURRENT">CURRENT</a>-&gt;buffer);<a name=L264 href="source/kernel/blk_drv/floppy.c#L264">264</a>         <a href="ident?i=floppy_deselect">floppy_deselect</a>(<a href="ident?i=current_drive">current_drive</a>);<a name=L265 href="source/kernel/blk_drv/floppy.c#L265">265</a>         <a href="ident?i=end_request">end_request</a>(1);<a name=L266 href="source/kernel/blk_drv/floppy.c#L266">266</a>         <a href="ident?i=do_fd_request">do_fd_request</a>();<a name=L267 href="source/kernel/blk_drv/floppy.c#L267">267</a> }<a name=L268 href="source/kernel/blk_drv/floppy.c#L268">268</a> <a name=L269 href="source/kernel/blk_drv/floppy.c#L269">269</a> inline void <a href="ident?i=setup_rw_floppy">setup_rw_floppy</a>(void)<a name=L270 href="source/kernel/blk_drv/floppy.c#L270">270</a> {<a name=L271 href="source/kernel/blk_drv/floppy.c#L271">271</a>         <a href="ident?i=setup_DMA">setup_DMA</a>();<a name=L272 href="source/kernel/blk_drv/floppy.c#L272">272</a>         do_floppy = <a href="ident?i=rw_interrupt">rw_interrupt</a>;<a name=L273 href="source/kernel/blk_drv/floppy.c#L273">273</a>         <a href="ident?i=output_byte">output_byte</a>(<a href="ident?i=command">command</a>);<a name=L274 href="source/kernel/blk_drv/floppy.c#L274">274</a>         <a href="ident?i=output_byte">output_byte</a>(<a href="ident?i=head">head</a>&lt;&lt;2 | <a href="ident?i=current_drive">current_drive</a>);<a name=L275 href="source/kernel/blk_drv/floppy.c#L275">275</a>         <a href="ident?i=output_byte">output_byte</a>(<a href="ident?i=track">track</a>);<a name=L276 href="source/kernel/blk_drv/floppy.c#L276">276</a>         <a href="ident?i=output_byte">output_byte</a>(<a href="ident?i=head">head</a>);<a name=L277 href="source/kernel/blk_drv/floppy.c#L277">277</a>         <a href="ident?i=output_byte">output_byte</a>(<a href="ident?i=sector">sector</a>);<a name=L278 href="source/kernel/blk_drv/floppy.c#L278">278</a>         <a href="ident?i=output_byte">output_byte</a>(2);         <b><i>/* sector size = 512 */</i></b><a name=L279 href="source/kernel/blk_drv/floppy.c#L279">279</a>         <a href="ident?i=output_byte">output_byte</a>(<a href="ident?i=floppy">floppy</a>-&gt;sect);<a name=L280 href="source/kernel/blk_drv/floppy.c#L280">280</a>         <a href="ident?i=output_byte">output_byte</a>(<a href="ident?i=floppy">floppy</a>-&gt;gap);<a name=L281 href="source/kernel/blk_drv/floppy.c#L281">281</a>         <a href="ident?i=output_byte">output_byte</a>(0xFF);      <b><i>/* sector size (0xff when n!=0 ?) */</i></b><a name=L282 href="source/kernel/blk_drv/floppy.c#L282">282</a>         if (<a href="ident?i=reset">reset</a>)<a name=L283 href="source/kernel/blk_drv/floppy.c#L283">283</a>                 <a href="ident?i=do_fd_request">do_fd_request</a>();<a name=L284 href="source/kernel/blk_drv/floppy.c#L284">284</a> }<a name=L285 href="source/kernel/blk_drv/floppy.c#L285">285</a> <a name=L286 href="source/kernel/blk_drv/floppy.c#L286">286</a> <b><i>/*</i></b><a name=L287 href="source/kernel/blk_drv/floppy.c#L287">287</a> <b><i> * This is the routine called after every seek (or recalibrate) interrupt</i></b><a name=L288 href="source/kernel/blk_drv/floppy.c#L288">288</a> <b><i> * from the floppy controller. Note that the "unexpected interrupt" routine</i></b><a name=L289 href="source/kernel/blk_drv/floppy.c#L289">289</a> <b><i> * also does a recalibrate, but doesn't come here.</i></b><a name=L290 href="source/kernel/blk_drv/floppy.c#L290">290</a> <b><i> */</i></b><a name=L291 href="source/kernel/blk_drv/floppy.c#L291">291</a> static void <a href="ident?i=seek_interrupt">seek_interrupt</a>(void)<a name=L292 href="source/kernel/blk_drv/floppy.c#L292">292</a> {<a name=L293 href="source/kernel/blk_drv/floppy.c#L293">293</a> <b><i>/* sense drive status */</i></b><a name=L294 href="source/kernel/blk_drv/floppy.c#L294">294</a>         <a href="ident?i=output_byte">output_byte</a>(<a href="ident?i=FD_SENSEI">FD_SENSEI</a>);<a name=L295 href="source/kernel/blk_drv/floppy.c#L295">295</a>         if (<a href="ident?i=result">result</a>() != 2 || (<a href="ident?i=ST0">ST0</a> &amp; 0xF8) != 0x20 || <a href="ident?i=ST1">ST1</a> != <a href="ident?i=seek_track">seek_track</a>) {<a name=L296 href="source/kernel/blk_drv/floppy.c#L296">296</a>                 <a href="ident?i=bad_flp_intr">bad_flp_intr</a>();<a name=L297 href="source/kernel/blk_drv/floppy.c#L297">297</a>                 <a href="ident?i=do_fd_request">do_fd_request</a>();<a name=L298 href="source/kernel/blk_drv/floppy.c#L298">298</a>                 return;<a name=L299 href="source/kernel/blk_drv/floppy.c#L299">299</a>         }<a name=L300 href="source/kernel/blk_drv/floppy.c#L300">300</a>         <a href="ident?i=current_track">current_track</a> = <a href="ident?i=ST1">ST1</a>;<a name=L301 href="source/kernel/blk_drv/floppy.c#L301">301</a>         <a href="ident?i=setup_rw_floppy">setup_rw_floppy</a>();<a name=L302 href="source/kernel/blk_drv/floppy.c#L302">302</a> }<a name=L303 href="source/kernel/blk_drv/floppy.c#L303">303</a> <a name=L304 href="source/kernel/blk_drv/floppy.c#L304">304</a> <b><i>/*</i></b><a name=L305 href="source/kernel/blk_drv/floppy.c#L305">305</a> <b><i> * This routine is called when everything should be correctly set up</i></b><a name=L306 href="source/kernel/blk_drv/floppy.c#L306">306</a> <b><i> * for the transfer (ie floppy motor is on and the correct floppy is</i></b><a name=L307 href="source/kernel/blk_drv/floppy.c#L307">307</a> <b><i> * selected).</i></b><a name=L308 href="source/kernel/blk_drv/floppy.c#L308">308</a> <b><i> */</i></b><a name=L309 href="source/kernel/blk_drv/floppy.c#L309">309</a> static void <a href="ident?i=transfer">transfer</a>(void)<a name=L310 href="source/kernel/blk_drv/floppy.c#L310">310</a> {<a name=L311 href="source/kernel/blk_drv/floppy.c#L311">311</a>         if (<a href="ident?i=cur_spec1">cur_spec1</a> != <a href="ident?i=floppy">floppy</a>-&gt;spec1) {<a name=L312 href="source/kernel/blk_drv/floppy.c#L312">312</a>                 <a href="ident?i=cur_spec1">cur_spec1</a> = <a href="ident?i=floppy">floppy</a>-&gt;spec1;<a name=L313 href="source/kernel/blk_drv/floppy.c#L313">313</a>                 <a href="ident?i=output_byte">output_byte</a>(<a href="ident?i=FD_SPECIFY">FD_SPECIFY</a>);<a name=L314 href="source/kernel/blk_drv/floppy.c#L314">314</a>                 <a href="ident?i=output_byte">output_byte</a>(<a href="ident?i=cur_spec1">cur_spec1</a>);         <b><i>/* hut etc */</i></b><a name=L315 href="source/kernel/blk_drv/floppy.c#L315">315</a>                 <a href="ident?i=output_byte">output_byte</a>(6);                 <b><i>/* Head load time =6ms, DMA */</i></b><a name=L316 href="source/kernel/blk_drv/floppy.c#L316">316</a>         }<a name=L317 href="source/kernel/blk_drv/floppy.c#L317">317</a>         if (<a href="ident?i=cur_rate">cur_rate</a> != <a href="ident?i=floppy">floppy</a>-&gt;rate)<a name=L318 href="source/kernel/blk_drv/floppy.c#L318">318</a>                 <a href="ident?i=outb_p">outb_p</a>(<a href="ident?i=cur_rate">cur_rate</a> = <a href="ident?i=floppy">floppy</a>-&gt;rate,<a href="ident?i=FD_DCR">FD_DCR</a>);<a name=L319 href="source/kernel/blk_drv/floppy.c#L319">319</a>         if (<a href="ident?i=reset">reset</a>) {<a name=L320 href="source/kernel/blk_drv/floppy.c#L320">320</a>                 <a href="ident?i=do_fd_request">do_fd_request</a>();<a name=L321 href="source/kernel/blk_drv/floppy.c#L321">321</a>                 return;<a name=L322 href="source/kernel/blk_drv/floppy.c#L322">322</a>         }<a name=L323 href="source/kernel/blk_drv/floppy.c#L323">323</a>         if (!<a href="ident?i=seek">seek</a>) {<a name=L324 href="source/kernel/blk_drv/floppy.c#L324">324</a>                 <a href="ident?i=setup_rw_floppy">setup_rw_floppy</a>();<a name=L325 href="source/kernel/blk_drv/floppy.c#L325">325</a>                 return;<a name=L326 href="source/kernel/blk_drv/floppy.c#L326">326</a>         }<a name=L327 href="source/kernel/blk_drv/floppy.c#L327">327</a>         do_floppy = <a href="ident?i=seek_interrupt">seek_interrupt</a>;<a name=L328 href="source/kernel/blk_drv/floppy.c#L328">328</a>         if (<a href="ident?i=seek_track">seek_track</a>) {<a name=L329 href="source/kernel/blk_drv/floppy.c#L329">329</a>                 <a href="ident?i=output_byte">output_byte</a>(<a href="ident?i=FD_SEEK">FD_SEEK</a>);<a name=L330 href="source/kernel/blk_drv/floppy.c#L330">330</a>                 <a href="ident?i=output_byte">output_byte</a>(<a href="ident?i=head">head</a>&lt;&lt;2 | <a href="ident?i=current_drive">current_drive</a>);<a name=L331 href="source/kernel/blk_drv/floppy.c#L331">331</a>                 <a href="ident?i=output_byte">output_byte</a>(<a href="ident?i=seek_track">seek_track</a>);<a name=L332 href="source/kernel/blk_drv/floppy.c#L332">332</a>         } else {<a name=L333 href="source/kernel/blk_drv/floppy.c#L333">333</a>                 <a href="ident?i=output_byte">output_byte</a>(<a href="ident?i=FD_RECALIBRATE">FD_RECALIBRATE</a>);<a name=L334 href="source/kernel/blk_drv/floppy.c#L334">334</a>                 <a href="ident?i=output_byte">output_byte</a>(<a href="ident?i=head">head</a>&lt;&lt;2 | <a href="ident?i=current_drive">current_drive</a>);<a name=L335 href="source/kernel/blk_drv/floppy.c#L335">335</a>         }<a name=L336 href="source/kernel/blk_drv/floppy.c#L336">336</a>         if (<a href="ident?i=reset">reset</a>)<a name=L337 href="source/kernel/blk_drv/floppy.c#L337">337</a>                 <a href="ident?i=do_fd_request">do_fd_request</a>();<a name=L338 href="source/kernel/blk_drv/floppy.c#L338">338</a> }<a name=L339 href="source/kernel/blk_drv/floppy.c#L339">339</a> <a name=L340 href="source/kernel/blk_drv/floppy.c#L340">340</a> <b><i>/*</i></b><a name=L341 href="source/kernel/blk_drv/floppy.c#L341">341</a> <b><i> * Special case - used after a unexpected interrupt (or reset)</i></b><a name=L342 href="source/kernel/blk_drv/floppy.c#L342">342</a> <b><i> */</i></b><a name=L343 href="source/kernel/blk_drv/floppy.c#L343">343</a> static void <a href="ident?i=recal_interrupt">recal_interrupt</a>(void)<a name=L344 href="source/kernel/blk_drv/floppy.c#L344">344</a> {<a name=L345 href="source/kernel/blk_drv/floppy.c#L345">345</a>         <a href="ident?i=output_byte">output_byte</a>(<a href="ident?i=FD_SENSEI">FD_SENSEI</a>);<a name=L346 href="source/kernel/blk_drv/floppy.c#L346">346</a>         if (<a href="ident?i=result">result</a>()!=2 || (<a href="ident?i=ST0">ST0</a> &amp; 0xE0) == 0x60)<a name=L347 href="source/kernel/blk_drv/floppy.c#L347">347</a>                 <a href="ident?i=reset">reset</a> = 1;

⌨️ 快捷键说明

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