66.html
来自「linux 0.11中文版 有注释」· HTML 代码 · 共 337 行 · 第 1/3 页
HTML
337 行
<a name='L89'>
<a name='L90'><i><font color='green'>//// 设置终端termios 结构信息。</font></i>
<a name='L91'><i><font color='green'>// 参数:tty - 指定终端的tty 结构指针;termios - 用户数据区termios 结构指针。</font></i>
<a name='L92'><i><font color='green'>// 返回0 。</font></i>
<a name='L93'><b>static</b> <b>int</b>
<a name='L94'><a href='../S/66.html#L204' title='Refered from 204 in kernel/chr_drv/tty_ioctl.c.'>set_termios</a> (<b>struct</b> tty_struct *tty, <b>struct</b> termios *termios)
<a name='L95'><font color='red'>{</font>
<a name='L96'> <b>int</b> <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>;
<a name='L97'>
<a name='L98'><i><font color='green'>// 首先复制用户数据区中termios 结构信息到指定tty 结构中。</font></i>
<a name='L99'> <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> < (<b>sizeof</b> (*termios)); <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>++)
<a name='L100'> ((<b>char</b> *) &<a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a>->termios)[<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>] = <a href='../D/821.html' title='Multiple defined in 2 places.'>get_fs_byte</a> (<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> + (<b>char</b> *) termios);
<a name='L101'><i><font color='green'>// 用户有可能已修改了tty 的串行口传输波特率,所以根据termios 结构中的控制模式标志c_cflag</font></i>
<a name='L102'><i><font color='green'>// 修改串行芯片UART 的传输波特率。</font></i>
<a name='L103'> <a href='../S/66.html#L31' title='Defined at 31 in kernel/chr_drv/tty_ioctl.c.'>change_speed</a> (<a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a>);
<a name='L104'> <b>return</b> 0;
<a name='L105'><font color='red'>}</font>
<a name='L106'>
<a name='L107'><i><font color='green'>//// 读取termio 结构中的信息。</font></i>
<a name='L108'><i><font color='green'>// 参数:tty - 指定终端的tty 结构指针;termio - 用户数据区termio 结构缓冲区指针。</font></i>
<a name='L109'><i><font color='green'>// 返回0。</font></i>
<a name='L110'><b>static</b> <b>int</b>
<a name='L111'><a href='../S/66.html#L207' title='Refered from 207 in kernel/chr_drv/tty_ioctl.c.'>get_termio</a> (<b>struct</b> tty_struct *tty, <b>struct</b> termio *termio)
<a name='L112'><font color='red'>{</font>
<a name='L113'> <b>int</b> <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>;
<a name='L114'> <b>struct</b> termio tmp_termio;
<a name='L115'>
<a name='L116'><i><font color='green'>// 首先验证一下用户的缓冲区指针所指内存区是否足够,如不够则分配内存。</font></i>
<a name='L117'> <a href='../S/68.html#L34' title='Defined at 34 in kernel/fork.c.'>verify_area</a> (termio, <b>sizeof</b> (*termio));
<a name='L118'><i><font color='green'>// 将termios 结构的信息复制到termio 结构中。目的是为了其中模式标志集的类型进行转换,也即</font></i>
<a name='L119'><i><font color='green'>// 从termios 的长整数类型转换为termio 的短整数类型。</font></i>
<a name='L120'> tmp_termio.c_iflag = <a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a>->termios.c_iflag;
<a name='L121'> tmp_termio.c_oflag = <a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a>->termios.c_oflag;
<a name='L122'> tmp_termio.c_cflag = <a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a>->termios.c_cflag;
<a name='L123'> tmp_termio.c_lflag = <a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a>->termios.c_lflag;
<a name='L124'><i><font color='green'>// 两种结构的c_line 和c_cc[]字段是完全相同的。</font></i>
<a name='L125'> tmp_termio.c_line = <a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a>->termios.c_line;
<a name='L126'> <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> < <a href='../S/48.html#L88' title='Defined at 88 in include/termios.h.'>NCC</a>; <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>++)
<a name='L127'> tmp_termio.c_cc[<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>] = <a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a>->termios.c_cc[<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>];
<a name='L128'><i><font color='green'>// 最后复制指定tty 结构中的termio 结构信息到用户 termio 结构缓冲区。</font></i>
<a name='L129'> <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> < (<b>sizeof</b> (*termio)); <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>++)
<a name='L130'> <a href='../S/24.html#L44' title='Defined at 44 in include/asm/segment.h.'>put_fs_byte</a> (((<b>char</b> *) &tmp_termio)[<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> *) termio);
<a name='L131'> <b>return</b> 0;
<a name='L132'><font color='red'>}</font>
<a name='L133'>
<a name='L134'><i><font color='green'>/*</font></i>
<a name='L135'><i><font color='green'>* This only works as the 386 is low-byt-first</font></i>
<a name='L136'><i><font color='green'>*/</font></i>
<a name='L137'><i><font color='green'>/*</font></i>
<a name='L138'><i><font color='green'>* 下面的termio 设置函数仅在386 低字节在前的方式下可用。</font></i>
<a name='L139'><i><font color='green'>*/</font></i>
<a name='L140'><i><font color='green'>//// 设置终端termio 结构信息。</font></i>
<a name='L141'><i><font color='green'>// 参数:tty - 指定终端的tty 结构指针;termio - 用户数据区termio 结构指针。</font></i>
<a name='L142'><i><font color='green'>// 将用户缓冲区termio 的信息复制到终端的termios 结构中。返回0 。</font></i>
<a name='L143'><b>static</b> <b>int</b>
<a name='L144'><a href='../S/66.html#L218' title='Refered from 218 in kernel/chr_drv/tty_ioctl.c.'>set_termio</a> (<b>struct</b> tty_struct *tty, <b>struct</b> termio *termio)
<a name='L145'><font color='red'>{</font>
<a name='L146'> <b>int</b> <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>;
<a name='L147'> <b>struct</b> termio tmp_termio;
<a name='L148'>
<a name='L149'><i><font color='green'>// 首先复制用户数据区中termio 结构信息到临时termio 结构中。</font></i>
<a name='L150'> <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> < (<b>sizeof</b> (*termio)); <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>++)
<a name='L151'> ((<b>char</b> *) &tmp_termio)[<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>] = <a href='../D/821.html' title='Multiple defined in 2 places.'>get_fs_byte</a> (<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> + (<b>char</b> *) termio);
<a name='L152'><i><font color='green'>// 再将termio 结构的信息复制到tty 的termios 结构中。目的是为了其中模式标志集的类型进行转换,</font></i>
<a name='L153'><i><font color='green'>// 也即从termio 的短整数类型转换成termios 的长整数类型。</font></i>
<a name='L154'> *(<b>unsigned</b> <b>short</b> *) &<a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a>->termios.c_iflag = tmp_termio.c_iflag;
<a name='L155'> *(<b>unsigned</b> <b>short</b> *) &<a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a>->termios.c_oflag = tmp_termio.c_oflag;
<a name='L156'> *(<b>unsigned</b> <b>short</b> *) &<a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a>->termios.c_cflag = tmp_termio.c_cflag;
<a name='L157'> *(<b>unsigned</b> <b>short</b> *) &<a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a>->termios.c_lflag = tmp_termio.c_lflag;
<a name='L158'><i><font color='green'>// 两种结构的c_line 和c_cc[]字段是完全相同的。</font></i>
<a name='L159'> <a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a>->termios.c_line = tmp_termio.c_line;
<a name='L160'> <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> < <a href='../S/48.html#L88' title='Defined at 88 in include/termios.h.'>NCC</a>; <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>++)
<a name='L161'> <a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a>->termios.c_cc[<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>] = tmp_termio.c_cc[<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>];
<a name='L162'><i><font color='green'>// 用户可能已修改了tty 的串行口传输波特率,所以根据termios 结构中的控制模式标志集c_cflag</font></i>
<a name='L163'><i><font color='green'>// 修改串行芯片UART 的传输波特率。</font></i>
<a name='L164'> <a href='../S/66.html#L31' title='Defined at 31 in kernel/chr_drv/tty_ioctl.c.'>change_speed</a> (<a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a>);
<a name='L165'> <b>return</b> 0;
<a name='L166'><font color='red'>}</font>
<a name='L167'>
<a name='L168'><i><font color='green'>//// tty 终端设备的ioctl 函数。</font></i>
<a name='L169'><i><font color='green'>// 参数:dev - 设备号;cmd - ioctl 命令;arg - 操作参数指针。</font></i>
<a name='L170'><b>int</b>
<a name='L171'><a href='../R/713.html' title='Multiple refered from 3 places.'>tty_ioctl</a> (<b>int</b> dev, <b>int</b> cmd, <b>int</b> arg)
<a name='L172'><font color='red'>{</font>
<a name='L173'> <b>struct</b> tty_struct *<a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a>;
<a name='L174'><i><font color='green'>// 首先取tty 的子设备号。如果主设备号是5(tty 终端),则进程的tty 字段即是子设备号;如果进程</font></i>
<a name='L175'><i><font color='green'>// 的tty 子设备号是负数,表明该进程没有控制终端,也即不能发出该ioctl 调用,出错死机。</font></i>
<a name='L176'> <b>if</b> (<a href='../S/31.html#L49' title='Defined at 49 in include/linux/fs.h.'>MAJOR</a> (<a href='../S/7.html#L136' title='Defined at 136 in fs/char_dev.c.'>dev</a>) == 5)
<a name='L177'> <font color='red'>{</font>
<a name='L178'> <a href='../S/7.html#L136' title='Defined at 136 in fs/char_dev.c.'>dev</a> = current-><a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a>;
<a name='L179'> <b>if</b> (<a href='../S/7.html#L136' title='Defined at 136 in fs/char_dev.c.'>dev</a> < 0)
<a name='L180'> <a href='../S/72.html#L24' title='Defined at 24 in kernel/panic.c.'>panic</a> ("tty_ioctl: dev<0");
<a name='L181'><i><font color='green'>// 否则直接从设备号中取出子设备号。</font></i>
<a name='L182'> <font color='red'>}</font>
<a name='L183'> <b>else</b>
<a name='L184'> <a href='../S/7.html#L136' title='Defined at 136 in fs/char_dev.c.'>dev</a> = <a href='../D/238.html' title='Multiple defined in 2 places.'>MINOR</a> (<a href='../S/7.html#L136' title='Defined at 136 in fs/char_dev.c.'>dev</a>);
<a name='L185'><i><font color='green'>// 子设备号可以是0(控制台终端)、1(串口1 终端)、2(串口2 终端)。</font></i>
<a name='L186'><i><font color='green'>// 让tty 指向对应子设备号的tty 结构。</font></i>
<a name='L187'> <a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a> = <a href='../S/7.html#L136' title='Defined at 136 in fs/char_dev.c.'>dev</a> + tty_table;
<a name='L188'><i><font color='green'>// 根据tty 的ioctl 命令进行分别处理。</font></i>
<a name='L189'> <b>switch</b> (cmd)
<a name='L190'> <font color='red'>{</font>
<a name='L191'> <b>case</b> <a href='../S/48.html#L12' title='Defined at 12 in include/termios.h.'>TCGETS</a>:
<a name='L192'><i><font color='green'>//取相应终端termios 结构中的信息。</font></i>
<a name='L193'> <b>return</b> <a href='../S/66.html#L78' title='Defined at 78 in kernel/chr_drv/tty_ioctl.c.'>get_termios</a> (<a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a>, (<b>struct</b> termios *) arg);
<a name='L194'> <b>case</b> <a href='../S/48.html#L20' title='Defined at 20 in include/termios.h.'>TCSETSF</a>:
<a name='L195'><i><font color='green'>// 在设置termios 的信息之前,需要先等待输出队列中所有数据处理完,并且刷新(清空)输入队列。</font></i>
<a name='L196'><i><font color='green'>// 再设置。</font></i>
<a name='L197'> <a href='../S/66.html#L53' title='Defined at 53 in kernel/chr_drv/tty_ioctl.c.'>flush</a> (&<a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a>->read_q); <i><font color='green'>/* fallthrough */</font></i>
<a name='L198'> <b>case</b> <a href='../S/48.html#L17' title='Defined at 17 in include/termios.h.'>TCSETSW</a>:
<a name='L199'><i><font color='green'>// 在设置终端termios 的信息之前,需要先等待输出队列中所有数据处理完(耗尽)。对于修改参数</font></i>
<a name='L200'><i><font color='green'>// 会影响输出的情况,就需要使用这种形式。</font></i>
<a name='L201'> <a href='../S/66.html#L62' title='Defined at 62 in kernel/chr_drv/tty_ioctl.c.'>wait_until_sent</a> (<a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a>); <i><font color='green'>/* fallthrough */</font></i>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?