📄 keyboard.c
字号:
<a name=L76 href="source/kernel/chr_drv/keyboard.c?v=0.97#L76">76</a> <a href="ident?v=0.97;i=outb">outb</a>(0x20, 0x20); <a name=L77 href="source/kernel/chr_drv/keyboard.c?v=0.97#L77">77</a> <a href="ident?v=0.97;i=sti">sti</a>(); <a name=L78 href="source/kernel/chr_drv/keyboard.c?v=0.97#L78">78</a> <a name=L79 href="source/kernel/chr_drv/keyboard.c?v=0.97#L79">79</a> if (<a href="ident?v=0.97;i=kraw">kraw</a>) { <a name=L80 href="source/kernel/chr_drv/keyboard.c?v=0.97#L80">80</a> <a href="ident?v=0.97;i=put_queue">put_queue</a>(scancode); <a name=L81 href="source/kernel/chr_drv/keyboard.c?v=0.97#L81">81</a> <a href="ident?v=0.97;i=do_keyboard_interrupt">do_keyboard_interrupt</a>(); <a name=L82 href="source/kernel/chr_drv/keyboard.c?v=0.97#L82">82</a> return; <a name=L83 href="source/kernel/chr_drv/keyboard.c?v=0.97#L83">83</a> } <a name=L84 href="source/kernel/chr_drv/keyboard.c?v=0.97#L84">84</a> if (scancode == 0xe0) { <a name=L85 href="source/kernel/chr_drv/keyboard.c?v=0.97#L85">85</a> <a href="ident?v=0.97;i=ke0">ke0</a> = 1; <a name=L86 href="source/kernel/chr_drv/keyboard.c?v=0.97#L86">86</a> return; <a name=L87 href="source/kernel/chr_drv/keyboard.c?v=0.97#L87">87</a> } <a name=L88 href="source/kernel/chr_drv/keyboard.c?v=0.97#L88">88</a> if (scancode == 0xe1) { <a name=L89 href="source/kernel/chr_drv/keyboard.c?v=0.97#L89">89</a> <a href="ident?v=0.97;i=ke0">ke0</a> = 2; <a name=L90 href="source/kernel/chr_drv/keyboard.c?v=0.97#L90">90</a> return; <a name=L91 href="source/kernel/chr_drv/keyboard.c?v=0.97#L91">91</a> } <a name=L92 href="source/kernel/chr_drv/keyboard.c?v=0.97#L92">92</a> <b><i>/*</i></b> <a name=L93 href="source/kernel/chr_drv/keyboard.c?v=0.97#L93">93</a> <b><i> * The keyboard maintains its own internal caps lock and num lock</i></b> <a name=L94 href="source/kernel/chr_drv/keyboard.c?v=0.97#L94">94</a> <b><i> * statuses. In caps lock mode E0 AA precedes make code and E0 2A</i></b> <a name=L95 href="source/kernel/chr_drv/keyboard.c?v=0.97#L95">95</a> <b><i> * follows break code. In num lock mode, E0 2A precedes make</i></b> <a name=L96 href="source/kernel/chr_drv/keyboard.c?v=0.97#L96">96</a> <b><i> * code and E0 AA follows break code. We do our own book-keeping,</i></b> <a name=L97 href="source/kernel/chr_drv/keyboard.c?v=0.97#L97">97</a> <b><i> * so we will just ignore these.</i></b> <a name=L98 href="source/kernel/chr_drv/keyboard.c?v=0.97#L98">98</a> <b><i> */</i></b> <a name=L99 href="source/kernel/chr_drv/keyboard.c?v=0.97#L99">99</a> if (<a href="ident?v=0.97;i=ke0">ke0</a> == 1 && (scancode == 0x2a || scancode == 0xaa)) {<a name=L100 href="source/kernel/chr_drv/keyboard.c?v=0.97#L100">100</a> <a href="ident?v=0.97;i=ke0">ke0</a> = 0;<a name=L101 href="source/kernel/chr_drv/keyboard.c?v=0.97#L101">101</a> return;<a name=L102 href="source/kernel/chr_drv/keyboard.c?v=0.97#L102">102</a> }<a name=L103 href="source/kernel/chr_drv/keyboard.c?v=0.97#L103">103</a> <b><i>/*</i></b><a name=L104 href="source/kernel/chr_drv/keyboard.c?v=0.97#L104">104</a> <b><i> * Repeat a key only if the input buffers are empty or the</i></b><a name=L105 href="source/kernel/chr_drv/keyboard.c?v=0.97#L105">105</a> <b><i> * characters get echoed locally. This makes key repeat usable</i></b><a name=L106 href="source/kernel/chr_drv/keyboard.c?v=0.97#L106">106</a> <b><i> * with slow applications and unders heavy loads.</i></b><a name=L107 href="source/kernel/chr_drv/keyboard.c?v=0.97#L107">107</a> <b><i> */</i></b><a name=L108 href="source/kernel/chr_drv/keyboard.c?v=0.97#L108">108</a> if (rep == 0xff) {<a name=L109 href="source/kernel/chr_drv/keyboard.c?v=0.97#L109">109</a> if (scancode < 0x80) {<a name=L110 href="source/kernel/chr_drv/keyboard.c?v=0.97#L110">110</a> rep = scancode;<a name=L111 href="source/kernel/chr_drv/keyboard.c?v=0.97#L111">111</a> repke0 = <a href="ident?v=0.97;i=ke0">ke0</a>;<a name=L112 href="source/kernel/chr_drv/keyboard.c?v=0.97#L112">112</a> }<a name=L113 href="source/kernel/chr_drv/keyboard.c?v=0.97#L113">113</a> } else if (<a href="ident?v=0.97;i=ke0">ke0</a> == repke0 && (scancode & 0x7f) == rep)<a name=L114 href="source/kernel/chr_drv/keyboard.c?v=0.97#L114">114</a> if (scancode & 0x80)<a name=L115 href="source/kernel/chr_drv/keyboard.c?v=0.97#L115">115</a> rep = 0xff;<a name=L116 href="source/kernel/chr_drv/keyboard.c?v=0.97#L116">116</a> else if (!(<a href="ident?v=0.97;i=krepeat">krepeat</a> && (<a href="ident?v=0.97;i=L_ECHO">L_ECHO</a>(tty) || (<a href="ident?v=0.97;i=EMPTY">EMPTY</a>(tty->secondary) &&<a name=L117 href="source/kernel/chr_drv/keyboard.c?v=0.97#L117">117</a> <a href="ident?v=0.97;i=EMPTY">EMPTY</a>(tty->read_q))))) {<a name=L118 href="source/kernel/chr_drv/keyboard.c?v=0.97#L118">118</a> <a href="ident?v=0.97;i=ke0">ke0</a> = 0;<a name=L119 href="source/kernel/chr_drv/keyboard.c?v=0.97#L119">119</a> return;<a name=L120 href="source/kernel/chr_drv/keyboard.c?v=0.97#L120">120</a> }<a name=L121 href="source/kernel/chr_drv/keyboard.c?v=0.97#L121">121</a> <a href="ident?v=0.97;i=key_table">key_table</a>[scancode](scancode);<a name=L122 href="source/kernel/chr_drv/keyboard.c?v=0.97#L122">122</a> <a href="ident?v=0.97;i=do_keyboard_interrupt">do_keyboard_interrupt</a>();<a name=L123 href="source/kernel/chr_drv/keyboard.c?v=0.97#L123">123</a> <a href="ident?v=0.97;i=ke0">ke0</a> = 0;<a name=L124 href="source/kernel/chr_drv/keyboard.c?v=0.97#L124">124</a> }<a name=L125 href="source/kernel/chr_drv/keyboard.c?v=0.97#L125">125</a> <a name=L126 href="source/kernel/chr_drv/keyboard.c?v=0.97#L126">126</a> static void <a href="ident?v=0.97;i=put_queue">put_queue</a>(int ch)<a name=L127 href="source/kernel/chr_drv/keyboard.c?v=0.97#L127">127</a> {<a name=L128 href="source/kernel/chr_drv/keyboard.c?v=0.97#L128">128</a> register struct <a href="ident?v=0.97;i=tty_queue">tty_queue</a> *qp = <a href="ident?v=0.97;i=table_list">table_list</a>[0];<a name=L129 href="source/kernel/chr_drv/keyboard.c?v=0.97#L129">129</a> unsigned long new_head;<a name=L130 href="source/kernel/chr_drv/keyboard.c?v=0.97#L130">130</a> <a name=L131 href="source/kernel/chr_drv/keyboard.c?v=0.97#L131">131</a> qp-><a href="ident?v=0.97;i=buf">buf</a>[qp-><a href="ident?v=0.97;i=head">head</a>]=ch;<a name=L132 href="source/kernel/chr_drv/keyboard.c?v=0.97#L132">132</a> if ((new_head=(qp-><a href="ident?v=0.97;i=head">head</a>+1)&(<a href="ident?v=0.97;i=TTY_BUF_SIZE">TTY_BUF_SIZE</a>-1)) != qp->tail)<a name=L133 href="source/kernel/chr_drv/keyboard.c?v=0.97#L133">133</a> qp-><a href="ident?v=0.97;i=head">head</a>=new_head;<a name=L134 href="source/kernel/chr_drv/keyboard.c?v=0.97#L134">134</a> <a href="ident?v=0.97;i=wake_up">wake_up</a>(&qp->proc_list);<a name=L135 href="source/kernel/chr_drv/keyboard.c?v=0.97#L135">135</a> }<a name=L136 href="source/kernel/chr_drv/keyboard.c?v=0.97#L136">136</a> <a name=L137 href="source/kernel/chr_drv/keyboard.c?v=0.97#L137">137</a> static void <a href="ident?v=0.97;i=puts_queue">puts_queue</a>(char *cp)<a name=L138 href="source/kernel/chr_drv/keyboard.c?v=0.97#L138">138</a> {<a name=L139 href="source/kernel/chr_drv/keyboard.c?v=0.97#L139">139</a> register struct <a href="ident?v=0.97;i=tty_queue">tty_queue</a> *qp = <a href="ident?v=0.97;i=table_list">table_list</a>[0];<a name=L140 href="source/kernel/chr_drv/keyboard.c?v=0.97#L140">140</a> unsigned long new_head;<a name=L141 href="source/kernel/chr_drv/keyboard.c?v=0.97#L141">141</a> char ch;<a name=L142 href="source/kernel/chr_drv/keyboard.c?v=0.97#L142">142</a> <a name=L143 href="source/kernel/chr_drv/keyboard.c?v=0.97#L143">143</a> while (ch=*cp++) {<a name=L144 href="source/kernel/chr_drv/keyboard.c?v=0.97#L144">144</a> qp-><a href="ident?v=0.97;i=buf">buf</a>[qp-><a href="ident?v=0.97;i=head">head</a>]=ch;<a name=L145 href="source/kernel/chr_drv/keyboard.c?v=0.97#L145">145</a> if ((new_head=(qp-><a href="ident?v=0.97;i=head">head</a>+1)&(<a href="ident?v=0.97;i=TTY_BUF_SIZE">TTY_BUF_SIZE</a>-1))<a name=L146 href="source/kernel/chr_drv/keyboard.c?v=0.97#L146">146</a> != qp->tail)<a name=L147 href="source/kernel/chr_drv/keyboard.c?v=0.97#L147">147</a> qp-><a href="ident?v=0.97;i=head">head</a>=new_head;<a name=L148 href="source/kernel/chr_drv/keyboard.c?v=0.97#L148">148</a> }<a name=L149 href="source/kernel/chr_drv/keyboard.c?v=0.97#L149">149</a> <a href="ident?v=0.97;i=wake_up">wake_up</a>(&qp->proc_list);<a name=L150 href="source/kernel/chr_drv/keyboard.c?v=0.97#L150">150</a> }<a name=L151 href="source/kernel/chr_drv/keyboard.c?v=0.97#L151">151</a> <a name=L152 href="source/kernel/chr_drv/keyboard.c?v=0.97#L152">152</a> static void <a href="ident?v=0.97;i=ctrl">ctrl</a>(int sc)<a name=L153 href="source/kernel/chr_drv/keyboard.c?v=0.97#L153">153</a> {<a name=L154 href="source/kernel/chr_drv/keyboard.c?v=0.97#L154">154</a> if (<a href="ident?v=0.97;i=ke0">ke0</a>)<a name=L155 href="source/kernel/chr_drv/keyboard.c?v=0.97#L155">155</a> <a href="ident?v=0.97;i=kmode">kmode</a>|=<a href="ident?v=0.97;i=RCTRL">RCTRL</a>;<a name=L156 href="source/kernel/chr_drv/keyboard.c?v=0.97#L156">156</a> else<a name=L157 href="source/kernel/chr_drv/keyboard.c?v=0.97#L157">157</a> <a href="ident?v=0.97;i=kmode">kmode</a>|=<a href="ident?v=0.97;i=LCTRL">LCTRL</a>;<a name=L158 href="source/kernel/chr_drv/keyboard.c?v=0.97#L158">158</a> }<a name=L159 href="source/kernel/chr_drv/keyboard.c?v=0.97#L159">159</a> <a name=L160 href="source/kernel/chr_drv/keyboard.c?v=0.97#L160">160</a> static void <a href="ident?v=0.97;i=alt">alt</a>(int sc)<a name=L161 href="source/kernel/chr_drv/keyboard.c?v=0.97#L161">161</a> {<a name=L162 href="source/kernel/chr_drv/keyboard.c?v=0.97#L162">162</a> if (<a href="ident?v=0.97;i=ke0">ke0</a>)<a name=L163 href="source/kernel/chr_drv/keyboard.c?v=0.97#L163">163</a> <a href="ident?v=0.97;i=kmode">kmode</a>|=<a href="ident?v=0.97;i=ALTGR">ALTGR</a>;<a name=L164 href="source/kernel/chr_drv/keyboard.c?v=0.97#L164">164</a> else<a name=L165 href="source/kernel/chr_drv/keyboard.c?v=0.97#L165">165</a> <a href="ident?v=0.97;i=kmode">kmode</a>|=<a href="ident?v=0.97;i=ALT">ALT</a>;<a name=L166 href="source/kernel/chr_drv/keyboard.c?v=0.97#L166">166</a> }<a name=L167 href="source/kernel/chr_drv/keyboard.c?v=0.97#L167">167</a> <a name=L168 href="source/kernel/chr_drv/keyboard.c?v=0.97#L168">168</a> static void <a href="ident?v=0.97;i=unctrl">unctrl</a>(int sc)<a name=L169 href="source/kernel/chr_drv/keyboard.c?v=0.97#L169">169</a> {<a name=L170 href="source/kernel/chr_drv/keyboard.c?v=0.97#L170">170</a> if (<a href="ident?v=0.97;i=ke0">ke0</a>)<a name=L171 href="source/kernel/chr_drv/keyboard.c?v=0.97#L171">171</a> <a href="ident?v=0.97;i=kmode">kmode</a>&=(~RCTRL);<a name=L172 href="source/kernel/chr_drv/keyboard.c?v=0.97#L172">172</a> else<a name=L173 href="source/kernel/chr_drv/keyboard.c?v=0.97#L173">173</a> <a href="ident?v=0.97;i=kmode">kmode</a>&=(~LCTRL);<a name=L174 href="source/kernel/chr_drv/keyboard.c?v=0.97#L174">174</a> }<a name=L175 href="source/kernel/chr_drv/keyboard.c?v=0.97#L175">175</a> <a name=L176 href="source/kernel/chr_drv/keyboard.c?v=0.97#L176">176</a> static void <a href="ident?v=0.97;i=unalt">unalt</a>(int sc)<a name=L177 href="source/kernel/chr_drv/keyboard.c?v=0.97#L177">177</a> {<a name=L178 href="source/kernel/chr_drv/keyboard.c?v=0.97#L178">178</a> if (<a href="ident?v=0.97;i=ke0">ke0</a>)<a name=L179 href="source/kernel/chr_drv/keyboard.c?v=0.97#L179">179</a> <a href="ident?v=0.97;i=kmode">kmode</a>&=(~ALTGR);<a name=L180 href="source/kernel/chr_drv/keyboard.c?v=0.97#L180">180</a> else {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -