0から作るソフトウェア開発
日々勉強中。。。 |
Follow @Nina_Petipa |
0から作るOS開発 キーボードドライバその1 |
IBMキーボードのタイプ | |||||
---|---|---|---|---|---|
キーボードのタイプ | キー数 | コネクタ | 通信 | 使用するスキャンコード | ホストからのコマンド |
IBM PC/XTキーボード(1981年) | 83 | 5ピンDINコネクタ | 1方向シリアル通信 | スキャンコードセット1 | コマンドに対応していない |
IBM ATキーボード(1984年) (XTとの互換性はありません) |
84(101キー) | 5ピンDINコネクタ | 双方向シリアル通信 | スキャンコードセット2 | 8コマンドに対応 |
IBM PS/2キーボード(1987年) (ATとの互換性があります) |
84から101 | 6ピンミニDINコネクタ | 双方向シリアル通信 |
スキャンコードセット2 (オプションでスキャンコードセット3も使用するものもあります) |
17コマンドに対応 |
IBM PS/2キーボード(現在) (ATとの互換性があります) |
101以上(通常は101か104、日本では106か109) | 5ピンまたは6ピンミニDINコネクタ | 双方向シリアル通信 |
スキャンコードセット2 (オプションでスキャンコードセット3も使用するものもあります) |
17コマンドに対応 |
8042のピンアサイン | ||||
---|---|---|---|---|
シンボル | ピン番号 | 名称 | 入出力 | 説明 |
TEST0, TEST1 | 1, 39 | テストピン | 入力 |
デバッグ用の入力として使用します。 TEST0:ROM/EPROM書き込み、ベリファイに使用します TEST1:イベントタイマ入力として使用します |
XTAL1, XTAL2 | 2, 3 | 外部クロック | 入力 | 外部クロックを入力します |
RESET | 4 | リセット | 入力 | Low入力でICをリセットします |
SS | 5 | シングルステップ | 入力 |
プログラムをシングルステップで動作します(デバッグ用) SYNC出力と連動します(Lowアクティブ) 使用しない場合は+5Vにプルアップしておきます |
CS | 6 | チップセレクト | 入力 |
このICにアクセスするときにチップセレクト信号を入力します (Lowアクティブ) |
EA | 7 | 外部アクセスピン | 入力 |
エミュレータを使用するときや、ROM/EPROMのベリファイに使用します 使用しない場合はプルダウンしておきます |
RD | 8 | リード | 入力 |
パソコンのCPUが8042からデータを読み込むときにLowにします (Lowアクティブ) |
A0 | 9 | コマンド/データセレクト | 入力 |
パソコンのCPUが8042から読み込むデータがコマンドであるかデータであるかを 指定するピンとなります。LowならデータでHighならコマンドとなります |
WR | 10 | ライト | 入力 |
パソコンのCPUが8042にデータを書き込むときにLowにします (Lowアクティブ) |
SYNC | 11 | クロック出力 | 出力 | 8042が命令を1つ実行するサイクルでクロックが出力されます |
D0-D7 | 12-19 | データバス | 入力/出力 |
パソコンのCPUが8042とデータを読み込んだり書き込んだりする 8ビットデータバスです。 |
P10-P17 | 27-34 | ポート1 | 入力/出力 |
データの入出力に使用する汎用ポートです このポートでキーマトリクスを読み込むときの出力を出します 特にP17はキーボードのインヒビットキーに接続されています サーバなどにインヒビットキーがついていてインヒビットキーが押されると キーが押されてもキーボードコントローラは反応しなくなり、ロック状態となります セキュリティのために使用します |
P20-P27 | 21-24, 35-38 | ポート2 | 入力/出力 |
データの入出力に使用する汎用ポートですその2です このポートでキーボード制御で使用しています P27がキーボードエンコーダからのデータを読み取ったり書き込んだりするポートになります P26がP27でデータをやり取りするときに同期するクロックをやり取りします P24は8042のバッファがフルになったときにPICにIRQを要求します また、P20-P23は主に8243I/O拡張IC(キーマトリクスの読み込み)の入力に使用します |
PROG | 25 | プログラム | 入力/出力 |
ファームウェアを書き込むときのパルスを入力したり、 8243とのデータ入出力に使用します。使用しない場合はプルアップします |
VCC | 40 | 電源 | +5Vをこのピンに供給します | |
VDD | 26 | 電源 |
通常動作時は+5Vを、ファームウェア書き込み時は +12.5Vをこのピンに供給します。 |
|
VSS | 20 | グラウンド | グラウンドに接続します |
キーボードコントローラのポートアドレス | ||
---|---|---|
ポートアドレス | IN/OUT | 説明 |
0x64 | IN | ステータスレジスタ |
0x64 | OUT | インプットバッファ(コマンドレジスタ) | キーボードコントローラ(キーボードエンコーダ)のポートアドレス |
ポートアドレス | IN/OUT | 説明 |
0x60 | IN | アウトプットバッファ |
0x60 | OUT | インプットバッファ(コマンドレジスタ) |
キーボードコントローラ8042のステータスレジスタ | |||
---|---|---|---|
ビット | シンボル | 名前 | 説明 |
ビット0 | OBF | アウトプットバッファフル |
0:キーボードコントローラのアウトプットバッファにデータが無いことを意味しています 1:アウトプットバッファにデータが存在していて、まだリードされていない状態です。リードバッファレジスタから値を読み込みとこのビットが0になります |
ビット1 | IBF | インプットバッファフル |
0:キーボードコントローラのインプットバッファ(0x060または0x064)が空の状態 1:キーボードコントローラのインプットバッファにデータが書き込まれた状態であるが、まだコントローラが値を読み取っていない状態。コントローラが書き込まれた値を読み取るとこのビットは0になります |
ビット2 | F0 | システムフラグ |
制御コマンドを書き込み、コマンドが成功すると、制御コマンドに応じて0または1にセットされます 例えばコントローラの中にはセルフテストが成功したときに1をセットします また、パワーONリセットしたときにはこのビットが0にセットされます |
ビット3 | F1 | コマンド/データフラグ |
0:最後に書き込みしたのがデータ(0x060に書き込みをした) 1:最後に書き込みしたのがコマンド(0x064に書き込みをした) このビットはA0の値がそのまま反映されます |
ビット4 | ST4 | 禁止(ロック)フラグ |
キーボードコントローラのデータアウトプットバッファにデータが書き込まれるたびに、このビットが更新されます このフラグはキーボードのインヒビット(禁止)キーが押されている状態に1になります インヒビットキーが押されている状態ではキーボードコントローラはキーが押されても何も反応しません 0:インヒビットキーが離されている状態です 1:インヒビットキーが押されている状態です |
ビット5 | ST5 | 送信(書き込み)タイムアウトフラグ |
<PS/2>
ビット0の値が1であれば 0:ポートアドレス0x60から読み込むデータはキーボードエンコーダからのデータです 1:ポートアドレス0x60から読み込むデータはマウスからのデータです <AT> 0:キーボードコントローラからの送信(書き込み)が完了した状態 1:キーボードコントローラからの送信(書き込み)が完了していない状態。または送信エラーが起こった状態。 ソフトウェアで一定時間タイムアウトを監視します |
ビット6 | ST6 | 受信(読み込み)タイムアウトフラグ |
0:キーボードコントローラが受信(読み込み)を完了した状態 1:キーボードコントローラが受信(読み込み)を完了していない状態。または受信エラーが起こった状態。 ソフトウェアで一定時間タイムアウトを監視します |
ビット7 | ST7 | パリティエラー |
0:キーボードコントローラから受信(読み込み)した最後のバイトは奇数パリティ 1:キーボードコントローラから受信(読み込み)した最後のバイトは偶数パリティ キーボードコントローラは通常奇数パリティで送信してきます |
/********************************************************************************* File:portAddress.h Description:Definition of port address *********************************************************************************/ #ifndef __PORTADDRESS__H #define __PORTADDRESS__H /* ================================================================================== Description :Keyboard Encorder ================================================================================== */
#define DEF_PORT_KBD_ENCODER 0x0060 #define DEF_PORT_KBD_ENC_BUFFER DEF_PORT_KBD_ENCODER #define DEF_PORT_KBD_ENC_COMMAND DEF_PORT_KBD_ENCODER
/* ================================================================================== Description :Onboard Keyboard Controller ================================================================================== */
#define DEF_PORT_KBD_CONTROLLER 0x0064 #define DEF_PORT_KBD_CTRL_STATUS DEF_PORT_KBD_CONTROLLER #define DEF_PORT_KBD_CTRL_COMMAND DEF_PORT_KBD_CONTROLLER #endif /* __PORTADDRESS__H */
/********************************************************************************* File:keyboard.h Description:Definition for Keyboard Driver *********************************************************************************/
#ifndef __KEYBOARD__H #define __KEYBOARD__H
/* ================================================================================== Description :Keyboard controller register bit number value description 0 0 Output buffer is empty 1 Output buffer is full 1 0 Input buffer is empty 1 Input buffer is full 2 0 Set after power on reset 1 Set after successfull completion of the keyboard controllers self-test 3 0 Last write to input buffer was data (via port 0x60) 1 Last write to input buffer was a command (via port 0x64) 4 0 Inhibit key is released 1 Inhibit key is pressed 5 0 Data has been written by keyboard controller 1 Data hasn't been written 6 0 Data has been read by keyboard controller 1 Data hasn't been read 7 0 Last data read from keyaboard controller is odd parity 1 Last data read from keyaboard controller is even parity ================================================================================== */
#define DEF_KBD_STS_OBF 0x01 #define DEF_KBD_STS_IBF 0x02 #define DEF_KBD_STS_F0 0x04 #define DEF_KBD_STS_F1 0x08 #define DEF_KBD_STS_ST4 0x10 #define DEF_KBD_STS_ST5 0x20 #define DEF_KBD_STS_ST6 0x40 #define DEF_KBD_STS_ST7 0x80 #endif /* __KEYBOARD__H */
/* _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ Funtion :readKbdCtrlStatus Input :void Output :void Return :unsigned char < value of status register > Description :read status register from keyboard controller _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ */
unsigned char readKbdCtrlStatus( void ) { return( inPortByte( DEF_PORT_KBD_CTRL_STATUS ) ); }
#define DEF_KBD_OK 0 #define DEF_KBD_ERROR (-1) #define MAX_RETRY 0x01000000
/* _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ Funtion :writeKbdCtrlCommand Input :unsigned char command < command to keyboard controller > Output :void Return :STATUS Description :write a command to keyboard controller _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ */
STATUS writeKbdCtrlCommand( unsigned char command ) { int retry;
/* ------------------------------------------------------------------------ */ /* retry reading status register */ /* ------------------------------------------------------------------------ */
for( retry = 0 ; retry < MAX_RETRY ; retry++ ) { if( ( readKbdCtrlStatus( ) & DEF_KBD_STS_IBF ) == 0 ) { outPortByte( DEF_PORT_KBD_CTRL_COMMAND, command ); return( DEF_KBD_OK ); } } return( DEF_KBD_ERROR ); }
/* _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ Funtion :readKbdEncBuffer Input :void Output :void Return :unsigned char < data read from encoder > Description :read buffer from keyboard encoder _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ */
unsigned char readKbdEncBuffer( void ) { return( inPortByte( DEF_PORT_KBD_ENC_BUFFER ) ); }
/* _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ Funtion :writeKbdEncCommand Input :unsigned char command < command to keyboard encoder > Output :void Return :STATUS Description :write a command to keyboard encoder _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ */
STATUS writeKbdEncCommand( unsigned char command ) { int retry;
/* ------------------------------------------------------------------------ */ /* retry reading status register */ /* ------------------------------------------------------------------------ */
for( retry = 0 ; retry < MAX_RETRY ; retry++ ) { if( ( readKbdCtrlStatus( ) & DEF_KBD_STS_IBF ) == 0 ) { outPortByte( DEF_PORT_KBD_ENC_COMMAND, command ); return( DEF_KBD_OK ); } } return( DEF_KBD_ERROR ); }