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

📄 serial.c

📁 linux字符驱动源码
💻 C
📖 第 1 页 / 共 5 页
字号:
<a name=L179 href="source/kernel/chr_drv/serial.c?v=0.97#L179">179</a> {<a name=L180 href="source/kernel/chr_drv/serial.c?v=0.97#L180">180</a>         <a href="ident?v=0.97;i=check_tty">check_tty</a>(<a href="ident?v=0.97;i=serial_table">serial_table</a>+1);<a name=L181 href="source/kernel/chr_drv/serial.c?v=0.97#L181">181</a> }<a name=L182 href="source/kernel/chr_drv/serial.c?v=0.97#L182">182</a> <a name=L183 href="source/kernel/chr_drv/serial.c?v=0.97#L183">183</a> static void <a href="ident?v=0.97;i=com3_IRQ">com3_IRQ</a>(int unused)<a name=L184 href="source/kernel/chr_drv/serial.c?v=0.97#L184">184</a> {<a name=L185 href="source/kernel/chr_drv/serial.c?v=0.97#L185">185</a>         <a href="ident?v=0.97;i=check_tty">check_tty</a>(<a href="ident?v=0.97;i=serial_table">serial_table</a>+2);<a name=L186 href="source/kernel/chr_drv/serial.c?v=0.97#L186">186</a> }<a name=L187 href="source/kernel/chr_drv/serial.c?v=0.97#L187">187</a> <a name=L188 href="source/kernel/chr_drv/serial.c?v=0.97#L188">188</a> static void <a href="ident?v=0.97;i=com4_IRQ">com4_IRQ</a>(int unused)<a name=L189 href="source/kernel/chr_drv/serial.c?v=0.97#L189">189</a> {<a name=L190 href="source/kernel/chr_drv/serial.c?v=0.97#L190">190</a>         <a href="ident?v=0.97;i=check_tty">check_tty</a>(<a href="ident?v=0.97;i=serial_table">serial_table</a>+3);<a name=L191 href="source/kernel/chr_drv/serial.c?v=0.97#L191">191</a> }<a name=L192 href="source/kernel/chr_drv/serial.c?v=0.97#L192">192</a> <a name=L193 href="source/kernel/chr_drv/serial.c?v=0.97#L193">193</a> <b><i>/*</i></b><a name=L194 href="source/kernel/chr_drv/serial.c?v=0.97#L194">194</a> <b><i> * Receive timer routines: one per line</i></b><a name=L195 href="source/kernel/chr_drv/serial.c?v=0.97#L195">195</a> <b><i> */</i></b><a name=L196 href="source/kernel/chr_drv/serial.c?v=0.97#L196">196</a> static void <a href="ident?v=0.97;i=com1_timer">com1_timer</a>(void)<a name=L197 href="source/kernel/chr_drv/serial.c?v=0.97#L197">197</a> {<a name=L198 href="source/kernel/chr_drv/serial.c?v=0.97#L198">198</a>         <a href="ident?v=0.97;i=TTY_READ_FLUSH">TTY_READ_FLUSH</a>(<a href="ident?v=0.97;i=tty_table">tty_table</a>+64);<a name=L199 href="source/kernel/chr_drv/serial.c?v=0.97#L199">199</a> }<a name=L200 href="source/kernel/chr_drv/serial.c?v=0.97#L200">200</a> <a name=L201 href="source/kernel/chr_drv/serial.c?v=0.97#L201">201</a> static void <a href="ident?v=0.97;i=com2_timer">com2_timer</a>(void)<a name=L202 href="source/kernel/chr_drv/serial.c?v=0.97#L202">202</a> {<a name=L203 href="source/kernel/chr_drv/serial.c?v=0.97#L203">203</a>         <a href="ident?v=0.97;i=TTY_READ_FLUSH">TTY_READ_FLUSH</a>(<a href="ident?v=0.97;i=tty_table">tty_table</a>+65);<a name=L204 href="source/kernel/chr_drv/serial.c?v=0.97#L204">204</a> }<a name=L205 href="source/kernel/chr_drv/serial.c?v=0.97#L205">205</a> <a name=L206 href="source/kernel/chr_drv/serial.c?v=0.97#L206">206</a> static void <a href="ident?v=0.97;i=com3_timer">com3_timer</a>(void)<a name=L207 href="source/kernel/chr_drv/serial.c?v=0.97#L207">207</a> {<a name=L208 href="source/kernel/chr_drv/serial.c?v=0.97#L208">208</a>         <a href="ident?v=0.97;i=TTY_READ_FLUSH">TTY_READ_FLUSH</a>(<a href="ident?v=0.97;i=tty_table">tty_table</a>+66);<a name=L209 href="source/kernel/chr_drv/serial.c?v=0.97#L209">209</a> }<a name=L210 href="source/kernel/chr_drv/serial.c?v=0.97#L210">210</a> <a name=L211 href="source/kernel/chr_drv/serial.c?v=0.97#L211">211</a> static void <a href="ident?v=0.97;i=com4_timer">com4_timer</a>(void)<a name=L212 href="source/kernel/chr_drv/serial.c?v=0.97#L212">212</a> {<a name=L213 href="source/kernel/chr_drv/serial.c?v=0.97#L213">213</a>         <a href="ident?v=0.97;i=TTY_READ_FLUSH">TTY_READ_FLUSH</a>(<a href="ident?v=0.97;i=tty_table">tty_table</a>+67);<a name=L214 href="source/kernel/chr_drv/serial.c?v=0.97#L214">214</a> }<a name=L215 href="source/kernel/chr_drv/serial.c?v=0.97#L215">215</a> <a name=L216 href="source/kernel/chr_drv/serial.c?v=0.97#L216">216</a> <b><i>/*</i></b><a name=L217 href="source/kernel/chr_drv/serial.c?v=0.97#L217">217</a> <b><i> * Send timeout routines: one per line</i></b><a name=L218 href="source/kernel/chr_drv/serial.c?v=0.97#L218">218</a> <b><i> */</i></b><a name=L219 href="source/kernel/chr_drv/serial.c?v=0.97#L219">219</a> static void <a href="ident?v=0.97;i=com1_timeout">com1_timeout</a>(void)<a name=L220 href="source/kernel/chr_drv/serial.c?v=0.97#L220">220</a> {<a name=L221 href="source/kernel/chr_drv/serial.c?v=0.97#L221">221</a>         <a href="ident?v=0.97;i=do_rs_write">do_rs_write</a>(<a href="ident?v=0.97;i=serial_table">serial_table</a>);<a name=L222 href="source/kernel/chr_drv/serial.c?v=0.97#L222">222</a> }<a name=L223 href="source/kernel/chr_drv/serial.c?v=0.97#L223">223</a> <a name=L224 href="source/kernel/chr_drv/serial.c?v=0.97#L224">224</a> static void <a href="ident?v=0.97;i=com2_timeout">com2_timeout</a>(void)<a name=L225 href="source/kernel/chr_drv/serial.c?v=0.97#L225">225</a> {<a name=L226 href="source/kernel/chr_drv/serial.c?v=0.97#L226">226</a>         <a href="ident?v=0.97;i=do_rs_write">do_rs_write</a>(<a href="ident?v=0.97;i=serial_table">serial_table</a> + 1);<a name=L227 href="source/kernel/chr_drv/serial.c?v=0.97#L227">227</a> }<a name=L228 href="source/kernel/chr_drv/serial.c?v=0.97#L228">228</a> <a name=L229 href="source/kernel/chr_drv/serial.c?v=0.97#L229">229</a> static void <a href="ident?v=0.97;i=com3_timeout">com3_timeout</a>(void)<a name=L230 href="source/kernel/chr_drv/serial.c?v=0.97#L230">230</a> {<a name=L231 href="source/kernel/chr_drv/serial.c?v=0.97#L231">231</a>         <a href="ident?v=0.97;i=do_rs_write">do_rs_write</a>(<a href="ident?v=0.97;i=serial_table">serial_table</a> + 2);<a name=L232 href="source/kernel/chr_drv/serial.c?v=0.97#L232">232</a> }<a name=L233 href="source/kernel/chr_drv/serial.c?v=0.97#L233">233</a> <a name=L234 href="source/kernel/chr_drv/serial.c?v=0.97#L234">234</a> static void <a href="ident?v=0.97;i=com4_timeout">com4_timeout</a>(void)<a name=L235 href="source/kernel/chr_drv/serial.c?v=0.97#L235">235</a> {<a name=L236 href="source/kernel/chr_drv/serial.c?v=0.97#L236">236</a>         <a href="ident?v=0.97;i=do_rs_write">do_rs_write</a>(<a href="ident?v=0.97;i=serial_table">serial_table</a> + 3);<a name=L237 href="source/kernel/chr_drv/serial.c?v=0.97#L237">237</a> }<a name=L238 href="source/kernel/chr_drv/serial.c?v=0.97#L238">238</a> <a name=L239 href="source/kernel/chr_drv/serial.c?v=0.97#L239">239</a> static void <a href="ident?v=0.97;i=init">init</a>(struct <a href="ident?v=0.97;i=serial_struct">serial_struct</a> * <a href="ident?v=0.97;i=info">info</a>)<a name=L240 href="source/kernel/chr_drv/serial.c?v=0.97#L240">240</a> {<a name=L241 href="source/kernel/chr_drv/serial.c?v=0.97#L241">241</a>         unsigned char status1, status2, scratch;<a name=L242 href="source/kernel/chr_drv/serial.c?v=0.97#L242">242</a>         unsigned short port = <a href="ident?v=0.97;i=info">info</a>-&gt;port;<a name=L243 href="source/kernel/chr_drv/serial.c?v=0.97#L243">243</a> <a name=L244 href="source/kernel/chr_drv/serial.c?v=0.97#L244">244</a>         if (<a href="ident?v=0.97;i=inb">inb</a>(port+5) == 0xff) {<a name=L245 href="source/kernel/chr_drv/serial.c?v=0.97#L245">245</a>                 <a href="ident?v=0.97;i=info">info</a>-&gt;type = <a href="ident?v=0.97;i=PORT_UNKNOWN">PORT_UNKNOWN</a>;<a name=L246 href="source/kernel/chr_drv/serial.c?v=0.97#L246">246</a>                 return;<a name=L247 href="source/kernel/chr_drv/serial.c?v=0.97#L247">247</a>         }<a name=L248 href="source/kernel/chr_drv/serial.c?v=0.97#L248">248</a>         <a name=L249 href="source/kernel/chr_drv/serial.c?v=0.97#L249">249</a>         scratch = <a href="ident?v=0.97;i=inb">inb</a>(port+7);<a name=L250 href="source/kernel/chr_drv/serial.c?v=0.97#L250">250</a>         <a href="ident?v=0.97;i=outb_p">outb_p</a>(0xa5, port+7);<a name=L251 href="source/kernel/chr_drv/serial.c?v=0.97#L251">251</a>         status1 = <a href="ident?v=0.97;i=inb">inb</a>(port+7);<a name=L252 href="source/kernel/chr_drv/serial.c?v=0.97#L252">252</a>         <a href="ident?v=0.97;i=outb_p">outb_p</a>(0x5a, port+7);<a name=L253 href="source/kernel/chr_drv/serial.c?v=0.97#L253">253</a>         status2 = <a href="ident?v=0.97;i=inb">inb</a>(port+7);<a name=L254 href="source/kernel/chr_drv/serial.c?v=0.97#L254">254</a>         if (status1 == 0xa5 &amp;&amp; status2 == 0x5a) {<a name=L255 href="source/kernel/chr_drv/serial.c?v=0.97#L255">255</a>                 <a href="ident?v=0.97;i=outb_p">outb_p</a>(scratch, port+7);<a name=L256 href="source/kernel/chr_drv/serial.c?v=0.97#L256">256</a>                 <a href="ident?v=0.97;i=outb_p">outb_p</a>(0x01, port+2);<a name=L257 href="source/kernel/chr_drv/serial.c?v=0.97#L257">257</a>                 scratch = <a href="ident?v=0.97;i=inb">inb</a>(port+2) &gt;&gt; 6;<a name=L258 href="source/kernel/chr_drv/serial.c?v=0.97#L258">258</a>                 switch (scratch) {<a name=L259 href="source/kernel/chr_drv/serial.c?v=0.97#L259">259</a>                         case 0:<a name=L260 href="source/kernel/chr_drv/serial.c?v=0.97#L260">260</a>                                 <a href="ident?v=0.97;i=info">info</a>-&gt;type = <a href="ident?v=0.97;i=PORT_16450">PORT_16450</a>;<a name=L261 href="source/kernel/chr_drv/serial.c?v=0.97#L261">261</a>                                 break;<a name=L262 href="source/kernel/chr_drv/serial.c?v=0.97#L262">262</a>                         case 1:<a name=L263 href="source/kernel/chr_drv/serial.c?v=0.97#L263">263</a>                                 <a href="ident?v=0.97;i=info">info</a>-&gt;type = <a href="ident?v=0.97;i=PORT_UNKNOWN">PORT_UNKNOWN</a>;<a name=L264 href="source/kernel/chr_drv/serial.c?v=0.97#L264">264</a>                                 break;<a name=L265 href="source/kernel/chr_drv/serial.c?v=0.97#L265">265</a>                         case 2:<a name=L266 href="source/kernel/chr_drv/serial.c?v=0.97#L266">266</a>                                 <a href="ident?v=0.97;i=info">info</a>-&gt;type = <a href="ident?v=0.97;i=PORT_16550">PORT_16550</a>;<a name=L267 href="source/kernel/chr_drv/serial.c?v=0.97#L267">267</a>                                 <a href="ident?v=0.97;i=outb_p">outb_p</a>(0x00, port+2);<a name=L268 href="source/kernel/chr_drv/serial.c?v=0.97#L268">268</a>                                 break;<a name=L269 href="source/kernel/chr_drv/serial.c?v=0.97#L269">269</a>                         case 3:<a name=L270 href="source/kernel/chr_drv/serial.c?v=0.97#L270">270</a>                                 <a href="ident?v=0.97;i=info">info</a>-&gt;type = <a href="ident?v=0.97;i=PORT_16550A">PORT_16550A</a>;<a name=L271 href="source/kernel/chr_drv/serial.c?v=0.97#L271">271</a>                                 <a href="ident?v=0.97;i=outb_p">outb_p</a>(0xc7, port+2);<a name=L272 href="source/kernel/chr_drv/serial.c?v=0.97#L272">272</a>                                 break;<a name=L273 href="source/kernel/chr_drv/serial.c?v=0.97#L273">273</a>                 }<a name=L274 href="source/kernel/chr_drv/serial.c?v=0.97#L274">274</a>         } else<a name=L275 href="source/kernel/chr_drv/serial.c?v=0.97#L275">275</a>                 <a href="ident?v=0.97;i=info">info</a>-&gt;type = <a href="ident?v=0.97;i=PORT_8250">PORT_8250</a>;<a name=L276 href="source/kernel/chr_drv/serial.c?v=0.97#L276">276</a>         <a href="ident?v=0.97;i=outb_p">outb_p</a>(0x80,port+3);    <b><i>/* set DLAB of line control reg */</i></b><a name=L277 href="source/kernel/chr_drv/serial.c?v=0.97#L277">277</a>         <a href="ident?v=0.97;i=outb_p">outb_p</a>(0x30,port);      <b><i>/* LS of divisor (48 -&gt; 2400 bps) */</i></b><a name=L278 href="source/kernel/chr_drv/serial.c?v=0.97#L278">278</a>         <a href="ident?v=0.97;i=outb_p">outb_p</a>(0x00,port+1);    <b><i>/* MS of divisor */</i></b><a name=L279 href="source/kernel/chr_drv/serial.c?v=0.97#L279">279</a>         <a href="ident?v=0.97;i=outb_p">outb_p</a>(0x03,port+3);    <b><i>/* reset DLAB */</i></b><a name=L280 href="source/kernel/chr_drv/serial.c?v=0.97#L280">280</a>         <a href="ident?v=0.97;i=outb_p">outb_p</a>(0x00,port+4);    <b><i>/* reset DTR,RTS, OUT_2 */</i></b><a name=L281 href="source/kernel/chr_drv/serial.c?v=0.97#L281">281</a>         <a href="ident?v=0.97;i=outb_p">outb_p</a>(0x00,port+1);    <b><i>/* disable all intrs */</i></b><a name=L282 href="source/kernel/chr_drv/serial.c?v=0.97#L282">282</a>         (void)<a href="ident?v=0.97;i=inb">inb</a>(port);        <b><i>/* read data port to reset things (?) */</i></b>

⌨️ 快捷键说明

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