55.html

来自「linux 0.11中文版 有注释」· HTML 代码 · 共 661 行 · 第 1/5 页

HTML
661
字号
<a name='L499'>      <b>return</b>;
<a name='L500'>    <font color='red'>}</font>
<a name='L501'><i><font color='green'>// 否则执行寻道处理。置软盘中断处理调用函数为寻道中断函数。</font></i>
<a name='L502'>  do_floppy = <a href='../S/55.html#L446' title='Defined at 446 in kernel/blk_drv/floppy.c.'>seek_interrupt</a>;
<a name='L503'><i><font color='green'>// 如果器始磁道号不等于零则发送磁头寻道命令和参数</font></i>
<a name='L504'>  <b>if</b> (seek_track)
<a name='L505'>    <font color='red'>{</font>
<a name='L506'>      <a href='../S/55.html#L301' title='Defined at 301 in kernel/blk_drv/floppy.c.'>output_byte</a> (FD_SEEK);    <i><font color='green'>// 发送磁头寻道命令。</font></i>
<a name='L507'>      <a href='../S/55.html#L301' title='Defined at 301 in kernel/blk_drv/floppy.c.'>output_byte</a> (head &lt;&lt; 2 | current_drive);  <i><font color='green'>//发送参数:磁头号+当前软驱号。</font></i>
<a name='L508'>      <a href='../S/55.html#L301' title='Defined at 301 in kernel/blk_drv/floppy.c.'>output_byte</a> (seek_track); <i><font color='green'>// 发送参数:磁道号。</font></i>
<a name='L509'>    <font color='red'>}</font>
<a name='L510'>  <b>else</b>
<a name='L511'>    <font color='red'>{</font>
<a name='L512'>      <a href='../S/55.html#L301' title='Defined at 301 in kernel/blk_drv/floppy.c.'>output_byte</a> (FD_RECALIBRATE);     <i><font color='green'>// 发送重新校正命令。</font></i>
<a name='L513'>      <a href='../S/55.html#L301' title='Defined at 301 in kernel/blk_drv/floppy.c.'>output_byte</a> (head &lt;&lt; 2 | current_drive);  <i><font color='green'>//发送参数:磁头号+当前软驱号。</font></i>
<a name='L514'>    <font color='red'>}</font>
<a name='L515'><i><font color='green'>// 如果复位标志已置位,则继续执行软盘请求项。</font></i>
<a name='L516'>  <b>if</b> (reset)
<a name='L517'>    <a href='../S/55.html#L630' title='Defined at 630 in kernel/blk_drv/floppy.c.'>do_fd_request</a> ();
<a name='L518'><font color='red'>}</font>
<a name='L519'>
<a name='L520'> <i><font color='green'>/*</font></i>
<a name='L521'><i><font color='green'>    * Special case - used after a unexpected interrupt (or reset)</font></i>
<a name='L522'><i><font color='green'>  */</font></i>
<a name='L523'><i><font color='green'>/*</font></i>
<a name='L524'><i><font color='green'>* 特殊情况 - 用于意外中断(或复位)处理后。</font></i>
<a name='L525'><i><font color='green'>*/</font></i>
<a name='L526'><i><font color='green'>//// 软驱重新校正中断调用函数。</font></i>
<a name='L527'><i><font color='green'>// 首先发送检测中断状态命令(无参数),如果返回结果表明出错,则置复位标志,否则复位重新</font></i>
<a name='L528'><i><font color='green'>// 校正标志。然后再次执行软盘请求。</font></i>
<a name='L529'><b>static</b> <b>void</b>
<a name='L530'><a href='../S/55.html#L560' title='Refered from 560 in kernel/blk_drv/floppy.c.'>recal_interrupt</a> (<b>void</b>)
<a name='L531'><font color='red'>{</font>
<a name='L532'>  <a href='../S/55.html#L301' title='Defined at 301 in kernel/blk_drv/floppy.c.'>output_byte</a> (FD_SENSEI);      <i><font color='green'>// 发送检测中断状态命令。</font></i>
<a name='L533'>  <b>if</b> (<a href='../S/55.html#L328' title='Defined at 328 in kernel/blk_drv/floppy.c.'>result</a> () != 2 || (<a href='../S/55.html#L92' title='Defined at 92 in kernel/blk_drv/floppy.c.'>ST0</a> &amp; 0xE0) == 0x60)   <i><font color='green'>// 如果返回结果字节数不等于2 或命令</font></i>
<a name='L534'>    reset = 1;                  <i><font color='green'>// 异常结束,则置复位标志。</font></i>
<a name='L535'>  <b>else</b>                          <i><font color='green'>// 否则复位重新校正标志。</font></i>
<a name='L536'>    recalibrate = 0;
<a name='L537'>  <a href='../S/55.html#L630' title='Defined at 630 in kernel/blk_drv/floppy.c.'>do_fd_request</a> ();             <i><font color='green'>// 执行软盘请求项。</font></i>
<a name='L538'><font color='red'>}</font>
<a name='L539'>
<a name='L540'><i><font color='green'>//// 意外软盘中断请求中断调用函数。</font></i>
<a name='L541'><i><font color='green'>// 首先发送检测中断状态命令(无参数),如果返回结果表明出错,则置复位标志,否则置重新</font></i>
<a name='L542'><i><font color='green'>// 校正标志。</font></i>
<a name='L543'><b>void</b>
<a name='L544'>unexpected_floppy_interrupt (<b>void</b>)
<a name='L545'><font color='red'>{</font>
<a name='L546'>  <a href='../S/55.html#L301' title='Defined at 301 in kernel/blk_drv/floppy.c.'>output_byte</a> (FD_SENSEI);      <i><font color='green'>// 发送检测中断状态命令。</font></i>
<a name='L547'>  <b>if</b> (<a href='../S/55.html#L328' title='Defined at 328 in kernel/blk_drv/floppy.c.'>result</a> () != 2 || (<a href='../S/55.html#L92' title='Defined at 92 in kernel/blk_drv/floppy.c.'>ST0</a> &amp; 0xE0) == 0x60)   <i><font color='green'>// 如果返回结果字节数不等于2 或命令</font></i>
<a name='L548'>    reset = 1;                  <i><font color='green'>// 异常结束,则置复位标志。</font></i>
<a name='L549'>  <b>else</b>                          <i><font color='green'>// 否则置重新校正标志。</font></i>
<a name='L550'>    recalibrate = 1;
<a name='L551'><font color='red'>}</font>
<a name='L552'>
<a name='L553'><i><font color='green'>//// 软盘重新校正处理函数。</font></i>
<a name='L554'><i><font color='green'>// 向软盘控制器FDC 发送重新校正命令和参数,并复位重新校正标志。</font></i>
<a name='L555'><b>static</b> <b>void</b>
<a name='L556'><a href='../S/55.html#L644' title='Refered from 644 in kernel/blk_drv/floppy.c.'>recalibrate_floppy</a> (<b>void</b>)
<a name='L557'><font color='red'>{</font>
<a name='L558'>  recalibrate = 0;              <i><font color='green'>// 复位重新校正标志。</font></i>
<a name='L559'>  current_track = 0;            <i><font color='green'>// 当前磁道号归零。</font></i>
<a name='L560'>  do_floppy = <a href='../S/55.html#L530' title='Defined at 530 in kernel/blk_drv/floppy.c.'>recal_interrupt</a>;  <i><font color='green'>// 置软盘中断调用函数指针指向重新校正调用函数。</font></i>
<a name='L561'>  <a href='../S/55.html#L301' title='Defined at 301 in kernel/blk_drv/floppy.c.'>output_byte</a> (FD_RECALIBRATE); <i><font color='green'>// 发送命令:重新校正。</font></i>
<a name='L562'>  <a href='../S/55.html#L301' title='Defined at 301 in kernel/blk_drv/floppy.c.'>output_byte</a> (head &lt;&lt; 2 | current_drive);      <i><font color='green'>// 发送参数:(磁头号加)当前驱动器号。</font></i>
<a name='L563'>  <b>if</b> (reset)                    <i><font color='green'>// 如果出错(复位标志被置位)则继续执行软盘请求。</font></i>
<a name='L564'>    <a href='../S/55.html#L630' title='Defined at 630 in kernel/blk_drv/floppy.c.'>do_fd_request</a> ();
<a name='L565'><font color='red'>}</font>
<a name='L566'>
<a name='L567'><i><font color='green'>//// 软盘控制器FDC 复位中断调用函数。在软盘中断处理程序中调用。</font></i>
<a name='L568'><i><font color='green'>// 首先发送检测中断状态命令(无参数),然后读出返回的结果字节。接着发送设定软驱参数命令</font></i>
<a name='L569'><i><font color='green'>// 和相关参数,最后再次调用执行软盘请求。</font></i>
<a name='L570'><b>static</b> <b>void</b>
<a name='L571'><a href='../S/55.html#L597' title='Refered from 597 in kernel/blk_drv/floppy.c.'>reset_interrupt</a> (<b>void</b>)
<a name='L572'><font color='red'>{</font>
<a name='L573'>  <a href='../S/55.html#L301' title='Defined at 301 in kernel/blk_drv/floppy.c.'>output_byte</a> (FD_SENSEI);      <i><font color='green'>// 发送检测中断状态命令。</font></i>
<a name='L574'>  (<b>void</b>) <a href='../S/55.html#L328' title='Defined at 328 in kernel/blk_drv/floppy.c.'>result</a> ();             <i><font color='green'>// 读取命令执行结果字节。</font></i>
<a name='L575'>  <a href='../S/55.html#L301' title='Defined at 301 in kernel/blk_drv/floppy.c.'>output_byte</a> (FD_SPECIFY);     <i><font color='green'>// 发送设定软驱参数命令。</font></i>
<a name='L576'>  <a href='../S/55.html#L301' title='Defined at 301 in kernel/blk_drv/floppy.c.'>output_byte</a> (cur_spec1);      <i><font color='green'>/* hut etc */</font></i><i><font color='green'>// 发送参数。</font></i>
<a name='L577'>  <a href='../S/55.html#L301' title='Defined at 301 in kernel/blk_drv/floppy.c.'>output_byte</a> (6);              <i><font color='green'>/* Head load time =6ms, DMA */</font></i>
<a name='L578'>  <a href='../S/55.html#L630' title='Defined at 630 in kernel/blk_drv/floppy.c.'>do_fd_request</a> ();             <i><font color='green'>// 调用执行软盘请求。</font></i>
<a name='L579'><font color='red'>}</font>
<a name='L580'>
<a name='L581'> <i><font color='green'>/*</font></i>
<a name='L582'><i><font color='green'>    * reset is done by pulling bit 2 of DOR low for a while.</font></i>
<a name='L583'><i><font color='green'>  */</font></i>
<a name='L584'><i><font color='green'>/* FDC 复位是通过将数字输出寄存器(DOR)位2 置0 一会儿实现的 */</font></i>
<a name='L585'><i><font color='green'>//// 复位软盘控制器。</font></i>
<a name='L586'><b>static</b> <b>void</b>
<a name='L587'><a href='../S/55.html#L638' title='Refered from 638 in kernel/blk_drv/floppy.c.'>reset_floppy</a> (<b>void</b>)
<a name='L588'><font color='red'>{</font>
<a name='L589'>  <b>int</b> <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>;
<a name='L590'>
<a name='L591'>  reset = 0;                    <i><font color='green'>// 复位标志置0。</font></i>
<a name='L592'>  cur_spec1 = -1;
<a name='L593'>  cur_rate = -1;
<a name='L594'>  recalibrate = 1;              <i><font color='green'>// 重新校正标志置位。</font></i>
<a name='L595'>  <a href='../S/73.html#L30' title='Defined at 30 in kernel/printk.c.'>printk</a> ("Reset-floppy called\n\r");   <i><font color='green'>// 显示执行软盘复位操作信息。</font></i>
<a name='L596'>  <a href='../S/25.html#L15' title='Defined at 15 in include/asm/system.h.'>cli</a> ();                       <i><font color='green'>// 关中断。</font></i>
<a name='L597'>  do_floppy = <a href='../S/55.html#L571' title='Defined at 571 in kernel/blk_drv/floppy.c.'>reset_interrupt</a>;  <i><font color='green'>// 设置在软盘中断处理程序中调用的函数。</font></i>
<a name='L598'>  <a href='../S/22.html#L17' title='Defined at 17 in include/asm/io.h.'>outb_p</a> (current_DOR &amp; ~0x04, FD_DOR); <i><font color='green'>// 对软盘控制器FDC 执行复位操作。</font></i>
<a name='L599'>  <b>for</b> (<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> = 0; <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> &lt; 100; <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>++)     <i><font color='green'>// 空操作,延迟。</font></i>
<a name='L600'>    <b>__asm__</b> ("nop");
<a name='L601'>  <a href='../S/22.html#L3' title='Defined at 3 in include/asm/io.h.'>outb</a> (current_DOR, FD_DOR);   <i><font color='green'>// 再启动软盘控制器。</font></i>
<a name='L602'>  <a href='../S/25.html#L14' title='Defined at 14 in include/asm/system.h.'>sti</a> ();                       <i><font color='green'>// 开中断。</font></i>
<a name='L603'><font color='red'>}</font>
<a name='L604'>
<a name='L605'><i><font color='green'>//// 软驱启动定时中断调用函数。</font></i>
<a name='L606'><i><font color='green'>// 首先检查数字输出寄存器(DOR),使其选择当前指定的驱动器。然后调用执行软盘读写传输</font></i>
<a name='L607'><i><font color='green'>// 函数transfer()。</font></i>
<a name='L608'><b>static</b> <b>void</b>
<a name='L609'><a href='../S/55.html#L682' title='Refered from 682 in kernel/blk_drv/floppy.c.'>floppy_on_interrupt</a> (<b>void</b>)
<a name='L610'><font color='red'>{</font>
<a name='L611'>  <i><font color='green'>/* We cannot do a floppy-select, as that might sleep. We just force it */</font></i>
<a name='L612'><i><font color='green'>/* 我们不能任意设置选择的软驱,因为这样做可能会引起进程睡眠。我们只是迫使它自己选择 */</font></i>
<a name='L613'>  selected = 1;                 <i><font color='green'>// 置已选择当前驱动器标志。</font></i>
<a name='L614'><i><font color='green'>// 如果当前驱动器号与数字输出寄存器DOR 中的不同,则重新设置DOR 为当前驱动器current_drive。</font></i>
<a name='L615'><i><font color='green'>// 定时延迟2 个滴答时间,然后调用软盘读写传输函数transfer()。否则直接调用软盘读写传输函数。</font></i>
<a name='L616'>  <b>if</b> (current_drive != (current_DOR &amp; 3))
<a name='L617'>    <font color='red'>{</font>
<a name='L618'>      current_DOR &amp;= 0xFC;
<a name='L619'>      current_DOR |= current_drive;
<a name='L620'>      <a href='../S/22.html#L3' title='Defined at 3 in include/asm/io.h.'>outb</a> (current_DOR, FD_DOR);       <i><font color='green'>// 向数字输出寄存器输出当前DOR。</font></i>
<a name='L621'>      <a href='../S/74.html#L389' title='Defined at 389 in kernel/sched.c.'>add_timer</a> (2, &amp;<a href='../S/55.html#L474' title='Defined at 474 in kernel/blk_drv/floppy.c.'>transfer</a>); <i><font color='green'>// 添加定时器并执行传输函数。</font></i>
<a name='L622'>    <font color='red'>}</font>
<a name='L623'>  <b>else</b>
<a name='L624'>    <a href='../S/55.html#L474' title='Defined at 474 in kernel/blk_drv/floppy.c.'>transfer</a> ();                <i><font color='green'>// 执行软盘读写传输函数。</font></i>
<a name='L625'><font color='red'>}</font>
<a name='L626'>
<a name

⌨️ 快捷键说明

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