📄 floppy.c
字号:
<a name=L348 href="source/kernel/blk_drv/floppy.c#L348">348</a> else<a name=L349 href="source/kernel/blk_drv/floppy.c#L349">349</a> <a href="ident?i=recalibrate">recalibrate</a> = 0;<a name=L350 href="source/kernel/blk_drv/floppy.c#L350">350</a> <a href="ident?i=do_fd_request">do_fd_request</a>();<a name=L351 href="source/kernel/blk_drv/floppy.c#L351">351</a> }<a name=L352 href="source/kernel/blk_drv/floppy.c#L352">352</a> <a name=L353 href="source/kernel/blk_drv/floppy.c#L353">353</a> void <a href="ident?i=unexpected_floppy_interrupt">unexpected_floppy_interrupt</a>(void)<a name=L354 href="source/kernel/blk_drv/floppy.c#L354">354</a> {<a name=L355 href="source/kernel/blk_drv/floppy.c#L355">355</a> <a href="ident?i=output_byte">output_byte</a>(<a href="ident?i=FD_SENSEI">FD_SENSEI</a>);<a name=L356 href="source/kernel/blk_drv/floppy.c#L356">356</a> if (<a href="ident?i=result">result</a>()!=2 || (<a href="ident?i=ST0">ST0</a> & 0xE0) == 0x60)<a name=L357 href="source/kernel/blk_drv/floppy.c#L357">357</a> <a href="ident?i=reset">reset</a> = 1;<a name=L358 href="source/kernel/blk_drv/floppy.c#L358">358</a> else<a name=L359 href="source/kernel/blk_drv/floppy.c#L359">359</a> <a href="ident?i=recalibrate">recalibrate</a> = 1;<a name=L360 href="source/kernel/blk_drv/floppy.c#L360">360</a> }<a name=L361 href="source/kernel/blk_drv/floppy.c#L361">361</a> <a name=L362 href="source/kernel/blk_drv/floppy.c#L362">362</a> static void <a href="ident?i=recalibrate_floppy">recalibrate_floppy</a>(void)<a name=L363 href="source/kernel/blk_drv/floppy.c#L363">363</a> {<a name=L364 href="source/kernel/blk_drv/floppy.c#L364">364</a> <a href="ident?i=recalibrate">recalibrate</a> = 0;<a name=L365 href="source/kernel/blk_drv/floppy.c#L365">365</a> <a href="ident?i=current_track">current_track</a> = 0;<a name=L366 href="source/kernel/blk_drv/floppy.c#L366">366</a> do_floppy = <a href="ident?i=recal_interrupt">recal_interrupt</a>;<a name=L367 href="source/kernel/blk_drv/floppy.c#L367">367</a> <a href="ident?i=output_byte">output_byte</a>(<a href="ident?i=FD_RECALIBRATE">FD_RECALIBRATE</a>);<a name=L368 href="source/kernel/blk_drv/floppy.c#L368">368</a> <a href="ident?i=output_byte">output_byte</a>(<a href="ident?i=head">head</a><<2 | <a href="ident?i=current_drive">current_drive</a>);<a name=L369 href="source/kernel/blk_drv/floppy.c#L369">369</a> if (<a href="ident?i=reset">reset</a>)<a name=L370 href="source/kernel/blk_drv/floppy.c#L370">370</a> <a href="ident?i=do_fd_request">do_fd_request</a>();<a name=L371 href="source/kernel/blk_drv/floppy.c#L371">371</a> }<a name=L372 href="source/kernel/blk_drv/floppy.c#L372">372</a> <a name=L373 href="source/kernel/blk_drv/floppy.c#L373">373</a> static void <a href="ident?i=reset_interrupt">reset_interrupt</a>(void)<a name=L374 href="source/kernel/blk_drv/floppy.c#L374">374</a> {<a name=L375 href="source/kernel/blk_drv/floppy.c#L375">375</a> <a href="ident?i=output_byte">output_byte</a>(<a href="ident?i=FD_SENSEI">FD_SENSEI</a>);<a name=L376 href="source/kernel/blk_drv/floppy.c#L376">376</a> (void) <a href="ident?i=result">result</a>();<a name=L377 href="source/kernel/blk_drv/floppy.c#L377">377</a> <a href="ident?i=output_byte">output_byte</a>(<a href="ident?i=FD_SPECIFY">FD_SPECIFY</a>);<a name=L378 href="source/kernel/blk_drv/floppy.c#L378">378</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=L379 href="source/kernel/blk_drv/floppy.c#L379">379</a> <a href="ident?i=output_byte">output_byte</a>(6); <b><i>/* Head load time =6ms, DMA */</i></b><a name=L380 href="source/kernel/blk_drv/floppy.c#L380">380</a> <a href="ident?i=do_fd_request">do_fd_request</a>();<a name=L381 href="source/kernel/blk_drv/floppy.c#L381">381</a> }<a name=L382 href="source/kernel/blk_drv/floppy.c#L382">382</a> <a name=L383 href="source/kernel/blk_drv/floppy.c#L383">383</a> <b><i>/*</i></b><a name=L384 href="source/kernel/blk_drv/floppy.c#L384">384</a> <b><i> * reset is done by pulling bit 2 of DOR low for a while.</i></b><a name=L385 href="source/kernel/blk_drv/floppy.c#L385">385</a> <b><i> */</i></b><a name=L386 href="source/kernel/blk_drv/floppy.c#L386">386</a> static void <a href="ident?i=reset_floppy">reset_floppy</a>(void)<a name=L387 href="source/kernel/blk_drv/floppy.c#L387">387</a> {<a name=L388 href="source/kernel/blk_drv/floppy.c#L388">388</a> int i;<a name=L389 href="source/kernel/blk_drv/floppy.c#L389">389</a> <a name=L390 href="source/kernel/blk_drv/floppy.c#L390">390</a> <a href="ident?i=reset">reset</a> = 0;<a name=L391 href="source/kernel/blk_drv/floppy.c#L391">391</a> <a href="ident?i=cur_spec1">cur_spec1</a> = -1;<a name=L392 href="source/kernel/blk_drv/floppy.c#L392">392</a> <a href="ident?i=cur_rate">cur_rate</a> = -1;<a name=L393 href="source/kernel/blk_drv/floppy.c#L393">393</a> <a href="ident?i=recalibrate">recalibrate</a> = 1;<a name=L394 href="source/kernel/blk_drv/floppy.c#L394">394</a> <a href="ident?i=printk">printk</a>(<i>"Reset-floppy called\n\r"</i>);<a name=L395 href="source/kernel/blk_drv/floppy.c#L395">395</a> <a href="ident?i=cli">cli</a>();<a name=L396 href="source/kernel/blk_drv/floppy.c#L396">396</a> do_floppy = <a href="ident?i=reset_interrupt">reset_interrupt</a>;<a name=L397 href="source/kernel/blk_drv/floppy.c#L397">397</a> <a href="ident?i=outb_p">outb_p</a>(<a href="ident?i=current_DOR">current_DOR</a> & ~0x04,<a href="ident?i=FD_DOR">FD_DOR</a>);<a name=L398 href="source/kernel/blk_drv/floppy.c#L398">398</a> for (i=0 ; i<100 ; i++)<a name=L399 href="source/kernel/blk_drv/floppy.c#L399">399</a> __asm__(<i>"nop"</i>);<a name=L400 href="source/kernel/blk_drv/floppy.c#L400">400</a> <a href="ident?i=outb">outb</a>(<a href="ident?i=current_DOR">current_DOR</a>,<a href="ident?i=FD_DOR">FD_DOR</a>);<a name=L401 href="source/kernel/blk_drv/floppy.c#L401">401</a> <a href="ident?i=sti">sti</a>();<a name=L402 href="source/kernel/blk_drv/floppy.c#L402">402</a> }<a name=L403 href="source/kernel/blk_drv/floppy.c#L403">403</a> <a name=L404 href="source/kernel/blk_drv/floppy.c#L404">404</a> static void <a href="ident?i=floppy_on_interrupt">floppy_on_interrupt</a>(void)<a name=L405 href="source/kernel/blk_drv/floppy.c#L405">405</a> {<a name=L406 href="source/kernel/blk_drv/floppy.c#L406">406</a> <b><i>/* We cannot do a floppy-select, as that might sleep. We just force it */</i></b><a name=L407 href="source/kernel/blk_drv/floppy.c#L407">407</a> <a href="ident?i=selected">selected</a> = 1;<a name=L408 href="source/kernel/blk_drv/floppy.c#L408">408</a> if (<a href="ident?i=current_drive">current_drive</a> != (<a href="ident?i=current_DOR">current_DOR</a> & 3)) {<a name=L409 href="source/kernel/blk_drv/floppy.c#L409">409</a> <a href="ident?i=current_DOR">current_DOR</a> &= 0xFC;<a name=L410 href="source/kernel/blk_drv/floppy.c#L410">410</a> <a href="ident?i=current_DOR">current_DOR</a> |= <a href="ident?i=current_drive">current_drive</a>;<a name=L411 href="source/kernel/blk_drv/floppy.c#L411">411</a> <a href="ident?i=outb">outb</a>(<a href="ident?i=current_DOR">current_DOR</a>,<a href="ident?i=FD_DOR">FD_DOR</a>);<a name=L412 href="source/kernel/blk_drv/floppy.c#L412">412</a> <a href="ident?i=add_timer">add_timer</a>(2,&<a href="ident?i=transfer">transfer</a>);<a name=L413 href="source/kernel/blk_drv/floppy.c#L413">413</a> } else<a name=L414 href="source/kernel/blk_drv/floppy.c#L414">414</a> <a href="ident?i=transfer">transfer</a>();<a name=L415 href="source/kernel/blk_drv/floppy.c#L415">415</a> }<a name=L416 href="source/kernel/blk_drv/floppy.c#L416">416</a> <a name=L417 href="source/kernel/blk_drv/floppy.c#L417">417</a> void <a href="ident?i=do_fd_request">do_fd_request</a>(void)<a name=L418 href="source/kernel/blk_drv/floppy.c#L418">418</a> {<a name=L419 href="source/kernel/blk_drv/floppy.c#L419">419</a> unsigned int block;<a name=L420 href="source/kernel/blk_drv/floppy.c#L420">420</a> <a name=L421 href="source/kernel/blk_drv/floppy.c#L421">421</a> <a href="ident?i=seek">seek</a> = 0;<a name=L422 href="source/kernel/blk_drv/floppy.c#L422">422</a> if (<a href="ident?i=reset">reset</a>) {<a name=L423 href="source/kernel/blk_drv/floppy.c#L423">423</a> <a href="ident?i=reset_floppy">reset_floppy</a>();<a name=L424 href="source/kernel/blk_drv/floppy.c#L424">424</a> return;<a name=L425 href="source/kernel/blk_drv/floppy.c#L425">425</a> }<a name=L426 href="source/kernel/blk_drv/floppy.c#L426">426</a> if (<a href="ident?i=recalibrate">recalibrate</a>) {<a name=L427 href="source/kernel/blk_drv/floppy.c#L427">427</a> <a href="ident?i=recalibrate_floppy">recalibrate_floppy</a>();<a name=L428 href="source/kernel/blk_drv/floppy.c#L428">428</a> return;<a name=L429 href="source/kernel/blk_drv/floppy.c#L429">429</a> }<a name=L430 href="source/kernel/blk_drv/floppy.c#L430">430</a> <a href="ident?i=INIT_REQUEST">INIT_REQUEST</a>;<a name=L431 href="source/kernel/blk_drv/floppy.c#L431">431</a> <a href="ident?i=floppy">floppy</a> = (<a href="ident?i=MINOR">MINOR</a>(<a href="ident?i=CURRENT">CURRENT</a>->dev)>>2) + <a href="ident?i=floppy_type">floppy_type</a>;<a name=L432 href="source/kernel/blk_drv/floppy.c#L432">432</a> if (<a href="ident?i=current_drive">current_drive</a> != <a href="ident?i=CURRENT_DEV">CURRENT_DEV</a>)<a name=L433 href="source/kernel/blk_drv/floppy.c#L433">433</a> <a href="ident?i=seek">seek</a> = 1;<a name=L434 href="source/kernel/blk_drv/floppy.c#L434">434</a> <a href="ident?i=current_drive">current_drive</a> = <a href="ident?i=CURRENT_DEV">CURRENT_DEV</a>;<a name=L435 href="source/kernel/blk_drv/floppy.c#L435">435</a> block = <a href="ident?i=CURRENT">CURRENT</a>-><a href="ident?i=sector">sector</a>;<a name=L436 href="source/kernel/blk_drv/floppy.c#L436">436</a> if (block+2 > <a href="ident?i=floppy">floppy</a>->size) {<a name=L437 href="source/kernel/blk_drv/floppy.c#L437">437</a> <a href="ident?i=end_request">end_request</a>(0);<a name=L438 href="source/kernel/blk_drv/floppy.c#L438">438</a> goto repeat;<a name=L439 href="source/kernel/blk_drv/floppy.c#L439">439</a> }<a name=L440 href="source/kernel/blk_drv/floppy.c#L440">440</a> <a href="ident?i=sector">sector</a> = block % <a href="ident?i=floppy">floppy</a>->sect;<a name=L441 href="source/kernel/blk_drv/floppy.c#L441">441</a> block /= <a href="ident?i=floppy">floppy</a>->sect;<a name=L442 href="source/kernel/blk_drv/floppy.c#L442">442</a> <a href="ident?i=head">head</a> = block % <a href="ident?i=floppy">floppy</a>-><a href="ident?i=head">head</a>;<a name=L443 href="source/kernel/blk_drv/floppy.c#L443">443</a> <a href="ident?i=track">track</a> = block / <a href="ident?i=floppy">floppy</a>-><a href="ident?i=head">head</a>;<a name=L444 href="source/kernel/blk_drv/floppy.c#L444">444</a> <a href="ident?i=seek_track">seek_track</a> = <a href="ident?i=track">track</a> << <a href="ident?i=floppy">floppy</a>->stretch;<a name=L445 href="source/kernel/blk_drv/floppy.c#L445">445</a> if (<a href="ident?i=seek_track">seek_track</a> != <a href="ident?i=current_track">current_track</a>)<a name=L446 href="source/kernel/blk_drv/floppy.c#L446">446</a> <a href="ident?i=seek">seek</a> = 1;<a name=L447 href="source/kernel/blk_drv/floppy.c#L447">447</a> <a href="ident?i=sector">sector</a>++;<a name=L448 href="source/kernel/blk_drv/floppy.c#L448">448</a> if (<a href="ident?i=CURRENT">CURRENT</a>->cmd == <a href="ident?i=READ">READ</a>)<a name=L449 href="source/kernel/blk_drv/floppy.c#L449">449</a> <a href="ident?i=command">command</a> = <a href="ident?i=FD_READ">FD_READ</a>;<a name=L450 href="source/kernel/blk_drv/floppy.c#L450">450</a> else if (<a href="ident?i=CURRENT">CURRENT</a>->cmd == <a href="ident?i=WRITE">WRITE</a>)<a name=L451 href="source/kernel/blk_drv/floppy.c#L451">451</a> <a href="ident?i=command">command</a> = <a href="ident?i=FD_WRITE">FD_WRITE</a>;<a name=L452 href="source/kernel/blk_drv/floppy.c#L452">452</a> else<a name=L453 href="source/kernel/blk_drv/floppy.c#L453">453</a> <a href="ident?i=panic">panic</a>(<i>"do_fd_request: unknown command"</i>);<a name=L454 href="source/kernel/blk_drv/floppy.c#L454">454</a> <a href="ident?i=add_timer">add_timer</a>(<a href="ident?i=ticks_to_floppy_on">ticks_to_floppy_on</a>(<a href="ident?i=current_drive">current_drive</a>),&<a href="ident?i=floppy_on_interrupt">floppy_on_interrupt</a>);<a name=L455 href="source/kernel/blk_drv/floppy.c#L455">455</a> }<a name=L456 href="source/kernel/blk_drv/floppy.c#L456">456</a> <a name=L457 href="source/kernel/blk_drv/floppy.c#L457">457</a> void <a href="ident?i=floppy_init">floppy_init</a>(void)<a name=L458 href="source/kernel/blk_drv/floppy.c#L458">458</a> {<a name=L459 href="source/kernel/blk_drv/floppy.c#L459">459</a> <a href="ident?i=blk_dev">blk_dev</a>[<a href="ident?i=MAJOR_NR">MAJOR_NR</a>].request_fn = <a href="ident?i=DEVICE_REQUEST">DEVICE_REQUEST</a>;<a name=L460 href="source/kernel/blk_drv/floppy.c#L460">460</a> <a href="ident?i=set_trap_gate">set_trap_gate</a>(0x26,&<a href="ident?i=floppy_interrupt">floppy_interrupt</a>);<a name=L461 href="source/kernel/blk_drv/floppy.c#L461">461</a> <a href="ident?i=outb">outb</a>(<a href="ident?i=inb_p">inb_p</a>(0x21)&~0x40,0x21);<a name=L462 href="source/kernel/blk_drv/floppy.c#L462">462</a> }<a name=L463 href="source/kernel/blk_drv/floppy.c#L463">463</a> </pre><hr><div align=center> [<b><i>源代码浏览</i></b>] [<a href="diff/kernel/blk_drv/floppy.c">区别标定</a>] [<a href="ident">标识符搜索</a>] [<a href="search">文本搜索</a>] [<a href="find">文件搜索</a>] </div><hr>本网页由 <a href="http:blurb.html">LXR引擎</a> 自动生成.<br></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -