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

📄 tty_io.c

📁 linux字符驱动源码
💻 C
📖 第 1 页 / 共 5 页
字号:
 <a name=L69 href="source/kernel/chr_drv/tty_io.c?v=0.97#L69">69</a> } <a name=L70 href="source/kernel/chr_drv/tty_io.c?v=0.97#L70">70</a>  <a name=L71 href="source/kernel/chr_drv/tty_io.c?v=0.97#L71">71</a> int inline <a href="ident?v=0.97;i=get_tty_queue">get_tty_queue</a>(struct <a href="ident?v=0.97;i=tty_queue">tty_queue</a> * queue) <a name=L72 href="source/kernel/chr_drv/tty_io.c?v=0.97#L72">72</a> { <a name=L73 href="source/kernel/chr_drv/tty_io.c?v=0.97#L73">73</a>         int <a href="ident?v=0.97;i=result">result</a> = -1; <a name=L74 href="source/kernel/chr_drv/tty_io.c?v=0.97#L74">74</a>         unsigned long flags; <a name=L75 href="source/kernel/chr_drv/tty_io.c?v=0.97#L75">75</a>  <a name=L76 href="source/kernel/chr_drv/tty_io.c?v=0.97#L76">76</a>         __asm__ __volatile__(<i>"pushfl ; popl %0 ; cli"</i>:<i>"=r"</i> (flags)); <a name=L77 href="source/kernel/chr_drv/tty_io.c?v=0.97#L77">77</a>         if (queue-&gt;tail != queue-&gt;<a href="ident?v=0.97;i=head">head</a>) { <a name=L78 href="source/kernel/chr_drv/tty_io.c?v=0.97#L78">78</a>                 <a href="ident?v=0.97;i=result">result</a> = 0xff &amp; queue-&gt;<a href="ident?v=0.97;i=buf">buf</a>[queue-&gt;tail]; <a name=L79 href="source/kernel/chr_drv/tty_io.c?v=0.97#L79">79</a>                 queue-&gt;tail = (queue-&gt;tail + 1) &amp; (<a href="ident?v=0.97;i=TTY_BUF_SIZE">TTY_BUF_SIZE</a>-1); <a name=L80 href="source/kernel/chr_drv/tty_io.c?v=0.97#L80">80</a>         } <a name=L81 href="source/kernel/chr_drv/tty_io.c?v=0.97#L81">81</a>         __asm__ __volatile__(<i>"pushl %0 ; popfl"</i>::<i>"r"</i> (flags)); <a name=L82 href="source/kernel/chr_drv/tty_io.c?v=0.97#L82">82</a>         return <a href="ident?v=0.97;i=result">result</a>; <a name=L83 href="source/kernel/chr_drv/tty_io.c?v=0.97#L83">83</a> } <a name=L84 href="source/kernel/chr_drv/tty_io.c?v=0.97#L84">84</a>  <a name=L85 href="source/kernel/chr_drv/tty_io.c?v=0.97#L85">85</a> void inline <a href="ident?v=0.97;i=tty_write_flush">tty_write_flush</a>(struct <a href="ident?v=0.97;i=tty_struct">tty_struct</a> * tty) <a name=L86 href="source/kernel/chr_drv/tty_io.c?v=0.97#L86">86</a> { <a name=L87 href="source/kernel/chr_drv/tty_io.c?v=0.97#L87">87</a>         if (<a href="ident?v=0.97;i=EMPTY">EMPTY</a>(tty-&gt;write_q)) <a name=L88 href="source/kernel/chr_drv/tty_io.c?v=0.97#L88">88</a>                 return; <a name=L89 href="source/kernel/chr_drv/tty_io.c?v=0.97#L89">89</a>         if (<a href="ident?v=0.97;i=set_bit">set_bit</a>(<a href="ident?v=0.97;i=TTY_WRITE_BUSY">TTY_WRITE_BUSY</a>,&amp;tty-&gt;flags)) <a name=L90 href="source/kernel/chr_drv/tty_io.c?v=0.97#L90">90</a>                 return; <a name=L91 href="source/kernel/chr_drv/tty_io.c?v=0.97#L91">91</a>         tty-&gt;write(tty); <a name=L92 href="source/kernel/chr_drv/tty_io.c?v=0.97#L92">92</a>         if (<a href="ident?v=0.97;i=clear_bit">clear_bit</a>(<a href="ident?v=0.97;i=TTY_WRITE_BUSY">TTY_WRITE_BUSY</a>,&amp;tty-&gt;flags)) <a name=L93 href="source/kernel/chr_drv/tty_io.c?v=0.97#L93">93</a>                 <a href="ident?v=0.97;i=printk">printk</a>(<i>"tty_write_flush: bit already cleared\n"</i>); <a name=L94 href="source/kernel/chr_drv/tty_io.c?v=0.97#L94">94</a> } <a name=L95 href="source/kernel/chr_drv/tty_io.c?v=0.97#L95">95</a>  <a name=L96 href="source/kernel/chr_drv/tty_io.c?v=0.97#L96">96</a> void <a href="ident?v=0.97;i=tty_read_flush">tty_read_flush</a>(struct <a href="ident?v=0.97;i=tty_struct">tty_struct</a> * tty) <a name=L97 href="source/kernel/chr_drv/tty_io.c?v=0.97#L97">97</a> { <a name=L98 href="source/kernel/chr_drv/tty_io.c?v=0.97#L98">98</a>         if (<a href="ident?v=0.97;i=EMPTY">EMPTY</a>(tty-&gt;read_q)) <a name=L99 href="source/kernel/chr_drv/tty_io.c?v=0.97#L99">99</a>                 return;<a name=L100 href="source/kernel/chr_drv/tty_io.c?v=0.97#L100">100</a>         if (<a href="ident?v=0.97;i=set_bit">set_bit</a>(<a href="ident?v=0.97;i=TTY_READ_BUSY">TTY_READ_BUSY</a>, &amp;tty-&gt;flags))<a name=L101 href="source/kernel/chr_drv/tty_io.c?v=0.97#L101">101</a>                 return;<a name=L102 href="source/kernel/chr_drv/tty_io.c?v=0.97#L102">102</a>         <a href="ident?v=0.97;i=copy_to_cooked">copy_to_cooked</a>(tty);<a name=L103 href="source/kernel/chr_drv/tty_io.c?v=0.97#L103">103</a>         if (<a href="ident?v=0.97;i=clear_bit">clear_bit</a>(<a href="ident?v=0.97;i=TTY_READ_BUSY">TTY_READ_BUSY</a>, &amp;tty-&gt;flags))<a name=L104 href="source/kernel/chr_drv/tty_io.c?v=0.97#L104">104</a>                 <a href="ident?v=0.97;i=printk">printk</a>(<i>"tty_read_flush: bit already cleared\n"</i>);<a name=L105 href="source/kernel/chr_drv/tty_io.c?v=0.97#L105">105</a> }<a name=L106 href="source/kernel/chr_drv/tty_io.c?v=0.97#L106">106</a> <a name=L107 href="source/kernel/chr_drv/tty_io.c?v=0.97#L107">107</a> void <a href="ident?v=0.97;i=change_console">change_console</a>(unsigned int new_console)<a name=L108 href="source/kernel/chr_drv/tty_io.c?v=0.97#L108">108</a> {<a name=L109 href="source/kernel/chr_drv/tty_io.c?v=0.97#L109">109</a>         if (<a href="ident?v=0.97;i=vt_cons">vt_cons</a>[<a href="ident?v=0.97;i=fg_console">fg_console</a>].<a href="ident?v=0.97;i=vt_mode">vt_mode</a> == <a href="ident?v=0.97;i=KD_GRAPHICS">KD_GRAPHICS</a>)<a name=L110 href="source/kernel/chr_drv/tty_io.c?v=0.97#L110">110</a>                 return;<a name=L111 href="source/kernel/chr_drv/tty_io.c?v=0.97#L111">111</a>         if (new_console == <a href="ident?v=0.97;i=fg_console">fg_console</a> || new_console &gt;= <a href="ident?v=0.97;i=NR_CONSOLES">NR_CONSOLES</a>)<a name=L112 href="source/kernel/chr_drv/tty_io.c?v=0.97#L112">112</a>                 return;<a name=L113 href="source/kernel/chr_drv/tty_io.c?v=0.97#L113">113</a>         <a href="ident?v=0.97;i=table_list">table_list</a>[0] = <a href="ident?v=0.97;i=con_queues">con_queues</a> + 0 + new_console*3;<a name=L114 href="source/kernel/chr_drv/tty_io.c?v=0.97#L114">114</a>         <a href="ident?v=0.97;i=table_list">table_list</a>[1] = <a href="ident?v=0.97;i=con_queues">con_queues</a> + 1 + new_console*3;<a name=L115 href="source/kernel/chr_drv/tty_io.c?v=0.97#L115">115</a>         <a href="ident?v=0.97;i=update_screen">update_screen</a>(new_console);<a name=L116 href="source/kernel/chr_drv/tty_io.c?v=0.97#L116">116</a> }<a name=L117 href="source/kernel/chr_drv/tty_io.c?v=0.97#L117">117</a> <a name=L118 href="source/kernel/chr_drv/tty_io.c?v=0.97#L118">118</a> static void <a href="ident?v=0.97;i=sleep_if_empty">sleep_if_empty</a>(struct <a href="ident?v=0.97;i=tty_queue">tty_queue</a> * queue)<a name=L119 href="source/kernel/chr_drv/tty_io.c?v=0.97#L119">119</a> {<a name=L120 href="source/kernel/chr_drv/tty_io.c?v=0.97#L120">120</a>         <a href="ident?v=0.97;i=cli">cli</a>();<a name=L121 href="source/kernel/chr_drv/tty_io.c?v=0.97#L121">121</a>         while (!(<a href="ident?v=0.97;i=current">current</a>-&gt;signal &amp; ~current-&gt;blocked) &amp;&amp; <a href="ident?v=0.97;i=EMPTY">EMPTY</a>(queue))<a name=L122 href="source/kernel/chr_drv/tty_io.c?v=0.97#L122">122</a>                 <a href="ident?v=0.97;i=interruptible_sleep_on">interruptible_sleep_on</a>(&amp;queue-&gt;proc_list);<a name=L123 href="source/kernel/chr_drv/tty_io.c?v=0.97#L123">123</a>         <a href="ident?v=0.97;i=sti">sti</a>();<a name=L124 href="source/kernel/chr_drv/tty_io.c?v=0.97#L124">124</a> }<a name=L125 href="source/kernel/chr_drv/tty_io.c?v=0.97#L125">125</a> <a name=L126 href="source/kernel/chr_drv/tty_io.c?v=0.97#L126">126</a> void <a href="ident?v=0.97;i=wait_for_keypress">wait_for_keypress</a>(void)<a name=L127 href="source/kernel/chr_drv/tty_io.c?v=0.97#L127">127</a> {<a name=L128 href="source/kernel/chr_drv/tty_io.c?v=0.97#L128">128</a>         <a href="ident?v=0.97;i=sleep_if_empty">sleep_if_empty</a>(<a href="ident?v=0.97;i=tty_table">tty_table</a>[<a href="ident?v=0.97;i=fg_console">fg_console</a>].secondary);<a name=L129 href="source/kernel/chr_drv/tty_io.c?v=0.97#L129">129</a>         <a href="ident?v=0.97;i=flush_input">flush_input</a>(&amp;<a href="ident?v=0.97;i=tty_table">tty_table</a>[<a href="ident?v=0.97;i=fg_console">fg_console</a>]);<a name=L130 href="source/kernel/chr_drv/tty_io.c?v=0.97#L130">130</a> }<a name=L131 href="source/kernel/chr_drv/tty_io.c?v=0.97#L131">131</a> <a name=L132 href="source/kernel/chr_drv/tty_io.c?v=0.97#L132">132</a> void <a href="ident?v=0.97;i=copy_to_cooked">copy_to_cooked</a>(struct <a href="ident?v=0.97;i=tty_struct">tty_struct</a> * tty)<a name=L133 href="source/kernel/chr_drv/tty_io.c?v=0.97#L133">133</a> {<a name=L134 href="source/kernel/chr_drv/tty_io.c?v=0.97#L134">134</a>         int c;<a name=L135 href="source/kernel/chr_drv/tty_io.c?v=0.97#L135">135</a> <a name=L136 href="source/kernel/chr_drv/tty_io.c?v=0.97#L136">136</a>         if (!(tty &amp;&amp; tty-&gt;write &amp;&amp; tty-&gt;read_q &amp;&amp;<a name=L137 href="source/kernel/chr_drv/tty_io.c?v=0.97#L137">137</a>             tty-&gt;write_q &amp;&amp; tty-&gt;secondary)) {<a name=L138 href="source/kernel/chr_drv/tty_io.c?v=0.97#L138">138</a>                 <a href="ident?v=0.97;i=printk">printk</a>(<i>"copy_to_cooked: missing queues\n\r"</i>);<a name=L139 href="source/kernel/chr_drv/tty_io.c?v=0.97#L139">139</a>                 return;<a name=L140 href="source/kernel/chr_drv/tty_io.c?v=0.97#L140">140</a>         }<a name=L141 href="source/kernel/chr_drv/tty_io.c?v=0.97#L141">141</a>         while (1) {<a name=L142 href="source/kernel/chr_drv/tty_io.c?v=0.97#L142">142</a>                 if (<a href="ident?v=0.97;i=FULL">FULL</a>(tty-&gt;secondary))<a name=L143 href="source/kernel/chr_drv/tty_io.c?v=0.97#L143">143</a>                         break;<a name=L144 href="source/kernel/chr_drv/tty_io.c?v=0.97#L144">144</a>                 c = <a href="ident?v=0.97;i=get_tty_queue">get_tty_queue</a>(tty-&gt;read_q);<a name=L145 href="source/kernel/chr_drv/tty_io.c?v=0.97#L145">145</a>                 if (c &lt; 0)<a name=L146 href="source/kernel/chr_drv/tty_io.c?v=0.97#L146">146</a>                         break;<a name=L147 href="source/kernel/chr_drv/tty_io.c?v=0.97#L147">147</a>                 if (<a href="ident?v=0.97;i=I_STRP">I_STRP</a>(tty))<a name=L148 href="source/kernel/chr_drv/tty_io.c?v=0.97#L148">148</a>                         c &amp;= 0x7f;<a name=L149 href="source/kernel/chr_drv/tty_io.c?v=0.97#L149">149</a>                 if (c==13) {<a name=L150 href="source/kernel/chr_drv/tty_io.c?v=0.97#L150">150</a>                         if (<a href="ident?v=0.97;i=I_CRNL">I_CRNL</a>(tty))<a name=L151 href="source/kernel/chr_drv/tty_io.c?v=0.97#L151">151</a>                                 c=10;<a name=L152 href="source/kernel/chr_drv/tty_io.c?v=0.97#L152">152</a>                         else if (<a href="ident?v=0.97;i=I_NOCR">I_NOCR</a>(tty))<a name=L153 href="source/kernel/chr_drv/tty_io.c?v=0.97#L153">153</a>                                 continue;<a name=L154 href="source/kernel/chr_drv/tty_io.c?v=0.97#L154">154</a>                 } else if (c==10 &amp;&amp; <a href="ident?v=0.97;i=I_NLCR">I_NLCR</a>(tty))<a name=L155 href="source/kernel/chr_drv/tty_io.c?v=0.97#L155">155</a>                         c=13;<a name=L156 href="source/kernel/chr_drv/tty_io.c?v=0.97#L156">156</a>                 if (<a href="ident?v=0.97;i=I_UCLC">I_UCLC</a>(tty))<a name=L157 href="source/kernel/chr_drv/tty_io.c?v=0.97#L157">157</a>                         c=<a href="ident?v=0.97;i=tolower">tolower</a>(c);<a name=L158 href="source/kernel/chr_drv/tty_io.c?v=0.97#L158">158</a>                 if (<a href="ident?v=0.97;i=L_CANON">L_CANON</a>(tty)) {<a name=L159 href="source/kernel/chr_drv/tty_io.c?v=0.97#L159">159</a>                         if ((<a href="ident?v=0.97;i=KILL_CHAR">KILL_CHAR</a>(tty) != <a href="ident?v=0.97;i=__DISABLED_CHAR">__DISABLED_CHAR</a>) &amp;&amp;<a name=L160 href="source/kernel/chr_drv/tty_io.c?v=0.97#L160">160</a>                             (c==<a href="ident?v=0.97;i=KILL_CHAR">KILL_CHAR</a>(tty))) {<a name=L161 href="source/kernel/chr_drv/tty_io.c?v=0.97#L161">161</a>                                 <b><i>/* deal with killing the input line */</i></b><a name=L162 href="source/kernel/chr_drv/tty_io.c?v=0.97#L162">162</a>                                 while(!(<a href="ident?v=0.97;i=EMPTY">EMPTY</a>(tty-&gt;secondary) ||<a name=L163 href="source/kernel/chr_drv/tty_io.c?v=0.97#L163">163</a>                                         (c=<a href="ident?v=0.97;i=LAST">LAST</a>(tty-&gt;secondary))==10 ||<a name=L164 href="source/kernel/chr_drv/tty_io.c?v=0.97#L164">164</a>                                         ((<a href="ident?v=0.97;i=EOF_CHAR">EOF_CHAR</a>(tty) != <a href="ident?v=0.97;i=__DISABLED_CHAR">__DISABLED_CHAR</a>) &amp;&amp;<a name=L165 href="source/kernel/chr_drv/tty_io.c?v=0.97#L165">165</a>                                          (c==<a href="ident?v=0.97;i=EOF_CHAR">EOF_CHAR</a>(tty))))) {<a name=L166 href="source/kernel/chr_drv/tty_io.c?v=0.97#L166">166</a>                                         if (<a href="ident?v=0.97;i=L_ECHO">L_ECHO</a>(tty)) {

⌨️ 快捷键说明

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