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

📄 serial.c

📁 linux字符驱动源码
💻 C
📖 第 1 页 / 共 5 页
字号:
<a name=L387 href="source/kernel/chr_drv/serial.c?v=0.97#L387">387</a>                 return retval;<a name=L388 href="source/kernel/chr_drv/serial.c?v=0.97#L388">388</a>         <a href="ident?v=0.97;i=startup">startup</a>(port);<a name=L389 href="source/kernel/chr_drv/serial.c?v=0.97#L389">389</a>         return 0;<a name=L390 href="source/kernel/chr_drv/serial.c?v=0.97#L390">390</a> }<a name=L391 href="source/kernel/chr_drv/serial.c?v=0.97#L391">391</a> <a name=L392 href="source/kernel/chr_drv/serial.c?v=0.97#L392">392</a> int <a href="ident?v=0.97;i=get_serial_info">get_serial_info</a>(unsigned int line, 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=L393 href="source/kernel/chr_drv/serial.c?v=0.97#L393">393</a> {<a name=L394 href="source/kernel/chr_drv/serial.c?v=0.97#L394">394</a>         if (line &gt;= <a href="ident?v=0.97;i=NR_SERIALS">NR_SERIALS</a>)<a name=L395 href="source/kernel/chr_drv/serial.c?v=0.97#L395">395</a>                 return -<a href="ident?v=0.97;i=ENODEV">ENODEV</a>;<a name=L396 href="source/kernel/chr_drv/serial.c?v=0.97#L396">396</a>         if (!<a href="ident?v=0.97;i=info">info</a>)<a name=L397 href="source/kernel/chr_drv/serial.c?v=0.97#L397">397</a>                 return -<a href="ident?v=0.97;i=EFAULT">EFAULT</a>;<a name=L398 href="source/kernel/chr_drv/serial.c?v=0.97#L398">398</a>         <a href="ident?v=0.97;i=memcpy_tofs">memcpy_tofs</a>(<a href="ident?v=0.97;i=info">info</a>,<a href="ident?v=0.97;i=serial_table">serial_table</a>+line,sizeof(*<a href="ident?v=0.97;i=info">info</a>));<a name=L399 href="source/kernel/chr_drv/serial.c?v=0.97#L399">399</a>         return 0;<a name=L400 href="source/kernel/chr_drv/serial.c?v=0.97#L400">400</a> }<a name=L401 href="source/kernel/chr_drv/serial.c?v=0.97#L401">401</a> <a name=L402 href="source/kernel/chr_drv/serial.c?v=0.97#L402">402</a> int <a href="ident?v=0.97;i=set_serial_info">set_serial_info</a>(unsigned int line, 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=L403 href="source/kernel/chr_drv/serial.c?v=0.97#L403">403</a> {<a name=L404 href="source/kernel/chr_drv/serial.c?v=0.97#L404">404</a>         struct <a href="ident?v=0.97;i=serial_struct">serial_struct</a> tmp;<a name=L405 href="source/kernel/chr_drv/serial.c?v=0.97#L405">405</a>         unsigned new_port;<a name=L406 href="source/kernel/chr_drv/serial.c?v=0.97#L406">406</a>         unsigned irq,new_irq;<a name=L407 href="source/kernel/chr_drv/serial.c?v=0.97#L407">407</a>         int retval;<a name=L408 href="source/kernel/chr_drv/serial.c?v=0.97#L408">408</a>         void (*handler)(int) = <a href="ident?v=0.97;i=serial_handler">serial_handler</a>[line];<a name=L409 href="source/kernel/chr_drv/serial.c?v=0.97#L409">409</a> <a name=L410 href="source/kernel/chr_drv/serial.c?v=0.97#L410">410</a>         if (!<a href="ident?v=0.97;i=suser">suser</a>())<a name=L411 href="source/kernel/chr_drv/serial.c?v=0.97#L411">411</a>                 return -<a href="ident?v=0.97;i=EPERM">EPERM</a>;<a name=L412 href="source/kernel/chr_drv/serial.c?v=0.97#L412">412</a>         if (line &gt;= <a href="ident?v=0.97;i=NR_SERIALS">NR_SERIALS</a>)<a name=L413 href="source/kernel/chr_drv/serial.c?v=0.97#L413">413</a>                 return -<a href="ident?v=0.97;i=ENODEV">ENODEV</a>;<a name=L414 href="source/kernel/chr_drv/serial.c?v=0.97#L414">414</a>         if (!<a href="ident?v=0.97;i=info">info</a>)<a name=L415 href="source/kernel/chr_drv/serial.c?v=0.97#L415">415</a>                 return -<a href="ident?v=0.97;i=EFAULT">EFAULT</a>;<a name=L416 href="source/kernel/chr_drv/serial.c?v=0.97#L416">416</a>         <a href="ident?v=0.97;i=memcpy_fromfs">memcpy_fromfs</a>(&amp;tmp,<a href="ident?v=0.97;i=info">info</a>,sizeof(tmp));<a name=L417 href="source/kernel/chr_drv/serial.c?v=0.97#L417">417</a>         <a href="ident?v=0.97;i=info">info</a> = <a href="ident?v=0.97;i=serial_table">serial_table</a> + line;<a name=L418 href="source/kernel/chr_drv/serial.c?v=0.97#L418">418</a>         if (!(new_port = tmp.port))<a name=L419 href="source/kernel/chr_drv/serial.c?v=0.97#L419">419</a>                 new_port = <a href="ident?v=0.97;i=info">info</a>-&gt;port;<a name=L420 href="source/kernel/chr_drv/serial.c?v=0.97#L420">420</a>         if (!(new_irq = tmp.irq))<a name=L421 href="source/kernel/chr_drv/serial.c?v=0.97#L421">421</a>                 new_irq = <a href="ident?v=0.97;i=info">info</a>-&gt;irq;<a name=L422 href="source/kernel/chr_drv/serial.c?v=0.97#L422">422</a>         if (new_irq &gt; 15 || new_port &gt; 0xffff)<a name=L423 href="source/kernel/chr_drv/serial.c?v=0.97#L423">423</a>                 return -<a href="ident?v=0.97;i=EINVAL">EINVAL</a>;<a name=L424 href="source/kernel/chr_drv/serial.c?v=0.97#L424">424</a>         if (new_irq == 2)<a name=L425 href="source/kernel/chr_drv/serial.c?v=0.97#L425">425</a>                 new_irq = 9;<a name=L426 href="source/kernel/chr_drv/serial.c?v=0.97#L426">426</a>         irq = <a href="ident?v=0.97;i=info">info</a>-&gt;irq;<a name=L427 href="source/kernel/chr_drv/serial.c?v=0.97#L427">427</a>         if (irq == 2)<a name=L428 href="source/kernel/chr_drv/serial.c?v=0.97#L428">428</a>                 irq = 9;<a name=L429 href="source/kernel/chr_drv/serial.c?v=0.97#L429">429</a>         if (irq != new_irq) {<a name=L430 href="source/kernel/chr_drv/serial.c?v=0.97#L430">430</a>                 retval = <a href="ident?v=0.97;i=request_irq">request_irq</a>(new_irq,handler);<a name=L431 href="source/kernel/chr_drv/serial.c?v=0.97#L431">431</a>                 if (retval)<a name=L432 href="source/kernel/chr_drv/serial.c?v=0.97#L432">432</a>                         return retval;<a name=L433 href="source/kernel/chr_drv/serial.c?v=0.97#L433">433</a>                 <a href="ident?v=0.97;i=info">info</a>-&gt;irq = new_irq;<a name=L434 href="source/kernel/chr_drv/serial.c?v=0.97#L434">434</a>                 <a href="ident?v=0.97;i=free_irq">free_irq</a>(irq);<a name=L435 href="source/kernel/chr_drv/serial.c?v=0.97#L435">435</a>         }<a name=L436 href="source/kernel/chr_drv/serial.c?v=0.97#L436">436</a>         <a href="ident?v=0.97;i=cli">cli</a>();<a name=L437 href="source/kernel/chr_drv/serial.c?v=0.97#L437">437</a>         if (new_port != <a href="ident?v=0.97;i=info">info</a>-&gt;port) {<a name=L438 href="source/kernel/chr_drv/serial.c?v=0.97#L438">438</a>                 <a href="ident?v=0.97;i=outb">outb</a>(0x00,<a href="ident?v=0.97;i=info">info</a>-&gt;port+4);        <b><i>/* reset DTR, RTS, */</i></b><a name=L439 href="source/kernel/chr_drv/serial.c?v=0.97#L439">439</a>                 <a href="ident?v=0.97;i=info">info</a>-&gt;port = new_port;<a name=L440 href="source/kernel/chr_drv/serial.c?v=0.97#L440">440</a>                 <a href="ident?v=0.97;i=init">init</a>(<a href="ident?v=0.97;i=info">info</a>);<a name=L441 href="source/kernel/chr_drv/serial.c?v=0.97#L441">441</a>                 <a href="ident?v=0.97;i=startup">startup</a>(new_port);<a name=L442 href="source/kernel/chr_drv/serial.c?v=0.97#L442">442</a>         }<a name=L443 href="source/kernel/chr_drv/serial.c?v=0.97#L443">443</a>         <a href="ident?v=0.97;i=sti">sti</a>();<a name=L444 href="source/kernel/chr_drv/serial.c?v=0.97#L444">444</a>         return 0;<a name=L445 href="source/kernel/chr_drv/serial.c?v=0.97#L445">445</a> }<a name=L446 href="source/kernel/chr_drv/serial.c?v=0.97#L446">446</a> <a name=L447 href="source/kernel/chr_drv/serial.c?v=0.97#L447">447</a> long <a href="ident?v=0.97;i=rs_init">rs_init</a>(long kmem_start)<a name=L448 href="source/kernel/chr_drv/serial.c?v=0.97#L448">448</a> {<a name=L449 href="source/kernel/chr_drv/serial.c?v=0.97#L449">449</a>         int i;<a name=L450 href="source/kernel/chr_drv/serial.c?v=0.97#L450">450</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=L451 href="source/kernel/chr_drv/serial.c?v=0.97#L451">451</a> <a name=L452 href="source/kernel/chr_drv/serial.c?v=0.97#L452">452</a> <b><i>/* SERx_TIMER timers are used for receiving: timeout is always 0 (immediate) */</i></b><a name=L453 href="source/kernel/chr_drv/serial.c?v=0.97#L453">453</a>         <a href="ident?v=0.97;i=timer_table">timer_table</a>[<a href="ident?v=0.97;i=SER1_TIMER">SER1_TIMER</a>].fn = <a href="ident?v=0.97;i=com1_timer">com1_timer</a>;<a name=L454 href="source/kernel/chr_drv/serial.c?v=0.97#L454">454</a>         <a href="ident?v=0.97;i=timer_table">timer_table</a>[<a href="ident?v=0.97;i=SER1_TIMER">SER1_TIMER</a>].expires = 0;<a name=L455 href="source/kernel/chr_drv/serial.c?v=0.97#L455">455</a>         <a href="ident?v=0.97;i=timer_table">timer_table</a>[<a href="ident?v=0.97;i=SER2_TIMER">SER2_TIMER</a>].fn = <a href="ident?v=0.97;i=com2_timer">com2_timer</a>;<a name=L456 href="source/kernel/chr_drv/serial.c?v=0.97#L456">456</a>         <a href="ident?v=0.97;i=timer_table">timer_table</a>[<a href="ident?v=0.97;i=SER2_TIMER">SER2_TIMER</a>].expires = 0;<a name=L457 href="source/kernel/chr_drv/serial.c?v=0.97#L457">457</a>         <a href="ident?v=0.97;i=timer_table">timer_table</a>[<a href="ident?v=0.97;i=SER3_TIMER">SER3_TIMER</a>].fn = <a href="ident?v=0.97;i=com3_timer">com3_timer</a>;<a name=L458 href="source/kernel/chr_drv/serial.c?v=0.97#L458">458</a>         <a href="ident?v=0.97;i=timer_table">timer_table</a>[<a href="ident?v=0.97;i=SER3_TIMER">SER3_TIMER</a>].expires = 0;<a name=L459 href="source/kernel/chr_drv/serial.c?v=0.97#L459">459</a>         <a href="ident?v=0.97;i=timer_table">timer_table</a>[<a href="ident?v=0.97;i=SER4_TIMER">SER4_TIMER</a>].fn = <a href="ident?v=0.97;i=com4_timer">com4_timer</a>;<a name=L460 href="source/kernel/chr_drv/serial.c?v=0.97#L460">460</a>         <a href="ident?v=0.97;i=timer_table">timer_table</a>[<a href="ident?v=0.97;i=SER4_TIMER">SER4_TIMER</a>].expires = 0;<a name=L461 href="source/kernel/chr_drv/serial.c?v=0.97#L461">461</a> <b><i>/* SERx_TIMEOUT timers are used for writing: prevent serial lockups */</i></b><a name=L462 href="source/kernel/chr_drv/serial.c?v=0.97#L462">462</a>         <a href="ident?v=0.97;i=timer_table">timer_table</a>[<a href="ident?v=0.97;i=SER1_TIMEOUT">SER1_TIMEOUT</a>].fn = <a href="ident?v=0.97;i=com1_timeout">com1_timeout</a>;<a name=L463 href="source/kernel/chr_drv/serial.c?v=0.97#L463">463</a>         <a href="ident?v=0.97;i=timer_table">timer_table</a>[<a href="ident?v=0.97;i=SER1_TIMEOUT">SER1_TIMEOUT</a>].expires = 0;<a name=L464 href="source/kernel/chr_drv/serial.c?v=0.97#L464">464</a>         <a href="ident?v=0.97;i=timer_table">timer_table</a>[<a href="ident?v=0.97;i=SER2_TIMEOUT">SER2_TIMEOUT</a>].fn = <a href="ident?v=0.97;i=com2_timeout">com2_timeout</a>;<a name=L465 href="source/kernel/chr_drv/serial.c?v=0.97#L465">465</a>         <a href="ident?v=0.97;i=timer_table">timer_table</a>[<a href="ident?v=0.97;i=SER2_TIMEOUT">SER2_TIMEOUT</a>].expires = 0;<a name=L466 href="source/kernel/chr_drv/serial.c?v=0.97#L466">466</a>         <a href="ident?v=0.97;i=timer_table">timer_table</a>[<a href="ident?v=0.97;i=SER3_TIMEOUT">SER3_TIMEOUT</a>].fn = <a href="ident?v=0.97;i=com3_timeout">com3_timeout</a>;<a name=L467 href="source/kernel/chr_drv/serial.c?v=0.97#L467">467</a>         <a href="ident?v=0.97;i=timer_table">timer_table</a>[<a href="ident?v=0.97;i=SER3_TIMEOUT">SER3_TIMEOUT</a>].expires = 0;<a name=L468 href="source/kernel/chr_drv/serial.c?v=0.97#L468">468</a>         <a href="ident?v=0.97;i=timer_table">timer_table</a>[<a href="ident?v=0.97;i=SER4_TIMEOUT">SER4_TIMEOUT</a>].fn = <a href="ident?v=0.97;i=com4_timeout">com4_timeout</a>;<a name=L469 href="source/kernel/chr_drv/serial.c?v=0.97#L469">469</a>         <a href="ident?v=0.97;i=timer_table">timer_table</a>[<a href="ident?v=0.97;i=SER4_TIMEOUT">SER4_TIMEOUT</a>].expires = 0;<a name=L470 href="source/kernel/chr_drv/serial.c?v=0.97#L470">470</a>         for (i = 0, <a href="ident?v=0.97;i=info">info</a> = <a href="ident?v=0.97;i=serial_table">serial_table</a>; i &lt; <a href="ident?v=0.97;i=NR_SERIALS">NR_SERIALS</a>; i++,<a href="ident?v=0.97;i=info">info</a>++) {<a name=L471 href="source/kernel/chr_drv/serial.c?v=0.97#L471">471</a>                 <a href="ident?v=0.97;i=info">info</a>-&gt;tty = (<a href="ident?v=0.97;i=tty_table">tty_table</a>+64) + i;<a name=L472 href="source/kernel/chr_drv/serial.c?v=0.97#L472">472</a>                 <a href="ident?v=0.97;i=init">init</a>(<a href="ident?v=0.97;i=info">info</a>);<a name=L473 href="source/kernel/chr_drv/serial.c?v=0.97#L473">473</a>                 if (<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=L474 href="source/kernel/chr_drv/serial.c?v=0.97#L474">474</a>                         continue;<a name=L475 href="source/kernel/chr_drv/serial.c?v=0.97#L475">475</a>                 <a href="ident?v=0.97;i=printk">printk</a>(<i>"serial port at 0x%04x (irq = %d)"</i>,<a href="ident?v=0.97;i=info">info</a>-&gt;port,<a href="ident?v=0.97;i=info">info</a>-&gt;irq);<a name=L476 href="source/kernel/chr_drv/serial.c?v=0.97#L476">476</a>                 switch (<a href="ident?v=0.97;i=info">info</a>-&gt;type) {<a name=L477 href="source/kernel/chr_drv/serial.c?v=0.97#L477">477</a>                         case <a href="ident?v=0.97;i=PORT_8250">PORT_8250</a>:<a name=L478 href="source/kernel/chr_drv/serial.c?v=0.97#L478">478</a>                                 <a href="ident?v=0.97;i=printk">printk</a>(<i>" is a 8250\n"</i>);<a name=L479 href="source/kernel/chr_drv/serial.c?v=0.97#L479">479</a>                                 break;<a name=L480 href="source/kernel/chr_drv/serial.c?v=0.97#L480">480</a>                         case <a href="ident?v=0.97;i=PORT_16450">PORT_16450</a>:<a name=L481 href="source/kernel/chr_drv/serial.c?v=0.97#L481">481</a>                                 <a href="ident?v=0.97;i=printk">printk</a>(<i>" is a 16450\n"</i>);<a name=L482 href="source/kernel/chr_drv/serial.c?v=0.97#L482">482</a>                                 break;<a name=L483 href="source/kernel/chr_drv/serial.c?v=0.97#L483">483</a>                         case <a href="ident?v=0.97;i=PORT_16550">PORT_16550</a>:<a name=L484 href="source/kernel/chr_drv/serial.c?v=0.97#L484">484</a>                                 <a href="ident?v=0.97;i=printk">printk</a>(<i>" is a 16550\n"</i>);<a name=L485 href="source/kernel/chr_drv/serial.c?v=0.97#L485">485</a>                                 break;<a name=L486 href="source/kernel/chr_drv/serial.c?v=0.97#L486">486</a>                         case <a href="ident?v=0.97;i=PORT_16550A">PORT_16550A</a>:<a name=L487 href="source/kernel/chr_drv/serial.c?v=0.97#L487">487</a>                                 <a href="ident?v=0.97;i=printk">printk</a>(<i>" is a 16550A\n"</i>);<a name=L488 href="source/kernel/chr_drv/serial.c?v=0.97#L488">488</a>                                 break;<

⌨️ 快捷键说明

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