通過對i8042 鍵盤控制器程式設計控制滑鼠

2021-07-29 11:02:11 字數 3675 閱讀 8616

ps/2協議其實支援兩種裝置,一種是鍵盤,一種是滑鼠,它是由ibm公司制定的,協議的本身定義了鍵盤與滑鼠同主機進行通迅的規則,其中包括了大量的物理及電器方面的資訊,比如滑鼠連線線的插頭的管腳(針)數,每個管腳(針)的用途,電平是多少等,不過幸運的是,我們並不需要對這樣的硬體細節有詳細的了解,就可以完成我們的作業系統,我們需要了解的就是怎樣初始化滑鼠,以及怎樣從滑鼠中獲得資訊。

這裡,我們首先來看看怎樣初始化滑鼠。根據ps/2協議,滑鼠是由鍵盤的控制器(i8042)進行控制的,鍵盤控制器(i8042)總共有兩個通道,乙個通道由鍵盤使用,另乙個通道由滑鼠使用,我們對滑鼠進行操作也是通過i8042晶元來完成的,因此,現在的重點就是了解並熟悉怎樣對i8042進行程式設計,來完成對滑鼠的控制。

i8042支援兩種工作模式——at模式及ps/2模式,這都是由ibm所定義的一些規範,i8042在計算機啟動時會自動檢測使用者是否使用的支援ps/2協議的鍵盤及滑鼠,以決定是否工作在ps/2模式下,現在我們假設我們使用的都是ps/2鍵盤及滑鼠,因此,現在i8042工作在ps/2模式下(請記住這一點,即i8042可以工作在at模式或者ps/2模式下,並且現在假設其工作在ps/2模式下,這在後面將會用到)。

與i8042有關的i/o埠共有兩個,乙個是0x60埠,乙個是0x64埠,如果我們想獲得i8042的狀態,我們需要讀0x64埠,這將返回i8042中狀態暫存器的內容。如果我們想向i8042傳送命令,我們需要先把命令傳送到0x64埠,然後緊接著把這個命令的引數傳送到0x60埠,然後我們可以通過讀0x60埠,獲得i8042返回給我們的資料。

下面我們就來看看,應當傳送什麼樣的命令去控制滑鼠,這涉及到下面幾個需要傳送給i8042的命令:

0xa8命令:許可i8042的滑鼠通道,即允許滑鼠操作。

0xd4命令:把發往0x60埠的引數資料發給滑鼠。

0x60命令:把發往0x60埠的引數資料寫入i8042的控制暫存器。

從上面的分析我們可以基本窺見怎樣操作滑鼠。首先,我們應向i8042的0x64埠傳送0xa8命令,以許可i8042的滑鼠通道,以便完成對滑鼠的操作。其次我們應向i8042的0x64埠傳送0xd4命令,以通知i8042我們需要控制滑鼠,並把控制滑鼠的命令發到i8042的0x60埠,再從i8042的0x60埠取回滑鼠發給我們的資料,這一過程無疑是比較簡單的,我們先來看看,我們應向滑鼠傳送什麼樣的控制命令,然後再看看實際的**。

控制滑鼠的命令非常之多,比如0xff命令可以讓滑鼠復位;0xfe命令可以讓滑鼠重新傳送上次的資料報;0xf3命令可以設定滑鼠的取樣率,也即滑鼠滑動時的靈敏度;0xf4命令可以允許滑鼠向主機傳送資料報等。這裡最重要的就是0xf4命令,而其它的設定滑鼠的命令我們暫時可以不用理會,因為使用預設值已經能很好的完成本實驗了。要理解0xf4命令有什麼作用,我們需要先了解一下滑鼠的四種工作模式:reset模式,stream模式,remote模式及wrap模式。

首先是reset模式,當滑鼠初次加電或收到0xff命令之後,滑鼠就處於此模式,然後滑鼠將進行一系列的初始化及檢測工作,包括設定預設的取樣率等,完成初始化極檢測之後,滑鼠將進入stream模式。

在stream模式下,如果滑鼠被移動,或者有鍵被按下,那麼滑鼠將向主機傳送資料報,並提請乙個中斷請求,主機需要響應此中斷,並在中斷處理程式中取得滑鼠傳送的資料報。如果在stream模式下,我們向滑鼠傳送0xf0命令,將使滑鼠進入remote模式。

remote模式同stream模式差不多,主要工作就是檢測滑鼠是否被移動及是否有鍵被按下,不過它與stream模式的區別在於,它並不會主動的向主機提請中斷請求,也即它不會主動的向主機傳送資料報,而是被動的等待主機使用0xeb(讀資料命令)後,再向主機提請中斷請求,傳送資料報。換句話說,如果在remote模式下,你每次欲讀資料時,均需要向滑鼠傳送0xeb命令,而如果是在stream模式下,滑鼠會自動向你傳送資料。

wrap模式主要用於檢測滑鼠與主機之間的連線是否正常,主機向它傳送命令,它一般不會執行此命令,而只是簡單的將此命令原封不同的回送給主機,主機可比較它發出的命令及接收到的命令是否一致,並以此來認定滑鼠與主機之間的連線是否正常。

從上面的描述中我們可以看出,我們需要關心的只有reset模式及stream模式,但對於作業系統編寫人員而非bios編寫人員來說,真正需要關心的只有stream模式,這是因為當計算機啟動的時候,bios會自動檢測滑鼠,與滑鼠進行通訊,這個時候它會向滑鼠傳送0xff(復位)命令,然後滑鼠會自檢,並通知主機自檢是否正常,然後滑鼠就將處於stream模式,此時,滑鼠已經開始檢測滑鼠是否移動及是否有鍵按下了,但是它不會立即就向主機傳送資料,因為有可能主機還沒有進入真正的作業系統,主機還正在啟動中,因此,滑鼠會等待主機的通知,直到主機給它傳送0xf4命令後,它才開始向主機傳送資料。

// 許可 滑鼠

void mouse_enable_mouse()

{// 對 8042 鍵盤控制晶元進行程式設計

// 允許 滑鼠 介面

io_write_to_io_port( 0x64 , 0xa8 ) ;

// 通知 8042 下個位元組的發向 0x60 的資料將發給 滑鼠

io_write_to_io_port( 0x64 , 0xd4 ) ;

// 允許 滑鼠 發資料

io_write_to_io_port( 0x60 , 0xf4 ) ;

// 通知 8042,下個位元組的發向 0x60 的資料應放向 8042 的命令暫存器

io_write_to_io_port( 0x64 , 0x60 ) ;

// 許可鍵盤及 滑鼠 介面及中斷

io_write_to_io_port( 0x60 , 0x47 ) ;

有了上面的描述,這段**就相當簡單了,首先它向i8042的0x64埠傳送了乙個0xa8命令,通知i8042,允許滑鼠通道。然後,它向i8042的0x64埠傳送了乙個0xd4命令,這個命令表示,下面發給0x60的命令需要發給滑鼠,所以,緊接著,它向i8042的0x60埠,也即向滑鼠,傳送了0xf4命令,這個命令將允許經過bios初始化後,現在已處於stream模式下的滑鼠給主機傳送資料報。隨後,它向i8042的0x64埠傳送了0x60命令,表示,下面發向0x60埠的資料需要寫入i8042的控制暫存器,最後它向i8042的0x60埠傳送了值為0x47的資料,這個資料被寫入了i8042的控制暫存器。下面,我們就來看看這個控制暫存器,以明白,這裡為什麼需要向它傳送這樣乙個值為0x47的資料。

下面就是i8042的控制暫存器的格式,這個控制暫存器總共有8位,即1個位元組。

位0:鍵盤中斷標誌位,如果置1,那麼如果有鍵盤動作,則i8042將提請irq1中斷。

位1:滑鼠中斷標誌位,如果置1,那麼如果有滑鼠動作,則i8042將提請irq12中斷(在at模式下這位不使用,只在ps/2模式下有效。這裡可以回憶一下前面我們提到的i8042可以工作在at或者ps/2兩種模式下的描述)。

位2:系統標誌位,上電的時候是0,自檢成功後是1。

位3:鍵盤鎖標誌位,如果是1,將忽略鍵盤鎖,這主要是為了相容一些老式的帶鎖的鍵盤,而且這位只在at模式下使用,ps/2模式下將不使用此位。

位4:鍵盤介面標誌位,如果置1,將禁止使用鍵盤介面。

位5:在at模式下,這是at鍵盤協議位。置0的時候,i8042將使用at協議,如果置1,將使用xt協議。在ps/2模式下,這是滑鼠介面(通道)標誌位,如果置1將禁止滑鼠介面(通道)。

位6:鍵盤掃瞄碼轉換標誌位。如果置1將把真實的鍵盤掃瞄碼轉換為第一套鍵盤掃瞄碼(有關此內容詳見《編寫作業系統之鍵盤互動的實現》一文)。

位7:保留,應置為0。

cat /proc/interrupts

1號是鍵盤中斷,12號是滑鼠中斷,都是有i8042晶元控制的啦。。

通過對i8042 鍵盤控制器程式設計控制滑鼠

ps 2協議其實支援兩種裝置,一種是鍵盤,一種是滑鼠,它是由ibm公司制定的,協議的本身定義了鍵盤與滑鼠同主機進行通迅的規則,其中包括了大量的物理及電器方面的資訊,比如滑鼠連線線的插頭的管腳 針 數,每個管腳 針 的用途,電平是多少等,不過幸運的是,我們並不需要對這樣的硬體細節有詳細的了解,就可以完...

可程式設計控制器Arduino

如果真想做出點東西來,只有軟體是遠遠不夠的,需要軟硬結合 最近發現目前比較流行的可程式設計控制器arduino,是一套公開的可程式設計控制器標準,有多種硬體廠家提供的實現 直接usb連線供電直驅,可控制數碼訊號,模擬訊號,提供專用ide開發環境,很讚!國外的板子比較貴,openjumper提供的zd...

PLC可程式設計控制器實訓裝置

zn 801b型 plc可程式設計控制器實訓裝置 一 產品概述 zn 801b型 plc可程式設計控制器實訓裝置以可程式設計控制器 plc 為主要器件,單元模組組合設計,結構合理,功能先進,實驗方便。整套裝置硬體 軟體配置齊全。plc可以通過手持程式設計器或轉換電纜連線計算機,利用程式設計軟體進行程...