📄 serial.c
字号:
<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 >= <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 >= <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>(&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>->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>->irq;<a name=L422 href="source/kernel/chr_drv/serial.c?v=0.97#L422">422</a> if (new_irq > 15 || new_port > 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>->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>->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>->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>->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>->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 < <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>->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>->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>->port,<a href="ident?v=0.97;i=info">info</a>->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>->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 + -