EC - 鍵盤掃描

Keyboard Matrix Scan

現今筆記型電腦的鍵盤多採用 104 鍵配置,這意味著至少需要8×13 (104) 個掃描點位,也就是 Y0 至 Y12(共 13 條 MY 線),才能涵蓋所有按鍵。


本章將著重於 Firmware 層面的技術實作,並說明基本硬體如何配置 MXn 與 MYn。若您希望深入了解 Keyboard Scan Module 的運作原理,建議參閱相關技術資料。新一代的 EC 晶片已將原有的 16x8 鍵盤矩陣擴充為 18x8 結構,以支援更多按鍵配置。


所謂 Ghost Key,是指在用戶同時按下如 X0/Y0、X0/Y1 與 X1/Y0 等位置時,掃描邏輯會誤判 X1/Y1(即 MX1/MY1)也被同時按下(電流由 X0/Y1 流到 X0/Y0 再到 X1/Y0 而誤判 X1/Y1 也被按下)。這類未實際觸發卻被錯誤判定的按鍵即稱為 Ghost Key。為避免此類現象,設計鍵盤矩陣時,應對常用作組合鍵的按鍵適當預留空間,避免造成掃描誤判。


Firmware 的鍵盤掃描流程如下:

當 EC 處於待機狀態時,MXn 設為輸入端,而 MYn 則輸出低電位(Low)。當使用者按下某個按鍵時,對應的 MXn 與 MYn 將被導通,使得低電位從 MYn 傳送至 MXn,進而觸發 EC 偵測到中斷。中斷服務程式僅負責記錄該事件(set service flag),並將 EC 設定為禁止掃描狀態(MYn 輸出改為高電位),同時立即釋放中斷資源。

隨後,由 Firmware 的主服務程序負責執行按鍵掃描。掃描過程會依序將 MY0 至 MY17 的每條線由高電位轉為低電位,並讀取 MXn 的輸入狀態,以判定是哪一顆按鍵被觸發。此階段同時會檢查是否產生 Ghost Key,進行消彈跳(Debounce)處理,並判斷該按鍵為按下(Press)釋放(Release),是否需要重複輸出(Repeat)等動作。

最後,根據 Code Set 1 或 Code Set 2 的對應表,Firmware 會將對應的 Scancode 傳送至主系統,以完成鍵盤輸入的傳遞流程。

  • 鍵盤掃描演算法說明

    鍵盤掃描的基本流程如下:

    1. 初始化掃描迴圈計數器 LoopIndex = 0

    2. 產生掃描訊號:
      0x01 根據 LoopIndex 進行位元左移(即 0x01 << LoopIndex),並將結果輸出至 MY0~MY15,作為當前掃描的 Y 軸行線。

    3. 讀取輸入狀態:
      讀取 MX0~MX7 的值,檢查是否有按鍵被觸發:

      • 若讀到值為 0xFF,表示該行無按鍵被按下。

      • 若讀到值 不為 0xFF,表示該行存在被觸發的按鍵,則記錄此一事件:

        • MX 的值存入 高位元組(High Byte)

        • 對應的 MY 掃描碼存入 低位元組(Low Byte)

    4. 遞增掃描行:
      LoopIndex 加 1,繼續掃描下一條 MY 線是否有按鍵被觸發。

    5. 掃描結束條件:
      LoopIndex 遞增至超過 MY15(即完成 MY0~MY15 共 16 行的掃描)後,結束此次掃描迴圈。

  • MATRIX 18x8 鍵盤掃描演算法說明

    在使用 18x8 鍵盤矩陣架構時,鍵盤掃描與轉碼流程如下:

    1. 掃描 MY16 / MY17:
      擴充行 MY16 與 MY17 分別加入掃描流程,當偵測到按鍵觸發時,會取得該按鍵所在的位置信息(即 MY 與 MX 的交叉點)。

    2. 計算偏移並查詢 EMSpace:
      根據該按鍵位置對應的偏移值,查詢預設的記憶體區塊 EMSpace

      注意:EMSpace 建議使用 0x00 至 0x7F 範圍內,並避免選用在 MATRIX 中未使用的按鍵對應位置。

    3. 從 MATRIX 取得對應值:
      透過 EMSpace 所定位的記憶體位址,查詢 MATRIX 陣列,取得該位置對應的值(通常為邏輯鍵碼或中介碼)。

    4. 查詢 KEYTBL 取得最終 Scancode:
      利用剛才從 MATRIX 得到的值作為索引,查詢 KEYTBL(鍵值對照表),取得對應的 Scancode。

    5. 傳送 Scancode 至系統:
      最後,將取得的 Scancode 傳送至主系統,完成一次有效的鍵盤輸入事件處理。

  • 按鍵狀態檢查相關函式說明

    CheckMake

    • 使用 Checked 旗標來判斷按鍵目前是「被按下」還是「被放開」。

    • 若判斷為按鍵放開,且尚未開始進行 Debounce 處理,則:

      • 設定對應的「按鍵放開」旗標。

      • 初始化該鍵的 Debounce 計數器。

    • Checked 旗標尚未被設定,表示該按鍵目前尚未被確認按下,或仍處於 Debounce 階段。

      • 此時會將對應的 Debounce 計數器加一,持續等待穩定狀態。

    CheckBreak

    • 用於檢測按鍵是否「已被放開」。

    • 條件邏輯與 CheckMake 相反,用於確認按鍵由按下轉為釋放的狀態。

    CheckGhost

    • (此處未提供細節)

    • 建議補充說明:此函式應用於偵測 Ghost Key(虛假按鍵)情形,防止誤判未按下的鍵。

    CheckRepeat

    • 用於判斷按鍵是否需要執行 Repeat(連續輸入)功能。

    • 判斷邏輯依賴變數 DELAY0 的值進行計數與判斷。

    • DELAY0 的初始值則由函式 ChkTypematic 設定。

      • 如需設定特定按鍵是否具備 Repeat 功能,可透過修改 ChkTypematic 函式來達成。

 











 


留言

這個網誌中的熱門文章

EC 所需知識 - SMBUS

EC 所需知識 - KBC

EC 所需知識 - LPC