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

📄 floppy.c

📁 linux0.11 version(301k)
💻 C
📖 第 1 页 / 共 4 页
字号:
 <a name=L96 href="source/kernel/blk_drv/floppy.c#L96">96</a> <b><i> * Rate is 0 for 500kb/s, 2 for 300kbps, 1 for 250kbps</i></b> <a name=L97 href="source/kernel/blk_drv/floppy.c#L97">97</a> <b><i> * Spec1 is 0xSH, where S is stepping rate (F=1ms, E=2ms, D=3ms etc),</i></b> <a name=L98 href="source/kernel/blk_drv/floppy.c#L98">98</a> <b><i> * H is head unload time (1=16ms, 2=32ms, etc)</i></b> <a name=L99 href="source/kernel/blk_drv/floppy.c#L99">99</a> <b><i> *</i></b><a name=L100 href="source/kernel/blk_drv/floppy.c#L100">100</a> <b><i> * Spec2 is (HLD&lt;&lt;1 | ND), where HLD is head load time (1=2ms, 2=4 ms etc)</i></b><a name=L101 href="source/kernel/blk_drv/floppy.c#L101">101</a> <b><i> * and ND is set means no DMA. Hardcoded to 6 (HLD=6ms, use DMA).</i></b><a name=L102 href="source/kernel/blk_drv/floppy.c#L102">102</a> <b><i> */</i></b><a name=L103 href="source/kernel/blk_drv/floppy.c#L103">103</a> <a name=L104 href="source/kernel/blk_drv/floppy.c#L104">104</a> extern void <a href="ident?i=floppy_interrupt">floppy_interrupt</a>(void);<a name=L105 href="source/kernel/blk_drv/floppy.c#L105">105</a> extern char <a href="ident?i=tmp_floppy_area">tmp_floppy_area</a>[1024];<a name=L106 href="source/kernel/blk_drv/floppy.c#L106">106</a> <a name=L107 href="source/kernel/blk_drv/floppy.c#L107">107</a> <b><i>/*</i></b><a name=L108 href="source/kernel/blk_drv/floppy.c#L108">108</a> <b><i> * These are global variables, as that's the easiest way to give</i></b><a name=L109 href="source/kernel/blk_drv/floppy.c#L109">109</a> <b><i> * information to interrupts. They are the data used for the current</i></b><a name=L110 href="source/kernel/blk_drv/floppy.c#L110">110</a> <b><i> * request.</i></b><a name=L111 href="source/kernel/blk_drv/floppy.c#L111">111</a> <b><i> */</i></b><a name=L112 href="source/kernel/blk_drv/floppy.c#L112">112</a> static int <a href="ident?i=cur_spec1">cur_spec1</a> = -1;<a name=L113 href="source/kernel/blk_drv/floppy.c#L113">113</a> static int <a href="ident?i=cur_rate">cur_rate</a> = -1;<a name=L114 href="source/kernel/blk_drv/floppy.c#L114">114</a> static struct <a href="ident?i=floppy_struct">floppy_struct</a> * <a href="ident?i=floppy">floppy</a> = <a href="ident?i=floppy_type">floppy_type</a>;<a name=L115 href="source/kernel/blk_drv/floppy.c#L115">115</a> static unsigned char <a href="ident?i=current_drive">current_drive</a> = 0;<a name=L116 href="source/kernel/blk_drv/floppy.c#L116">116</a> static unsigned char <a href="ident?i=sector">sector</a> = 0;<a name=L117 href="source/kernel/blk_drv/floppy.c#L117">117</a> static unsigned char <a href="ident?i=head">head</a> = 0;<a name=L118 href="source/kernel/blk_drv/floppy.c#L118">118</a> static unsigned char <a href="ident?i=track">track</a> = 0;<a name=L119 href="source/kernel/blk_drv/floppy.c#L119">119</a> static unsigned char <a href="ident?i=seek_track">seek_track</a> = 0;<a name=L120 href="source/kernel/blk_drv/floppy.c#L120">120</a> static unsigned char <a href="ident?i=current_track">current_track</a> = 255;<a name=L121 href="source/kernel/blk_drv/floppy.c#L121">121</a> static unsigned char <a href="ident?i=command">command</a> = 0;<a name=L122 href="source/kernel/blk_drv/floppy.c#L122">122</a> unsigned char <a href="ident?i=selected">selected</a> = 0;<a name=L123 href="source/kernel/blk_drv/floppy.c#L123">123</a> struct <a href="ident?i=task_struct">task_struct</a> * <a href="ident?i=wait_on_floppy_select">wait_on_floppy_select</a> = <a href="ident?i=NULL">NULL</a>;<a name=L124 href="source/kernel/blk_drv/floppy.c#L124">124</a> <a name=L125 href="source/kernel/blk_drv/floppy.c#L125">125</a> void <a href="ident?i=floppy_deselect">floppy_deselect</a>(unsigned int nr)<a name=L126 href="source/kernel/blk_drv/floppy.c#L126">126</a> {<a name=L127 href="source/kernel/blk_drv/floppy.c#L127">127</a>         if (nr != (<a href="ident?i=current_DOR">current_DOR</a> &amp; 3))<a name=L128 href="source/kernel/blk_drv/floppy.c#L128">128</a>                 <a href="ident?i=printk">printk</a>(<i>"floppy_deselect: drive not selected\n\r"</i>);<a name=L129 href="source/kernel/blk_drv/floppy.c#L129">129</a>         <a href="ident?i=selected">selected</a> = 0;<a name=L130 href="source/kernel/blk_drv/floppy.c#L130">130</a>         <a href="ident?i=wake_up">wake_up</a>(&amp;<a href="ident?i=wait_on_floppy_select">wait_on_floppy_select</a>);<a name=L131 href="source/kernel/blk_drv/floppy.c#L131">131</a> }<a name=L132 href="source/kernel/blk_drv/floppy.c#L132">132</a> <a name=L133 href="source/kernel/blk_drv/floppy.c#L133">133</a> <b><i>/*</i></b><a name=L134 href="source/kernel/blk_drv/floppy.c#L134">134</a> <b><i> * floppy-change is never called from an interrupt, so we can relax a bit</i></b><a name=L135 href="source/kernel/blk_drv/floppy.c#L135">135</a> <b><i> * here, sleep etc. Note that floppy-on tries to set current_DOR to point</i></b><a name=L136 href="source/kernel/blk_drv/floppy.c#L136">136</a> <b><i> * to the desired drive, but it will probably not survive the sleep if</i></b><a name=L137 href="source/kernel/blk_drv/floppy.c#L137">137</a> <b><i> * several floppies are used at the same time: thus the loop.</i></b><a name=L138 href="source/kernel/blk_drv/floppy.c#L138">138</a> <b><i> */</i></b><a name=L139 href="source/kernel/blk_drv/floppy.c#L139">139</a> int <a href="ident?i=floppy_change">floppy_change</a>(unsigned int nr)<a name=L140 href="source/kernel/blk_drv/floppy.c#L140">140</a> {<a name=L141 href="source/kernel/blk_drv/floppy.c#L141">141</a> repeat:<a name=L142 href="source/kernel/blk_drv/floppy.c#L142">142</a>         <a href="ident?i=floppy_on">floppy_on</a>(nr);<a name=L143 href="source/kernel/blk_drv/floppy.c#L143">143</a>         while ((<a href="ident?i=current_DOR">current_DOR</a> &amp; 3) != nr &amp;&amp; <a href="ident?i=selected">selected</a>)<a name=L144 href="source/kernel/blk_drv/floppy.c#L144">144</a>                 <a href="ident?i=interruptible_sleep_on">interruptible_sleep_on</a>(&amp;<a href="ident?i=wait_on_floppy_select">wait_on_floppy_select</a>);<a name=L145 href="source/kernel/blk_drv/floppy.c#L145">145</a>         if ((<a href="ident?i=current_DOR">current_DOR</a> &amp; 3) != nr)<a name=L146 href="source/kernel/blk_drv/floppy.c#L146">146</a>                 goto repeat;<a name=L147 href="source/kernel/blk_drv/floppy.c#L147">147</a>         if (<a href="ident?i=inb">inb</a>(<a href="ident?i=FD_DIR">FD_DIR</a>) &amp; 0x80) {<a name=L148 href="source/kernel/blk_drv/floppy.c#L148">148</a>                 <a href="ident?i=floppy_off">floppy_off</a>(nr);<a name=L149 href="source/kernel/blk_drv/floppy.c#L149">149</a>                 return 1;<a name=L150 href="source/kernel/blk_drv/floppy.c#L150">150</a>         }<a name=L151 href="source/kernel/blk_drv/floppy.c#L151">151</a>         <a href="ident?i=floppy_off">floppy_off</a>(nr);<a name=L152 href="source/kernel/blk_drv/floppy.c#L152">152</a>         return 0;<a name=L153 href="source/kernel/blk_drv/floppy.c#L153">153</a> }<a name=L154 href="source/kernel/blk_drv/floppy.c#L154">154</a> <a name=L155 href="source/kernel/blk_drv/floppy.c#L155">155</a> #define <a href="ident?i=copy_buffer">copy_buffer</a>(from,to) \<a name=L156 href="source/kernel/blk_drv/floppy.c#L156">156</a> __asm__(<i>"cld ; rep ; movsl"</i> \<a name=L157 href="source/kernel/blk_drv/floppy.c#L157">157</a>         ::<i>"c"</i> (<a href="ident?i=BLOCK_SIZE">BLOCK_SIZE</a>/4),<i>"S"</i> ((long)(from)),<i>"D"</i> ((long)(to)) \<a name=L158 href="source/kernel/blk_drv/floppy.c#L158">158</a>         :<i>"cx"</i>,<i>"di"</i>,<i>"si"</i>)<a name=L159 href="source/kernel/blk_drv/floppy.c#L159">159</a> <a name=L160 href="source/kernel/blk_drv/floppy.c#L160">160</a> static void <a href="ident?i=setup_DMA">setup_DMA</a>(void)<a name=L161 href="source/kernel/blk_drv/floppy.c#L161">161</a> {<a name=L162 href="source/kernel/blk_drv/floppy.c#L162">162</a>         long addr = (long) <a href="ident?i=CURRENT">CURRENT</a>-&gt;buffer;<a name=L163 href="source/kernel/blk_drv/floppy.c#L163">163</a> <a name=L164 href="source/kernel/blk_drv/floppy.c#L164">164</a>         <a href="ident?i=cli">cli</a>();<a name=L165 href="source/kernel/blk_drv/floppy.c#L165">165</a>         if (addr &gt;= 0x100000) {<a name=L166 href="source/kernel/blk_drv/floppy.c#L166">166</a>                 addr = (long) <a href="ident?i=tmp_floppy_area">tmp_floppy_area</a>;<a name=L167 href="source/kernel/blk_drv/floppy.c#L167">167</a>                 if (<a href="ident?i=command">command</a> == <a href="ident?i=FD_WRITE">FD_WRITE</a>)<a name=L168 href="source/kernel/blk_drv/floppy.c#L168">168</a>                         <a href="ident?i=copy_buffer">copy_buffer</a>(<a href="ident?i=CURRENT">CURRENT</a>-&gt;buffer,<a href="ident?i=tmp_floppy_area">tmp_floppy_area</a>);<a name=L169 href="source/kernel/blk_drv/floppy.c#L169">169</a>         }<a name=L170 href="source/kernel/blk_drv/floppy.c#L170">170</a> <b><i>/* mask DMA 2 */</i></b><a name=L171 href="source/kernel/blk_drv/floppy.c#L171">171</a>         <a href="ident?i=immoutb_p">immoutb_p</a>(4|2,10);<a name=L172 href="source/kernel/blk_drv/floppy.c#L172">172</a> <b><i>/* output command byte. I don't know why, but everyone (minix, */</i></b><a name=L173 href="source/kernel/blk_drv/floppy.c#L173">173</a> <b><i>/* sanches &amp; canton) output this twice, first to 12 then to 11 */</i></b><a name=L174 href="source/kernel/blk_drv/floppy.c#L174">174</a>         __asm__(<i>"outb %%al,$12\n\tjmp 1f\n1:\tjmp 1f\n1:\t"</i><a name=L175 href="source/kernel/blk_drv/floppy.c#L175">175</a>         <i>"outb %%al,$11\n\tjmp 1f\n1:\tjmp 1f\n1:"</i>::<a name=L176 href="source/kernel/blk_drv/floppy.c#L176">176</a>         <i>"a"</i> ((char) ((<a href="ident?i=command">command</a> == <a href="ident?i=FD_READ">FD_READ</a>)?<a href="ident?i=DMA_READ">DMA_READ</a>:<a href="ident?i=DMA_WRITE">DMA_WRITE</a>)));<a name=L177 href="source/kernel/blk_drv/floppy.c#L177">177</a> <b><i>/* 8 low bits of addr */</i></b><a name=L178 href="source/kernel/blk_drv/floppy.c#L178">178</a>         <a href="ident?i=immoutb_p">immoutb_p</a>(addr,4);<a name=L179 href="source/kernel/blk_drv/floppy.c#L179">179</a>         addr &gt;&gt;= 8;<a name=L180 href="source/kernel/blk_drv/floppy.c#L180">180</a> <b><i>/* bits 8-15 of addr */</i></b><a name=L181 href="source/kernel/blk_drv/floppy.c#L181">181</a>         <a href="ident?i=immoutb_p">immoutb_p</a>(addr,4);<a name=L182 href="source/kernel/blk_drv/floppy.c#L182">182</a>         addr &gt;&gt;= 8;<a name=L183 href="source/kernel/blk_drv/floppy.c#L183">183</a> <b><i>/* bits 16-19 of addr */</i></b><a name=L184 href="source/kernel/blk_drv/floppy.c#L184">184</a>         <a href="ident?i=immoutb_p">immoutb_p</a>(addr,0x81);<a name=L185 href="source/kernel/blk_drv/floppy.c#L185">185</a> <b><i>/* low 8 bits of count-1 (1024-1=0x3ff) */</i></b><a name=L186 href="source/kernel/blk_drv/floppy.c#L186">186</a>         <a href="ident?i=immoutb_p">immoutb_p</a>(0xff,5);<a name=L187 href="source/kernel/blk_drv/floppy.c#L187">187</a> <b><i>/* high 8 bits of count-1 */</i></b><a name=L188 href="source/kernel/blk_drv/floppy.c#L188">188</a>         <a href="ident?i=immoutb_p">immoutb_p</a>(3,5);<a name=L189 href="source/kernel/blk_drv/floppy.c#L189">189</a> <b><i>/* activate DMA 2 */</i></b><a name=L190 href="source/kernel/blk_drv/floppy.c#L190">190</a>         <a href="ident?i=immoutb_p">immoutb_p</a>(0|2,10);<a name=L191 href="source/kernel/blk_drv/floppy.c#L191">191</a>         <a href="ident?i=sti">sti</a>();<a name=L192 href="source/kernel/blk_drv/floppy.c#L192">192</a> }<a name=L193 href="source/kernel/blk_drv/floppy.c#L193">193</a> <a name=L194 href="source/kernel/blk_drv/floppy.c#L194">194</a> static void <a href="ident?i=output_byte">output_byte</a>(char byte)<a name=L195 href="source/kernel/blk_drv/floppy.c#L195">195</a> {<a name=L196 href="source/kernel/blk_drv/floppy.c#L196">196</a>         int counter;<a name=L197 href="source/kernel/blk_drv/floppy.c#L197">197</a>         unsigned char status;<a name=L198 href="source/kernel/blk_drv/floppy.c#L198">198</a> <a name=L199 href="source/kernel/blk_drv/floppy.c#L199">199</a>         if (<a href="ident?i=reset">reset</a>)<a name=L200 href="source/kernel/blk_drv/floppy.c#L200">200</a>                 return;<a name=L201 href="source/kernel/blk_drv/floppy.c#L201">201</a>         for(counter = 0 ; counter &lt; 10000 ; counter++) {<a name=L202 href="source/kernel/blk_drv/floppy.c#L202">202</a>                 status = <a href="ident?i=inb_p">inb_p</a>(<a href="ident?i=FD_STATUS">FD_STATUS</a>) &amp; (<a href="ident?i=STATUS_READY">STATUS_READY</a> | <a href="ident?i=STATUS_DIR">STATUS_DIR</a>);<a name=L203 href="source/kernel/blk_drv/floppy.c#L203">203</a>                 if (status == <a href="ident?i=STATUS_READY">STATUS_READY</a>) {<a name=L204 href="source/kernel/blk_drv/floppy.c#L204">204</a>                         <a href="ident?i=outb">outb</a>(byte,<a href="ident?i=FD_DATA">FD_DATA</a>);<a name=L205 href="source/kernel/blk_drv/floppy.c#L205">205</a>                         return;<a name=L206 href="source/kernel/blk_drv/floppy.c#L206">206</a>                 }<a name=L207 href="source/kernel/blk_drv/floppy.c#L207">207</a>         }<a name=L208 href="source/kernel/blk_drv/floppy.c#L208">208</a>         <a href="ident?i=reset">reset</a> = 1;<a name=L209 href="source/kernel/blk_drv/floppy.c#L209">209</a>         <a href="ident?i=printk">printk</a>(<i>"Unable to send byte to FDC\n\r"</i>);<a name=L210 href="source/kernel/blk_drv/floppy.c#L210">210</a> }<a name=L211 href="source/kernel/blk_drv/floppy.c#L211">211</a> <a name=L212 href="source/kernel/blk_drv/floppy.c#L212">212</a> static int <a href="ident?i=result">result</a>(void)<a name=L213 href="source/kernel/blk_drv/floppy.c#L213">213</a> {<a name=L214 href="source/kernel/blk_drv/floppy.c#L214">214</a>         int i = 0, counter, status;<a name=L215 href="source/kernel/blk_drv/floppy.c#L215">215</a> <a name=L216 href="source/kernel/blk_drv/floppy.c#L216">216</a>         if (<a href="ident?i=reset">reset</a>)<a name=L217 href="source/kernel/blk_drv/floppy.c#L217">217</a>                 return -1;<a name=L218 href="source/kernel/blk_drv/floppy.c#L218">218</a>         for (counter = 0 ; counter &lt; 10000 ; counter++) {<a name=L219 href="source/kernel/blk_drv/floppy.c#L219">219</a>                 status = <a href="ident?i=inb_p">inb_p</a>(<a href="ident?i=FD_STATUS">FD_STATUS</a>)&amp;(<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=L220 href="source/kernel/blk_drv/floppy.c#L220">220</a>                 if (status == <a href="ident?i=STATUS_READY">STATUS_READY</a>)<a name=L221 href="source/kernel/blk_drv/floppy.c#L221">221</a>                         return i;

⌨️ 快捷键说明

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