操屁眼的视频在线免费看,日本在线综合一区二区,久久在线观看免费视频,欧美日韩精品久久综

新聞資訊

    近有一些小伙伴反饋筆記本上的鍵盤燈驅(qū)動無法正常使用或者下載后不知道如何安裝,今天給大家介紹一下如何下載和安裝鍵盤燈驅(qū)動。


    關于無法正常使用鍵盤燈軟件

    1、檢查電腦是否裝有第三方安全軟件,比如360安全衛(wèi)士、金山毒霸、魯大師等。有的話全部卸載,因為安全軟件會和鍵盤燈軟件沖突。

    2、如果沒裝第三方安全軟件,可以卸載原來的鍵盤燈軟件,去官網(wǎng)下載對應機型鍵盤燈驅(qū)動重裝。

    這里以火影T5V 英特爾版為例(此教程除T9M以外,其余機型全都適用)。


    如何卸載鍵盤燈驅(qū)動

    1、訪問火影筆記本官網(wǎng)

    2、選擇對應機型的鍵盤燈驅(qū)動,有些機型叫游戲控制中心,有些機型叫鍵盤燈驅(qū)動,點擊下載即可。


    3、下載完成后,先解壓,win10可以自動解壓zip文件,雙擊打開,選擇全部解壓縮;也可以使用第三方壓縮軟件。


    4、解壓完成后,找到GamingCenterU.EXE文件,雙擊打開。


    5、創(chuàng)建桌面快捷方式前打勾,點擊“Next”



    6、點擊Install,開始安裝



    7、默認選項是立即重啟電腦,點擊Finsh重啟電腦即可完成安裝。



    如果有小伙伴在實際安裝過程中出現(xiàn)其它異常情況,請及時聯(lián)系在線客服處理哦。今天的教程就到這里,感興趣可以點點關注支持一下哦。

    果您在ASUS官網(wǎng)找不到快捷鍵驅(qū)動程序(ATKACPI),請參考下方說明。

    由于不同機種型號所搭配的快捷鍵驅(qū)動程序和應用工具有所不同,以下列出三種不同的驅(qū)動程序。

    您所使用的計算機僅會使用到以下其中一種的驅(qū)動程序。

    ※ 注意: 部分機種已將快捷鍵驅(qū)動程序整合至ASUS System Control Interface V2。

    ● ASUS System Control Interface V2(driver)

    ● ASUS Keyboard Hot keys Driver(ATK Package)

    ● ATKPackage

    如何找到正確的快捷鍵驅(qū)動程序:

    1. 前往ASUS官網(wǎng)并進入您所使用的華碩筆記本電腦型號服務與支持下載頁面。

    2. 在支持頁面中依序確認所出現(xiàn)的驅(qū)動程序名稱符合以下哪一種,然后再下載此驅(qū)動程序及相對應的工具程序。

    ● ASUS System Control Interface V2(driver)

    此驅(qū)動程序分類于[其他]類別中。

    如果服務與支持頁面中有出現(xiàn)

    [ASUS System Control Interface V2(driver)],

    請下載并安裝該驅(qū)動及MyASUS應用程序工具。

    如果沒有出現(xiàn),請繼續(xù)往下一個步驟確認。

    ● ASUS Keyboard Hot keys Driver(ATK Package),

    此驅(qū)動程序分類于[其他]類別中。

    如果服務與支持頁面中有出現(xiàn)

    [ASUS Keyboard Hot keys Driver(ATK Package)],

    請下載并安裝該驅(qū)動及ASUS Keyboard Hotkeys應用程序工具。

    如果沒有出現(xiàn),請繼續(xù)往下一個步驟確認。

    ATKPackage,

    此驅(qū)動程序分類于[ATK]類別中。

    如果服務與支持頁面中有出現(xiàn)[ATKPackage],請下載并安裝[ATKPackage]。

    如果使用的是ATKPackage這支驅(qū)動程序,表示您的計算機沒有支持”變更鍵盤熱鍵功能”的應用程序工具。

    若您的問題并未解決,請聯(lián)系華碩客服中心,取得進一步的信息。

    盤驅(qū)動程序

    鍵盤如何工作的前文曾經(jīng)說過,當時是以 Linux 0.11 為基礎講的但不系統(tǒng),本文以 xv6 的鍵盤驅(qū)動程序為例來系統(tǒng)地講述鍵盤是如何工作的。關于驅(qū)動程序前文磁盤那一篇說過了,它就是硬件物理接口的封裝,所以了解鍵盤驅(qū)動程序,同樣的還是先來了解鍵盤的一些物理接口。

    與鍵盤相關的芯片有兩個,一個是鍵盤編碼器 i8048,另一個是鍵盤控制器 i8042,分別來看。

    鍵盤編碼器

    鍵盤編碼器位于鍵盤,它的作用主要是監(jiān)測鍵的按下和彈起,然后將兩種狀態(tài)編碼,發(fā)送給鍵盤控制器。

    上述說的碼叫做鍵盤掃描碼,編碼方式一共有三種,相應的也就有三套鍵盤掃描碼,各套鍵盤掃描碼具體怎么編碼的就不說了,見后面的鏈接。現(xiàn)今的鍵盤大多數(shù)都是用的第二套鍵盤掃描碼,但也不排除使用第一套和第三套的,所以為了兼容,鍵盤控制器會統(tǒng)統(tǒng)地轉(zhuǎn)換為第一套掃描碼。當然這是默認的情況,具體使用哪一套掃描碼,控制器是否轉(zhuǎn)化,還是要看硬件是否支持與具體怎么設置,有興趣的詳見文末鏈接。

    因此第一套鍵盤掃描碼還是得說道說道,一個鍵有按下就會有彈起,所以每個鍵會有兩個狀態(tài),即每個鍵將會對應兩個掃描碼,鍵被按下時的編碼叫做通碼(),彈起時的編碼叫做斷碼()

    大部分鍵的通碼和斷碼都是 8 位 1 字節(jié),但有些操作控制鍵如 Ctrl、Alt,附加鍵如Insert,小鍵盤區(qū)如/方向鍵等是 2 字節(jié)甚至多個字節(jié)。有多個字節(jié)的掃描碼通常都是以 開頭。只有 一個鍵是以 開頭。

    斷碼與通碼的關系:斷碼通碼。 二進制表示為 ,所以對于斷碼和通碼可以這樣理解,它們由 8 位比特組成,最高位第 7 位表示按鍵狀態(tài),1 表示按下,0 表示彈起。

    鍵盤控制器

    鍵盤控制器(i8042),不在鍵盤內(nèi)部,被集成在南橋芯片上。主要接收鍵盤編碼器發(fā)來的鍵盤掃描碼,做一些處理(比如第二套掃描碼轉(zhuǎn)第一套),然后觸發(fā)中斷通知 CPU 來讀取掃描碼。

    鍵盤控制器有 4 個 8 bits 寄存器,Status RegisterControl Register,兩者共用一個端口 0x64,讀的時候是狀態(tài)寄存器,寫的時候是控制寄存器。Input BufferOutput Buffer,兩者共用一個端口 0x60,讀的時候是輸出緩沖器,寫的時候是輸入緩沖器。

    狀態(tài)寄存器:

    bit0:1 表示輸出緩存器滿,CPU 讀取后清零。從編碼器發(fā)過來的掃描碼就放在這里。

    bit1:1 表示輸入緩存器滿,控制器讀取后清零。

    控制寄存器:

    通過寫 0x64 端口來向控制器發(fā)送命令,注意是向控制器本身發(fā)命令而不是向硬件設備鍵盤發(fā)命令,對于鍵盤的控制就是通過控制器來間接控制,所以只需要操作鍵盤就是了。

    命令控制器就是將命令字節(jié)寫入 0x64 端口,一般命令就是一字節(jié),如果有兩字節(jié),則將第二個字節(jié)寫入 0x60 端口。因為要寫 0x60 端口表示的緩存區(qū),所以要先判斷該緩存區(qū)是否為空。

    比如進入保護模式設置 時,先判斷輸入緩存區(qū)是否為空,空的話表示控制器已取走數(shù)據(jù),可以繼續(xù)進行,否則不空的話循環(huán)等待

    inb     $0x64,%al    # Wait for not busy 等待i8042緩沖區(qū)為空
    testb   $0x2,%al
    jnz     seta20.1
    

    再向 0x64 端口寫入命令 ,表示準備寫 Output 端口,隨后寫入 0x60 端口的字節(jié)將放入 Output 端口。

    inb     $0x64,%al    # Wait for not busy  同上
    testb   $0x2,%al
    jnz     seta20.2
    
    movb    $0xdf,%al    # 0xdf -> port 0x60  向端口0x60寫入0xdf,打開A20
    outb    %al,$0x60
    

    同樣的先判斷輸入緩存區(qū)是否為空,然后寫入命令第二字節(jié) ,這個字節(jié)會被送到 Output 端口,這個端口也是一個控制端口,bit2 控制著 的開關,所以如果是命令字節(jié) 表示關閉 。

    關于鍵盤控制器就說這么多,只講述了與 xv6 相關的部分,其他部分同樣的感興趣的見文末的鏈接。

    XV6

    驅(qū)動程序就是硬件物理接口的封裝,鍵盤驅(qū)動程序也是如此,它的主要功能就是將讀取掃描碼轉(zhuǎn)換成計算機所需要的信息,比如說轉(zhuǎn)換成字符,信號等等。xv6 在這方面實現(xiàn)的比較簡單,只實現(xiàn)了字符轉(zhuǎn)化,一些功能控制鍵,我們來看看。

    首先在 頭文件中定義了端口號,控制鍵如 Ctrl,特殊鍵如 UP,以及最重要的映射表,來看個普通情況下的映射表:

    static uchar normalmap[256]={
      NO,   0x1B, '1',  '2',  '3',  '4',  '5',  '6',  // 0x00
      '7',  '8',  '9',  '0',  '-',  '=',  '\b', '\t',
      'q',  'w',  'e',  'r',  't',  'y',  'u',  'i',  // 0x10
      'o',  'p',  '[',  ']',  '\n', NO,   'a',  's',
      'd',  'f',  'g',  'h',  'j',  'k',  'l',  ';',  // 0x20
      '\'', '`',  NO,   '\\', 'z',  'x',  'c',  'v',
      'b',  'n',  'm',  ',',  '.',  '/',  NO,   '*',  // 0x30
      NO,   ' ',  NO,   NO,   NO,   NO,   NO,   NO,
      NO,   NO,   NO,   NO,   NO,   NO,   NO,   '7',  // 0x40
      '8',  '9',  '-',  '4',  '5',  '6',  '+',  '1',
      '2',  '3',  '0',  '.',  NO,   NO,   NO,   NO,   // 0x50
      [0x9C] '\n',      // KP_Enter
      [0xB5] '/',       // KP_Div
      [0xC8] KEY_UP,    [0xD0] KEY_DN,
      [0xC9] KEY_PGUP,  [0xD1] KEY_PGDN,
      [0xCB] KEY_LF,    [0xCD] KEY_RT,
      [0x97] KEY_HOME,  [0xCF] KEY_END,
      [0xD2] KEY_INS,   [0xD3] KEY_DEL
    };
    

    鍵盤掃描碼是一個鍵的代表,但不是我們想要的,我們想要的是這個鍵表示的意義,比如數(shù)字鍵 1 的通碼是 , 顯然不是我們想要的,我們想要的是數(shù)字 1,所以需要一個映射關系來轉(zhuǎn)換,將所有鍵的映射關系集合在一起就是上述的映射表。是個大數(shù)組,下標就是這個鍵的掃描碼,內(nèi)容就是所表達的意思。

    上述是一般情況,那當然還有非一般的情況,比如有按下 Shift,CapsLockCtrl 等控制鍵,當按下這些控制鍵后,其他鍵按下之后表達的意義就不一樣了,所以還需要另外的映射表,這里就不列出來了,太多了,可以直接參考代碼。舉個例子,當按下 Shift 鍵之后再按下數(shù)字鍵 1,通碼 則應該映射成 !而不是1。

    有了這些了解之后來看 里面的源碼:

    int kbdgetc(void)
    {
      static uint shift;      //shift用bit來記錄控制鍵,比如shift,ctrl
      static uchar *charcode[4]={
        normalmap, shiftmap, ctlmap, ctlmap
      };       //映射表
      uint st, data, c;
    
      st=inb(KBSTATP);
      if((st & KBS_DIB)==0)     //輸出緩沖區(qū)未滿,沒法用指令in讀取
        return -1;
      data=inb(KBDATAP);      //從輸出緩沖區(qū)讀數(shù)據(jù)
    
      if(data==0xE0){       //通碼以e0開頭的鍵
        shift |=E0ESC;       //記錄e0
        return 0;
      } else if(data & 0x80){    //斷碼,表鍵彈起
        // Key released
        data=(shift & E0ESC ? data : data & 0x7F);     
        shift &=~(shiftcode[data] | E0ESC);             
        return 0;
      } else if(shift & E0ESC){   //緊接著0xE0后的掃描碼
        // Last character was an E0 escape; or with 0x80
        data |=0x80;
        shift &=~E0ESC;
      }
    
      shift |=shiftcode[data];   //記錄控制鍵狀態(tài),如Shift,Ctrl,Alt
      shift ^=togglecode[data];  //記錄控制鍵狀態(tài),如CapsLock,NumLock,ScrollLock     
      c=charcode[shift & (CTL | SHIFT)][data]; //獲取映射表的內(nèi)容,也就是該鍵表示的意義
      if(shift & CAPSLOCK){
        if('a' <=c && c <='z')
          c +='A' - 'a';
        else if('A' <=c && c <='Z')
          c +='a' - 'A';
      }
      return c;
    }
    

    這個程序就可以看作極簡的鍵盤驅(qū)動程序,也是鍵盤中斷的服務程序的主體,完成鍵盤掃描碼到所需信息的轉(zhuǎn)化。下面就來仔細分析分析:

    前面說過有多張映射表多種映射方式,那怎么知道用哪張?用哪張得看看有沒有相應的控制鍵按下,所以得有個東西來記錄控制鍵的按下與否,這個東西就是變量 ,雖然變量名是 ,但不代表只記錄 Shift 鍵的狀態(tài),記錄的信息有:

    #define SHIFT           (1<<0)
    #define CTL             (1<<1)
    #define ALT             (1<<2)
    
    #define CAPSLOCK        (1<<3)
    #define NUMLOCK         (1<<4)
    #define SCROLLLOCK      (1<<5)
    
    #define E0ESC           (1<<6)   //通碼斷碼以E0開頭
    

    從這種定義控制鍵的方式就可以看出使用 來記錄控制鍵的方式應該是使用位運算。

    表示一個二維數(shù)組,可以看作是映射表的集合,根據(jù) 的記錄信息來選擇映射表,后面用到的時候就明白了。

    st=inb(KBSTATP);
    if((st & KBS_DIB)==0)     //輸出緩沖區(qū)為空,沒法用指令in讀取
      return -1;
    data=inb(KBDATAP);      //從輸出緩沖區(qū)讀數(shù)據(jù)
    

    這幾句用來讀取鍵盤掃描碼,從鍵盤發(fā)過來的掃描碼就放在輸出緩沖區(qū)中。要讀取掃描碼首先從狀態(tài)寄存器讀取當前狀態(tài)到 ,再做與運算取出第 0 位,表示輸出緩沖區(qū)的狀態(tài),如果為 0 表示輸出緩沖區(qū)寄存器為空,沒法讀取返回 -1。如果為 1 表示輸出緩沖區(qū)寄存器已滿有內(nèi)容,可以讀取,所以接著從端口 0x60 輸出緩沖區(qū)讀出掃描碼到 。

    if(data==0xE0){       //通碼以e0開頭的鍵
        shift |=E0ESC;       //記錄e0
        return 0;
    }
    

    如果這個掃描碼為 0xE0,說明按下的鍵是特殊鍵,掃描碼不止 8 字節(jié),這種情況在 變量中做好標記就可以直接返回了,等待下一個數(shù)據(jù)的到來再做具體處理

    else if(data & 0x80){    //斷碼,表鍵彈起
        // Key released
        data=(shift & E0ESC ? data : data & 0x7F);     
        shift &=~(shiftcode[data] | E0ESC);             
        return 0;
    }
    

    為 1 的話,表示第 7 位為 1,說明此數(shù)據(jù)為斷碼,收到斷碼不需要額外的做什么事,但如果這個斷碼是某個控制鍵的斷碼,則應該將該控制鍵在 里面的記錄信息給清除掉。

    所以得知道讀出的 表示哪一個控制鍵,所以有了 映射:

    static uchar shiftcode[256]={
      [0x1D] CTL,
      [0x2A] SHIFT,
      [0x36] SHIFT,
      [0x38] ALT,
      [0x9D] CTL,
      [0xB8] ALT,
    };
    

    私以為這個定義方式很不對頭啊,實在不太明白一些控制鍵用通碼,一些用斷碼,這也就導致了那條使用了條件表達式的 賦值語句必須存在,因為 中映射 Shift 鍵的時候沒有用斷碼,所以得轉(zhuǎn)換成通碼。私以為這么映射很混亂,導致后面 中有些語句意義也不太明確,要么就應該將映射關系給補全,然后可以省掉那句 賦值語句,使后面的語句書寫變得更明確一點。當然這不是重點,能理解這過程意思就行,總而言之如果 是個斷碼,不需要干其他的事,如果是控制鍵的斷碼,將記錄在 中的控制鍵信息給清除掉就行。

    else if(shift & E0ESC){   
        // Last character was an E0 escape; or with 0x80
        data |=0x80;
        shift &=~E0ESC;
    }
    

    這種情況對應的是緊接著 后面的鍵盤掃描碼,鍵盤掃描碼有多個字節(jié)的,都是成對存在也就是 這種形式,每次收到 ,都要將 鍵中記錄的 信息給清除掉。至于前面還有一句 還是與 xv6 設計的映射表有關,鍵盤上有著許多相同意義的鍵,xv6 將一些鍵的映射關系用斷碼來映射,比如除號鍵 /。

    shift |=shiftcode[data];   //記錄控制鍵狀態(tài),如Shift,Ctrl,Alt
    shift ^=togglecode[data];  //記錄控制鍵狀態(tài),如CapsLock,NumLock,ScrollLock
    

    這兩句來記錄控制鍵的狀態(tài),分了兩種情況,兩種運算方式。應該能看出它們之間的區(qū)別吧,實現(xiàn)組合鍵的時候,Shift,Ctrl,Alt 需要按住不放才能生效,彈起后不再生效。而像 CapsLock 之類的控制鍵,只需要按下一次即可,即便彈起之后同樣生效。所以一個使用或運算,一個使用異或運算,自己模擬一下過程應該很容易明白。

    c=charcode[shift & (CTL | SHIFT)][data];   //獲取映射表的內(nèi)容,也就是該鍵表示的意義
    if(shift & CAPSLOCK){     //如果有 CapsLock 存在
      if('a' <=c && c <='z')   //小寫變大寫
        c +='A' - 'a';
      else if('A' <=c && c <='Z')  //大寫變小寫
        c +='a' - 'A';
    }
    

    根據(jù) 中記錄的控制鍵信息,來選取映射表,根據(jù) 去獲取該鍵盤掃描碼所表示的意義。因為 CapsLockShift 鍵的功能有相同之處,所以如果 c 就是個普通 26 個英文字母字符的話,需要額外判斷大小寫。

    關于 xv6 的鍵盤驅(qū)動程序差不多就是這么多,當然還有一些功能沒說,比如 Ctrl 組合鍵功能,鍵盤的緩沖區(qū)等等,這在另一個文件里面涉及到了另外的知識,咱們放在后面再詳述吧。

    在此再聊聊常見的一些問題,在第一篇鍵盤里也說過,再來看看:

    使用組合鍵時需要先按下控制鍵。鍵盤的中斷程序為這些控制鍵設置了標識()。先按下控制鍵,程序為控制鍵設置好按下狀態(tài),再處理后到來的鍵時會檢查這些標識,是否有控制鍵按下,以便做出不同的操作。

    組合鍵按鍵時有順序,但彈起無順序要求。由上面的鍵處理程序可知,只有通碼的鍵處理程序在做事,而斷碼的鍵處理程序除了控制鍵的標識位需要復位之外其他鍵都是直接返回的。所以使用鍵盤控制輸入時重要的是按鍵,而不是鍵彈起,所以只要按鍵對了,怎樣彈起并不重要。

    一直按著某個鍵時會一直觸發(fā)鍵盤中斷,若是普通的字符鍵,電腦屏幕可能會出現(xiàn)一直打印某個字符的現(xiàn)象。若是一些控制鍵,則驅(qū)動程序可能會不停地將這個鍵設為按下狀態(tài)。當然,驅(qū)動程序是否記錄上次按鍵取決于具體實現(xiàn),大多是不記錄的,xv6 也是如此,觸發(fā)一次鍵盤中斷就處理一個掃描碼。

    最后總結(jié)一番,鍵盤驅(qū)動程序同樣的是封裝鍵盤的物理接口使用,比如讀取狀態(tài),讀取掃描碼等等。鍵盤本身使用的是鍵盤掃描碼,每個鍵都有自己的鍵盤掃描碼,一個是通碼表按下,一個表斷碼表彈起。這個鍵盤掃描碼只是唯一標識一個鍵,可以將鍵盤掃描碼看作是一個鍵的物理意義,但這不是我們想要的,我們想要的是這個鍵代表的邏輯意義。所以物理意義和邏輯之間需要一個轉(zhuǎn)化,這就是映射表存在的意義。

    鍵盤上有各種各樣的鍵,還能組合使用,它們所代表的意義、具有的功能很多也很雜,xv6 只實現(xiàn)了其中一部分,但也足以讓我們明白其中的本質(zhì)。不論要通過按鍵實現(xiàn)什么功能,還是就只是簡單的使用一個鍵所代表的邏輯意義,都是要先獲取鍵的掃描碼,再通過映射表轉(zhuǎn)化成所需要的信息,后續(xù)什么功能再在其上做文章。

    好了本文就到這里結(jié)束,有什么錯誤還請批評指正,也歡迎大家來同我討論交流一起學習進步。

    參考:

    https://www.win.tue.nl/~aeb/linux/kbd/scancodes-11.html

    https://wiki.osdev.org/"8042"_PS/2_Controller#Command_Register

網(wǎng)站首頁   |    關于我們   |    公司新聞   |    產(chǎn)品方案   |    用戶案例   |    售后服務   |    合作伙伴   |    人才招聘   |   

友情鏈接: 餐飲加盟

地址:北京市海淀區(qū)    電話:010-     郵箱:@126.com

備案號:冀ICP備2024067069號-3 北京科技有限公司版權(quán)所有