66.html

来自「linux 0.11中文版 有注释」· HTML 代码 · 共 337 行 · 第 1/3 页

HTML
337
字号
<html>
<head>
<title>kernel/chr_drv/tty_ioctl.c</title>
<meta name='robots' content='noindex,nofollow'>
<meta name='generator' content='GLOBAL-5.4.1'>
</head>
<body text='#191970' bgcolor='#f5f5dc' vlink='gray'>
<a name='TOP'><h2><a href='../mains.html'>root</a>/<a href='../files/104.html'>kernel</a>/<a href='../files/106.html'>chr_drv</a>/tty_ioctl.c</h2>
<i><font color='green'>/* [&lt;][&gt;]<a href='#L31'>[^]</a><a href='#L171'>[v]</a>[top]<a href='#BOTTOM'>[bottom]</a><a href='../mains.html'>[index]</a><a href='../help.html'>[help]</a> */</font></i>
<hr>
<h2>DEFINITIONS</h2>
This source file includes following definitions.
<ol>
<li><a href='#L31' title='Defined at 31.'>change_speed</a>
<li><a href='#L53' title='Defined at 53.'>flush</a>
<li><a href='#L62' title='Defined at 62.'>wait_until_sent</a>
<li><a href='#L69' title='Defined at 69.'>send_break</a>
<li><a href='#L78' title='Defined at 78.'>get_termios</a>
<li><a href='#L94' title='Defined at 94.'>set_termios</a>
<li><a href='#L111' title='Defined at 111.'>get_termio</a>
<li><a href='#L144' title='Defined at 144.'>set_termio</a>
<li><a href='#L171' title='Defined at 171.'>tty_ioctl</a>
</ol>
<hr>
<pre>
<a name='L1'><i><font color='green'>/*</font></i>
<a name='L2'><i><font color='green'>* linux/kernel/chr_drv/tty_ioctl.c</font></i>
<a name='L3'><i><font color='green'>*</font></i>
<a name='L4'><i><font color='green'>* (C) 1991 Linus Torvalds</font></i>
<a name='L5'><i><font color='green'>*/</font></i>
<a name='L6'>
<a name='L7'><font color='darkred'>#include</font> &lt;<a href='28.html'>errno.h</a>&gt;              <i><font color='green'>// 错误号头文件。包含系统中各种出错号。(Linus 从minix 中引进的)。</font></i>
<a name='L8'><font color='darkred'>#include</font> &lt;<a href='48.html'>termios.h</a>&gt;            <i><font color='green'>// 终端输入输出函数头文件。主要定义控制异步通信口的终端接口。</font></i>
<a name='L9'>
<a name='L10'><font color='darkred'>#include</font> &lt;<a href='36.html'>linux/sched.h</a>&gt;        <i><font color='green'>// 调度程序头文件,定义了任务结构task_struct、初始任务0 的数据,</font></i>
<a name='L11'><i><font color='green'>// 还有一些有关描述符参数设置和获取的嵌入式汇编函数宏语句。</font></i>
<a name='L12'><font color='darkred'>#include</font> &lt;<a href='34.html'>linux/kernel.h</a>&gt;       <i><font color='green'>// 内核头文件。含有一些内核常用函数的原形定义。</font></i>
<a name='L13'><font color='darkred'>#include</font> &lt;<a href='38.html'>linux/tty.h</a>&gt;          <i><font color='green'>// tty 头文件,定义了有关tty_io,串行通信方面的参数、常数。</font></i>
<a name='L14'>
<a name='L15'><font color='darkred'>#include</font> &lt;<a href='22.html'>asm/io.h</a>&gt;             <i><font color='green'>// io 头文件。定义硬件端口输入/输出宏汇编语句。</font></i>
<a name='L16'><font color='darkred'>#include</font> &lt;<a href='24.html'>asm/segment.h</a>&gt;        <i><font color='green'>// 段操作头文件。定义了有关段寄存器操作的嵌入式汇编函数。</font></i>
<a name='L17'><font color='darkred'>#include</font> &lt;<a href='25.html'>asm/system.h</a>&gt;         <i><font color='green'>// 系统头文件。定义了设置或修改描述符/中断门等的嵌入式汇编宏。</font></i>
<a name='L18'>
<a name='L19'><i><font color='green'>// 这是波特率因子数组(或称为除数数组)。波特率与波特率因子的对应关系参见列表后的说明。</font></i>
<a name='L20'><b>static</b> <b>unsigned</b> <b>short</b> quotient[] = <font color='red'>{</font>
<a name='L21'>  0, 2304, 1536, 1047, 857,
<a name='L22'>  768, 576, 384, 192, 96,
<a name='L23'>  64, 48, 24, 12, 6, 3
<a name='L24'><font color='red'>}</font>;
<a name='L25'>
<a name='L26'><i><font color='green'>//// 修改传输速率。</font></i>
<a name='L27'><i><font color='green'>// 参数:tty - 终端对应的tty 数据结构。</font></i>
<a name='L28'><i><font color='green'>// 在除数锁存标志DLAB(线路控制寄存器位7)置位情况下,通过端口0x3f8 和0x3f9 向UART 分别写入</font></i>
<a name='L29'><i><font color='green'>// 波特率因子低字节和高字节。</font></i>
<a name='L30'><b>static</b> <b>void</b>
<a name='L31'><a href='../R/397.html' title='Multiple refered from 2 places.'>change_speed</a> (<b>struct</b> tty_struct *tty)
<a name='L32'><font color='red'>{</font>
<a name='L33'>  <b>unsigned</b> <b>short</b> port, quot;
<a name='L34'>
<a name='L35'><i><font color='green'>// 对于串口终端,其tty 结构的读缓冲队列data 字段存放的是串行端口号(0x3f8 或0x2f8)。</font></i>
<a name='L36'>  <b>if</b> (!(port = <a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a>-&gt;read_q.data))
<a name='L37'>    <b>return</b>;
<a name='L38'><i><font color='green'>// 从tty 的termios 结构控制模式标志集中取得设置的波特率索引号,据此从波特率因子数组中取得</font></i>
<a name='L39'><i><font color='green'>// 对应的波特率因子值。CBAUD 是控制模式标志集中波特率位屏蔽码。</font></i>
<a name='L40'>  quot = quotient[<a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a>-&gt;termios.c_cflag &amp; <a href='../S/48.html#L184' title='Defined at 184 in include/termios.h.'>CBAUD</a>];
<a name='L41'>  <a href='../S/25.html#L15' title='Defined at 15 in include/asm/system.h.'>cli</a> ();                       <i><font color='green'>// 关中断。</font></i>
<a name='L42'>  <a href='../S/22.html#L17' title='Defined at 17 in include/asm/io.h.'>outb_p</a> (0x80, port + 3);      <i><font color='green'>/* set DLAB */</font></i><i><font color='green'>// 首先设置除数锁定标志DLAB。</font></i>
<a name='L43'>  <a href='../S/22.html#L17' title='Defined at 17 in include/asm/io.h.'>outb_p</a> (quot &amp; 0xff, port);   <i><font color='green'>/* LS of divisor */</font></i><i><font color='green'>// 输出因子低字节。</font></i>
<a name='L44'>  <a href='../S/22.html#L17' title='Defined at 17 in include/asm/io.h.'>outb_p</a> (quot &gt;&gt; 8, port + 1); <i><font color='green'>/* MS of divisor */</font></i><i><font color='green'>// 输出因子高字节。</font></i>
<a name='L45'>  <a href='../S/22.html#L3' title='Defined at 3 in include/asm/io.h.'>outb</a> (0x03, port + 3);        <i><font color='green'>/* reset DLAB */</font></i><i><font color='green'>// 复位DLAB。</font></i>
<a name='L46'>  <a href='../S/25.html#L14' title='Defined at 14 in include/asm/system.h.'>sti</a> ();                       <i><font color='green'>// 开中断。</font></i>
<a name='L47'><font color='red'>}</font>
<a name='L48'>
<a name='L49'><i><font color='green'>//// 刷新tty 缓冲队列。</font></i>
<a name='L50'><i><font color='green'>// 参数:gueue - 指定的缓冲队列指针。</font></i>
<a name='L51'><i><font color='green'>// 令缓冲队列的头指针等于尾指针,从而达到清空缓冲区(零字符)的目的。</font></i>
<a name='L52'><b>static</b> <b>void</b>
<a name='L53'><a href='../R/462.html' title='Multiple refered from 6 places.'>flush</a> (<b>struct</b> tty_queue *queue)
<a name='L54'><font color='red'>{</font>
<a name='L55'>  <a href='../S/25.html#L15' title='Defined at 15 in include/asm/system.h.'>cli</a> ();
<a name='L56'>  queue-&gt;head = queue-&gt;tail;
<a name='L57'>  <a href='../S/25.html#L14' title='Defined at 14 in include/asm/system.h.'>sti</a> ();
<a name='L58'><font color='red'>}</font>
<a name='L59'>
<a name='L60'><i><font color='green'>//// 等待字符发送出去。</font></i>
<a name='L61'><b>static</b> <b>void</b>
<a name='L62'><a href='../R/732.html' title='Multiple refered from 3 places.'>wait_until_sent</a> (<b>struct</b> tty_struct *tty)
<a name='L63'><font color='red'>{</font>
<a name='L64'><i><font color='green'>/* do nothing - not implemented */</font></i><i><font color='green'>/* 什么都没做 - 还未实现 */</font></i>
<a name='L65'><font color='red'>}</font>
<a name='L66'>
<a name='L67'><i><font color='green'>//// 发送BREAK 控制符。</font></i>
<a name='L68'><b>static</b> <b>void</b>
<a name='L69'><a href='../S/66.html#L224' title='Refered from 224 in kernel/chr_drv/tty_ioctl.c.'>send_break</a> (<b>struct</b> tty_struct *tty)
<a name='L70'><font color='red'>{</font>
<a name='L71'><i><font color='green'>/* do nothing - not implemented */</font></i><i><font color='green'>/* 什么都没做 - 还未实现 */</font></i>
<a name='L72'><font color='red'>}</font>
<a name='L73'>
<a name='L74'><i><font color='green'>//// 取终端termios 结构信息。</font></i>
<a name='L75'><i><font color='green'>// 参数:tty - 指定终端的tty 结构指针;termios - 用户数据区termios 结构缓冲区指针。</font></i>
<a name='L76'><i><font color='green'>// 返回0 。</font></i>
<a name='L77'><b>static</b> <b>int</b>
<a name='L78'><a href='../S/66.html#L193' title='Refered from 193 in kernel/chr_drv/tty_ioctl.c.'>get_termios</a> (<b>struct</b> tty_struct *tty, <b>struct</b> termios *termios)
<a name='L79'><font color='red'>{</font>
<a name='L80'>  <b>int</b> <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>;
<a name='L81'>
<a name='L82'><i><font color='green'>// 首先验证一下用户的缓冲区指针所指内存区是否足够,如不够则分配内存。</font></i>
<a name='L83'>  <a href='../S/68.html#L34' title='Defined at 34 in kernel/fork.c.'>verify_area</a> (termios, <b>sizeof</b> (*termios));
<a name='L84'><i><font color='green'>// 复制指定tty 结构中的termios 结构信息到用户 termios 结构缓冲区。</font></i>
<a name='L85'>  <b>for</b> (<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> = 0; <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> &lt; (<b>sizeof</b> (*termios)); <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>++)
<a name='L86'>    <a href='../S/24.html#L44' title='Defined at 44 in include/asm/segment.h.'>put_fs_byte</a> (((<b>char</b> *) &amp;<a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a>-&gt;termios)[<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>], <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> + (<b>char</b> *) termios);
<a name='L87'>  <b>return</b> 0;
<a name='L88'><font color='red'>}</font>

⌨️ 快捷键说明

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