55.html
来自「linux 0.11中文版 有注释」· HTML 代码 · 共 661 行 · 第 1/5 页
HTML
661 行
<a name='L366'> <b>else</b>
<a name='L367'> recalibrate = 1;
<a name='L368'><font color='red'>}</font>
<a name='L369'>
<a name='L370'> <i><font color='green'>/*</font></i>
<a name='L371'><i><font color='green'> * Ok, this interrupt is called after a DMA read/write has succeeded,</font></i>
<a name='L372'><i><font color='green'> * so we check the results, and copy any buffers.</font></i>
<a name='L373'><i><font color='green'> */</font></i>
<a name='L374'><i><font color='green'>/*</font></i>
<a name='L375'><i><font color='green'>* OK,下面该中断处理函数是在DMA 读/写成功后调用的,这样我们就可以检查执行结果,</font></i>
<a name='L376'><i><font color='green'>* 并复制缓冲区中的数据。</font></i>
<a name='L377'><i><font color='green'>*/</font></i>
<a name='L378'><i><font color='green'>//// 软盘读写操作成功中断调用函数。。</font></i>
<a name='L379'><b>static</b> <b>void</b>
<a name='L380'><a href='../S/55.html#L416' title='Refered from 416 in kernel/blk_drv/floppy.c.'>rw_interrupt</a> (<b>void</b>)
<a name='L381'><font color='red'>{</font>
<a name='L382'><i><font color='green'>// 如果返回结果字节数不等于7,或者状态字节0、1 或2 中存在出错标志,则若是写保护</font></i>
<a name='L383'><i><font color='green'>// 就显示出错信息,释放当前驱动器,并结束当前请求项。否则就执行出错计数处理。</font></i>
<a name='L384'><i><font color='green'>// 然后继续执行软盘请求操作。</font></i>
<a name='L385'><i><font color='green'>// ( 0xf8 = ST0_INTR | ST0_SE | ST0_ECE | ST0_NR )</font></i>
<a name='L386'><i><font color='green'>// ( 0xbf = ST1_EOC | ST1_CRC | ST1_OR | ST1_ND | ST1_WP | ST1_MAM,应该是0xb7)</font></i>
<a name='L387'><i><font color='green'>// ( 0x73 = ST2_CM | ST2_CRC | ST2_WC | ST2_BC | ST2_MAM )</font></i>
<a name='L388'> <b>if</b> (<a href='../S/55.html#L328' title='Defined at 328 in kernel/blk_drv/floppy.c.'>result</a> () != 7 || (<a href='../S/55.html#L92' title='Defined at 92 in kernel/blk_drv/floppy.c.'>ST0</a> & 0xf8) || (<a href='../S/55.html#L93' title='Defined at 93 in kernel/blk_drv/floppy.c.'>ST1</a> & 0xbf) || (<a href='../S/55.html#L94' title='Defined at 94 in kernel/blk_drv/floppy.c.'>ST2</a> & 0x73))
<a name='L389'> <font color='red'>{</font>
<a name='L390'> <b>if</b> (<a href='../S/55.html#L93' title='Defined at 93 in kernel/blk_drv/floppy.c.'>ST1</a> & 0x02)
<a name='L391'> <font color='red'>{</font> <i><font color='green'>// 0x02 = ST1_WP - Write Protected。</font></i>
<a name='L392'> <a href='../S/73.html#L30' title='Defined at 30 in kernel/printk.c.'>printk</a> ("Drive %d is write protected\n\r", current_drive);
<a name='L393'> <a href='../S/55.html#L202' title='Defined at 202 in kernel/blk_drv/floppy.c.'>floppy_deselect</a> (current_drive);
<a name='L394'> <a href='../S/54.html#L136' title='Defined at 136 in kernel/blk_drv/blk.h.'>end_request</a> (0);
<a name='L395'> <font color='red'>}</font>
<a name='L396'> <b>else</b>
<a name='L397'> <a href='../S/55.html#L353' title='Defined at 353 in kernel/blk_drv/floppy.c.'>bad_flp_intr</a> ();
<a name='L398'> <a href='../S/55.html#L630' title='Defined at 630 in kernel/blk_drv/floppy.c.'>do_fd_request</a> ();
<a name='L399'> <b>return</b>;
<a name='L400'> <font color='red'>}</font>
<a name='L401'><i><font color='green'>// 如果当前请求项的缓冲区位于1M 地址以上,则说明此次软盘读操作的内容还放在临时缓冲区内,</font></i>
<a name='L402'><i><font color='green'>// 需要复制到请求项的缓冲区中(因为DMA 只能在1M 地址范围寻址)。</font></i>
<a name='L403'> <b>if</b> (command == FD_READ && (<b>unsigned</b> <b>long</b>) (<a href='../S/54.html#L116' title='Defined at 116 in kernel/blk_drv/blk.h.'>CURRENT</a>->buffer) >= 0x100000)
<a name='L404'> <a href='../S/55.html#L246' title='Defined at 246 in kernel/blk_drv/floppy.c.'>copy_buffer</a> (tmp_floppy_area, <a href='../S/54.html#L116' title='Defined at 116 in kernel/blk_drv/blk.h.'>CURRENT</a>->buffer);
<a name='L405'><i><font color='green'>// 释放当前软盘,结束当前请求项(置更新标志),再继续执行其它软盘请求项。</font></i>
<a name='L406'> <a href='../S/55.html#L202' title='Defined at 202 in kernel/blk_drv/floppy.c.'>floppy_deselect</a> (current_drive);
<a name='L407'> <a href='../S/54.html#L136' title='Defined at 136 in kernel/blk_drv/blk.h.'>end_request</a> (1);
<a name='L408'> <a href='../S/55.html#L630' title='Defined at 630 in kernel/blk_drv/floppy.c.'>do_fd_request</a> ();
<a name='L409'><font color='red'>}</font>
<a name='L410'>
<a name='L411'><i><font color='green'>//// 设置DMA 并输出软盘操作命令和参数(输出1 字节命令+ 0~7 字节参数)。</font></i>
<a name='L412'><b>inline</b> <b>void</b>
<a name='L413'><a href='../R/606.html' title='Multiple refered from 2 places.'>setup_rw_floppy</a> (<b>void</b>)
<a name='L414'><font color='red'>{</font>
<a name='L415'> <a href='../S/55.html#L253' title='Defined at 253 in kernel/blk_drv/floppy.c.'>setup_DMA</a> (); <i><font color='green'>// 初始化软盘DMA 通道。</font></i>
<a name='L416'> do_floppy = <a href='../S/55.html#L380' title='Defined at 380 in kernel/blk_drv/floppy.c.'>rw_interrupt</a>; <i><font color='green'>// 置软盘中断调用函数指针。</font></i>
<a name='L417'> <a href='../S/55.html#L301' title='Defined at 301 in kernel/blk_drv/floppy.c.'>output_byte</a> (command); <i><font color='green'>// 发送命令字节。</font></i>
<a name='L418'> <a href='../S/55.html#L301' title='Defined at 301 in kernel/blk_drv/floppy.c.'>output_byte</a> (head << 2 | current_drive); <i><font color='green'>// 发送参数(磁头号+驱动器号)。</font></i>
<a name='L419'> <a href='../S/55.html#L301' title='Defined at 301 in kernel/blk_drv/floppy.c.'>output_byte</a> (track); <i><font color='green'>// 发送参数(磁道号)。</font></i>
<a name='L420'> <a href='../S/55.html#L301' title='Defined at 301 in kernel/blk_drv/floppy.c.'>output_byte</a> (head); <i><font color='green'>// 发送参数(磁头号)。</font></i>
<a name='L421'> <a href='../S/55.html#L301' title='Defined at 301 in kernel/blk_drv/floppy.c.'>output_byte</a> (sector); <i><font color='green'>// 发送参数(起始扇区号)。</font></i>
<a name='L422'> <a href='../S/55.html#L301' title='Defined at 301 in kernel/blk_drv/floppy.c.'>output_byte</a> (2); <i><font color='green'>/* sector size = 512 */</font></i><i><font color='green'>// 发送参数(字节数(N=2)512 字节)。</font></i>
<a name='L423'> <a href='../S/55.html#L301' title='Defined at 301 in kernel/blk_drv/floppy.c.'>output_byte</a> (floppy->sect); <i><font color='green'>// 发送参数(每磁道扇区数)。</font></i>
<a name='L424'> <a href='../S/55.html#L301' title='Defined at 301 in kernel/blk_drv/floppy.c.'>output_byte</a> (floppy->gap); <i><font color='green'>// 发送参数(扇区间隔长度)。</font></i>
<a name='L425'> <a href='../S/55.html#L301' title='Defined at 301 in kernel/blk_drv/floppy.c.'>output_byte</a> (0xFF); <i><font color='green'>/* sector size (0xff when n!=0 ?) */</font></i>
<a name='L426'><i><font color='green'>// 发送参数(当N=0 时,扇区定义的字节长度),这里无用。</font></i>
<a name='L427'><i><font color='green'>// 若在发送命令和参数时发生错误,则继续执行下一软盘操作请求。</font></i>
<a name='L428'> <b>if</b> (reset)
<a name='L429'> <a href='../S/55.html#L630' title='Defined at 630 in kernel/blk_drv/floppy.c.'>do_fd_request</a> ();
<a name='L430'><font color='red'>}</font>
<a name='L431'>
<a name='L432'> <i><font color='green'>/*</font></i>
<a name='L433'><i><font color='green'> * This is the routine called after every seek (or recalibrate) interrupt</font></i>
<a name='L434'><i><font color='green'> * from the floppy controller. Note that the "unexpected interrupt" routine</font></i>
<a name='L435'><i><font color='green'> * also does a recalibrate, but doesn't come here.</font></i>
<a name='L436'><i><font color='green'> */</font></i>
<a name='L437'><i><font color='green'>/*</font></i>
<a name='L438'><i><font color='green'>* 该子程序是在每次软盘控制器寻道(或重新校正)中断后被调用的。注意</font></i>
<a name='L439'><i><font color='green'>* "unexpected interrupt"(意外中断)子程序也会执行重新校正操作,但不在此地。</font></i>
<a name='L440'><i><font color='green'>*/</font></i>
<a name='L441'><i><font color='green'>//// 寻道处理中断调用函数。</font></i>
<a name='L442'><i><font color='green'>// 首先发送检测中断状态命令,获得状态信息ST0 和磁头所在磁道信息。若出错则执行错误计数</font></i>
<a name='L443'><i><font color='green'>// 检测处理或取消本次软盘操作请求项。否则根据状态信息设置当前磁道变量,然后调用函数</font></i>
<a name='L444'><i><font color='green'>// setup_rw_floppy()设置DMA 并输出软盘读写命令和参数。</font></i>
<a name='L445'><b>static</b> <b>void</b>
<a name='L446'><a href='../S/55.html#L502' title='Refered from 502 in kernel/blk_drv/floppy.c.'>seek_interrupt</a> (<b>void</b>)
<a name='L447'><font color='red'>{</font>
<a name='L448'><i><font color='green'>/* sense drive status */</font></i><i><font color='green'>/* 检测中断状态 */</font></i>
<a name='L449'><i><font color='green'>// 发送检测中断状态命令,该命令不带参数。返回结果信息两个字节:ST0 和磁头当前磁道号。</font></i>
<a name='L450'> <a href='../S/55.html#L301' title='Defined at 301 in kernel/blk_drv/floppy.c.'>output_byte</a> (FD_SENSEI);
<a name='L451'><i><font color='green'>// 如果返回结果字节数不等于2,或者ST0 不为寻道结束,或者磁头所在磁道(ST1)不等于设定磁道,</font></i>
<a name='L452'><i><font color='green'>// 则说明发生了错误,于是执行检测错误计数处理,然后继续执行软盘请求项,并退出。</font></i>
<a name='L453'> <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> & 0xF8) != 0x20 || <a href='../S/55.html#L93' title='Defined at 93 in kernel/blk_drv/floppy.c.'>ST1</a> != seek_track)
<a name='L454'> <font color='red'>{</font>
<a name='L455'> <a href='../S/55.html#L353' title='Defined at 353 in kernel/blk_drv/floppy.c.'>bad_flp_intr</a> ();
<a name='L456'> <a href='../S/55.html#L630' title='Defined at 630 in kernel/blk_drv/floppy.c.'>do_fd_request</a> ();
<a name='L457'> <b>return</b>;
<a name='L458'> <font color='red'>}</font>
<a name='L459'> current_track = <a href='../S/55.html#L93' title='Defined at 93 in kernel/blk_drv/floppy.c.'>ST1</a>; <i><font color='green'>// 设置当前磁道。</font></i>
<a name='L460'> <a href='../S/55.html#L413' title='Defined at 413 in kernel/blk_drv/floppy.c.'>setup_rw_floppy</a> (); <i><font color='green'>// 设置DMA 并输出软盘操作命令和参数。</font></i>
<a name='L461'><font color='red'>}</font>
<a name='L462'>
<a name='L463'> <i><font color='green'>/*</font></i>
<a name='L464'><i><font color='green'> * This routine is called when everything should be correctly set up</font></i>
<a name='L465'><i><font color='green'> * for the transfer (ie floppy motor is on and the correct floppy is</font></i>
<a name='L466'><i><font color='green'> * selected).</font></i>
<a name='L467'><i><font color='green'> */</font></i>
<a name='L468'><i><font color='green'>/*</font></i>
<a name='L469'><i><font color='green'>* 该函数是在传输操作的所有信息都正确设置好后被调用的(也即软驱马达已开启</font></i>
<a name='L470'><i><font color='green'>* 并且已选择了正确的软盘(软驱)。</font></i>
<a name='L471'><i><font color='green'>*/</font></i>
<a name='L472'><i><font color='green'>//// 读写数据传输函数。</font></i>
<a name='L473'><b>static</b> <b>void</b>
<a name='L474'><a href='../R/706.html' title='Multiple refered from 2 places.'>transfer</a> (<b>void</b>)
<a name='L475'><font color='red'>{</font>
<a name='L476'><i><font color='green'>// 首先看当前驱动器参数是否就是指定驱动器的参数,若不是就发送设置驱动器参数命令及相应</font></i>
<a name='L477'><i><font color='green'>// 参数(参数1:高4 位步进速率,低四位磁头卸载时间;参数2:磁头加载时间)。</font></i>
<a name='L478'> <b>if</b> (cur_spec1 != floppy->spec1)
<a name='L479'> <font color='red'>{</font>
<a name='L480'> cur_spec1 = floppy->spec1;
<a name='L481'> <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='L482'> <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='L483'> <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='L484'> <font color='red'>}</font>
<a name='L485'><i><font color='green'>// 判断当前数据传输速率是否与指定驱动器的一致,若不是就发送指定软驱的速率值到数据传输</font></i>
<a name='L486'><i><font color='green'>// 速率控制寄存器(FD_DCR)。</font></i>
<a name='L487'> <b>if</b> (cur_rate != floppy->rate)
<a name='L488'> <a href='../S/22.html#L17' title='Defined at 17 in include/asm/io.h.'>outb_p</a> (cur_rate = floppy->rate, FD_DCR);
<a name='L489'><i><font color='green'>// 若返回结果信息表明出错,则再调用软盘请求函数,并返回。</font></i>
<a name='L490'> <b>if</b> (reset)
<a name='L491'> <font color='red'>{</font>
<a name='L492'> <a href='../S/55.html#L630' title='Defined at 630 in kernel/blk_drv/floppy.c.'>do_fd_request</a> ();
<a name='L493'> <b>return</b>;
<a name='L494'> <font color='red'>}</font>
<a name='L495'><i><font color='green'>// 若寻道标志为零(不需要寻道),则设置DMA 并发送相应读写操作命令和参数,然后返回。</font></i>
<a name='L496'> <b>if</b> (!seek)
<a name='L497'> <font color='red'>{</font>
<a name='L498'> <a href='../S/55.html#L413' title='Defined at 413 in kernel/blk_drv/floppy.c.'>setup_rw_floppy</a> ();
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?