55.html

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

HTML
661
字号
<a name='L100'><i><font color='green'>* for that is convoluted and weird. I've got enough problems with</font></i>
<a name='L101'><i><font color='green'>* this driver as it is.</font></i>
<a name='L102'><i><font color='green'>*</font></i>
<a name='L103'><i><font color='green'>* The 'stretch' tells if the tracks need to be boubled for some</font></i>
<a name='L104'><i><font color='green'>* types (ie 360kB diskette in 1.2MB drive etc). Others should</font></i>
<a name='L105'><i><font color='green'>* be self-explanatory.</font></i>
<a name='L106'><i><font color='green'>*/</font></i>
<a name='L107'><i><font color='green'>/*</font></i>
<a name='L108'><i><font color='green'>* 下面的软盘结构定义了不同的软盘类型。与minix 不同的是,linux 没有</font></i>
<a name='L109'><i><font color='green'>* "搜索正确的类型"-类型,因为对其处理的代码令人费解且怪怪的。本程序</font></i>
<a name='L110'><i><font color='green'>* 已经让我遇到了许多的问题了。</font></i>
<a name='L111'><i><font color='green'>*</font></i>
<a name='L112'><i><font color='green'>* 对某些类型的软盘(例如在1.2MB 驱动器中的360kB 软盘等),'stretch'用于</font></i>
<a name='L113'><i><font color='green'>* 检测磁道是否需要特殊处理。其它参数应该是自明的。</font></i>
<a name='L114'><i><font color='green'>*/</font></i>
<a name='L115'><i><font color='green'>// 软盘参数有:</font></i>
<a name='L116'><i><font color='green'>// size 大小(扇区数);</font></i>
<a name='L117'><i><font color='green'>// sect 每磁道扇区数;</font></i>
<a name='L118'><i><font color='green'>// head 磁头数;</font></i>
<a name='L119'><i><font color='green'>// track 磁道数;</font></i>
<a name='L120'><i><font color='green'>// stretch 对磁道是否要特殊处理(标志);</font></i>
<a name='L121'><i><font color='green'>// gap 扇区间隙长度(字节数);</font></i>
<a name='L122'><i><font color='green'>// rate 数据传输速率;</font></i>
<a name='L123'><i><font color='green'>// spec1 参数(高4 位步进速率,低四位磁头卸载时间)。</font></i>
<a name='L124'>     <b>static</b> <b>struct</b> floppy_struct
<a name='L125'>     <font color='red'>{</font>
<a name='L126'>       <b>unsigned</b> <b>int</b> size, sect, head, track, stretch;
<a name='L127'>       <b>unsigned</b> <b>char</b> gap, rate, spec1;
<a name='L128'>     <font color='red'>}</font>
<a name='L129'>floppy_type[] =
<a name='L130'><font color='red'>{</font>
<a name='L131'>  <font color='red'>{</font>
<a name='L132'>  0, 0, 0, 0, 0, 0x00, 0x00, 0x00<font color='red'>}</font>
<a name='L133'>  ,                             <i><font color='green'>/* no testing */</font></i>
<a name='L134'>  <font color='red'>{</font>
<a name='L135'>  720, 9, 2, 40, 0, 0x2A, 0x02, 0xDF<font color='red'>}</font>
<a name='L136'>  ,                             <i><font color='green'>/* 360kB PC diskettes */</font></i>
<a name='L137'>  <font color='red'>{</font>
<a name='L138'>  2400, 15, 2, 80, 0, 0x1B, 0x00, 0xDF<font color='red'>}</font>
<a name='L139'>  ,                             <i><font color='green'>/* 1.2 MB AT-diskettes */</font></i>
<a name='L140'>  <font color='red'>{</font>
<a name='L141'>  720, 9, 2, 40, 1, 0x2A, 0x02, 0xDF<font color='red'>}</font>
<a name='L142'>  ,                             <i><font color='green'>/* 360kB in 720kB drive */</font></i>
<a name='L143'>  <font color='red'>{</font>
<a name='L144'>  1440, 9, 2, 80, 0, 0x2A, 0x02, 0xDF<font color='red'>}</font>
<a name='L145'>  ,                             <i><font color='green'>/* 3.5" 720kB diskette */</font></i>
<a name='L146'>  <font color='red'>{</font>
<a name='L147'>  720, 9, 2, 40, 1, 0x23, 0x01, 0xDF<font color='red'>}</font>
<a name='L148'>  ,                             <i><font color='green'>/* 360kB in 1.2MB drive */</font></i>
<a name='L149'>  <font color='red'>{</font>
<a name='L150'>  1440, 9, 2, 80, 0, 0x23, 0x01, 0xDF<font color='red'>}</font>
<a name='L151'>  ,                             <i><font color='green'>/* 720kB in 1.2MB drive */</font></i>
<a name='L152'>  <font color='red'>{</font>
<a name='L153'>  2880, 18, 2, 80, 0, 0x1B, 0x00, 0xCF<font color='red'>}</font>
<a name='L154'>  ,                             <i><font color='green'>/* 1.44MB diskette */</font></i>
<a name='L155'><font color='red'>}</font>;
<a name='L156'>
<a name='L157'><i><font color='green'>/*</font></i>
<a name='L158'><i><font color='green'>* Rate is 0 for 500kb/s, 2 for 300kbps, 1 for 250kbps</font></i>
<a name='L159'><i><font color='green'>* Spec1 is 0xSH, where S is stepping rate (F=1ms, E=2ms, D=3ms etc),</font></i>
<a name='L160'><i><font color='green'>* H is head unload time (1=16ms, 2=32ms, etc)</font></i>
<a name='L161'><i><font color='green'>*</font></i>
<a name='L162'><i><font color='green'> * Spec2 is (HLD&lt;&lt;1 | ND), where HLD is head load time (1=2ms, 2=4 ms etc)</font></i>
<a name='L163'><i><font color='green'> * and ND is set means no DMA. Hardcoded to 6 (HLD=6ms, use DMA).</font></i>
<a name='L164'><i><font color='green'> */</font></i>
<a name='L165'><i><font color='green'>/*</font></i>
<a name='L166'><i><font color='green'>* 上面速率rate:0 表示500kb/s,1 表示300kbps,2 表示250kbps。</font></i>
<a name='L167'><i><font color='green'>* 参数spec1 是0xSH,其中S 是步进速率(F-1 毫秒,E-2ms,D=3ms 等),</font></i>
<a name='L168'><i><font color='green'>* H 是磁头卸载时间(1=16ms,2=32ms 等)</font></i>
<a name='L169'><i><font color='green'>*</font></i>
<a name='L170'><i><font color='green'>* spec2 是(HLD&lt;&lt;1 | ND),其中HLD 是磁头加载时间(1=2ms,2=4ms 等)</font></i>
<a name='L171'><i><font color='green'>* ND 置位表示不使用DMA(No DMA),在程序中硬编码成6(HLD=6ms,使用DMA)。</font></i>
<a name='L172'><i><font color='green'>*/</font></i>
<a name='L173'>
<a name='L174'><b>extern</b> <b>void</b> floppy_interrupt (<b>void</b>);
<a name='L175'><b>extern</b> <b>char</b> tmp_floppy_area[1024];
<a name='L176'>
<a name='L177'> <i><font color='green'>/*</font></i>
<a name='L178'><i><font color='green'>    * These are global variables, as that's the easiest way to give</font></i>
<a name='L179'><i><font color='green'>    * information to interrupts. They are the data used for the current</font></i>
<a name='L180'><i><font color='green'>    * request.</font></i>
<a name='L181'><i><font color='green'>  */</font></i>
<a name='L182'><i><font color='green'>/*</font></i>
<a name='L183'><i><font color='green'>* 下面是一些全局变量,因为这是将信息传给中断程序最简单的方式。它们是</font></i>
<a name='L184'><i><font color='green'>* 用于当前请求的数据。</font></i>
<a name='L185'><i><font color='green'>*/</font></i>
<a name='L186'><b>static</b> <b>int</b> cur_spec1 = -1;
<a name='L187'><b>static</b> <b>int</b> cur_rate = -1;
<a name='L188'><b>static</b> <b>struct</b> floppy_struct *floppy = floppy_type;
<a name='L189'><b>static</b> <b>unsigned</b> <b>char</b> current_drive = 0;
<a name='L190'><b>static</b> <b>unsigned</b> <b>char</b> sector = 0;
<a name='L191'><b>static</b> <b>unsigned</b> <b>char</b> head = 0;
<a name='L192'><b>static</b> <b>unsigned</b> <b>char</b> track = 0;
<a name='L193'><b>static</b> <b>unsigned</b> <b>char</b> seek_track = 0;
<a name='L194'><b>static</b> <b>unsigned</b> <b>char</b> current_track = 255;
<a name='L195'><b>static</b> <b>unsigned</b> <b>char</b> command = 0;
<a name='L196'><b>unsigned</b> <b>char</b> selected = 0;
<a name='L197'><b>struct</b> task_struct *wait_on_floppy_select = <a href='../D/261.html' title='Multiple defined in 12 places.'>NULL</a>;
<a name='L198'>
<a name='L199'><i><font color='green'>//// 释放(取消选定的)软盘(软驱)。</font></i>
<a name='L200'><i><font color='green'>// 数字输出寄存器(DOR)的低2 位用于指定选择的软驱(0-3 对应A-D)。</font></i>
<a name='L201'><b>void</b>
<a name='L202'><a href='../R/457.html' title='Multiple refered from 3 places.'>floppy_deselect</a> (<b>unsigned</b> <b>int</b> nr)
<a name='L203'><font color='red'>{</font>
<a name='L204'>  <b>if</b> (nr != (current_DOR &amp; 3))
<a name='L205'>    <a href='../S/73.html#L30' title='Defined at 30 in kernel/printk.c.'>printk</a> ("floppy_deselect: drive not selected\n\r");
<a name='L206'>  selected = 0;
<a name='L207'>  <a href='../S/74.html#L272' title='Defined at 272 in kernel/sched.c.'>wake_up</a> (&amp;wait_on_floppy_select);
<a name='L208'><font color='red'>}</font>
<a name='L209'>
<a name='L210'> <i><font color='green'>/*</font></i>
<a name='L211'><i><font color='green'>    * floppy-change is never called from an interrupt, so we can relax a bit</font></i>
<a name='L212'><i><font color='green'>    * here, sleep etc. Note that floppy-on tries to set current_DOR to point</font></i>
<a name='L213'><i><font color='green'>    * to the desired drive, but it will probably not survive the sleep if</font></i>
<a name='L214'><i><font color='green'>    * several floppies are used at the same time: thus the loop.</font></i>
<a name='L215'><i><font color='green'>  */</font></i>
<a name='L216'><i><font color='green'>/*</font></i>
<a name='L217'><i><font color='green'>* floppy-change()不是从中断程序中调用的,所以这里我们可以轻松一下,睡觉等。</font></i>
<a name='L218'><i><font color='green'>* 注意floppy-on()会尝试设置current_DOR 指向所需的驱动器,但当同时使用几个</font></i>
<a name='L219'><i><font color='green'>* 软盘时不能睡眠:因此此时只能使用循环方式。</font></i>
<a name='L220'><i><font color='green'>*/</font></i>
<a name='L221'><i><font color='green'>//// 检测指定软驱中软盘更换情况。如果软盘更换了则返回1,否则返回0。</font></i>
<a name='L222'><b>int</b>
<a name='L223'><a href='../R/456.html' title='Multiple refered from 2 places.'>floppy_change</a> (<b>unsigned</b> <b>int</b> nr)
<a name='L224'><font color='red'>{</font>
<a name='L225'>repeat:
<a name='L226'>  <a href='../S/74.html#L332' title='Defined at 332 in kernel/sched.c.'>floppy_on</a> (nr);               <i><font color='green'>// 开启指定软驱nr(kernel/sched.c,251)。</font></i>
<a name='L227'><i><font color='green'>// 如果当前选择的软驱不是指定的软驱nr,并且已经选择其它了软驱,则让当前任务进入可中断</font></i>
<a name='L228'><i><font color='green'>// 等待状态。</font></i>
<a name='L229'>  <b>while</b> ((current_DOR &amp; 3) != nr &amp;&amp; selected)
<a name='L230'>    <a href='../S/74.html#L242' title='Defined at 242 in kernel/sched.c.'>interruptible_sleep_on</a> (&amp;wait_on_floppy_select);
<a name='L231'><i><font color='green'>// 如果当前没有选择其它软驱或者当前任务被唤醒时,当前软驱仍然不是指定的软驱nr,则循环等待。</font></i>
<a name='L232'>  <b>if</b> ((current_DOR &amp; 3) != nr)

⌨️ 快捷键说明

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