Difference between revisions of "IOP16 PS/2 Keyboard"

From Land Boards Wiki
Jump to navigation Jump to search
Line 16: Line 16:
 
* Addr = 1
 
* Addr = 1
 
* ASCII Data
 
* ASCII Data
 +
 +
== PS/2 Keyboard Subroutines ==
 +
 +
* Blocking routine waits for keypress
 +
 +
<pre>
 +
KB2U IOR 0X00 0X0C READ KBD STATUS
 +
ARI 0X00 0X01 MASK RX DATA PRESENT BIT
 +
BNZ KB2U NO KBD DATA
 +
IOR 0X01 0X0D READ KBD DATA
 +
NOKDBD RTS DONE KEYBOARD TO UART
 +
</pre>
 +
 +
* Non-blocking routine skips read
 +
 +
<pre>
 +
KB2U IOR 0X00 0X0C READ KBD STATUS
 +
ARI 0X00 0X01 MASK RX DATA PRESENT BIT
 +
BEZ NOKDBD NO KBD DATA
 +
IOR 0X01 0X0D READ KBD DATA
 +
IOW 0X01 0X09 WRITE TO UART DATA
 +
NOKDBD RTS DONE KEYBOARD TO UART
 +
</pre>
  
 
== Hook-up ==
 
== Hook-up ==

Revision as of 12:08, 15 April 2022

PS/2 Keyboard

  • Wrapper for PS/2 keyboard interfaces
  • PS/2 to ASCII conversion

Software Interface

Status register (Read only)

  • Addr = 0
  • Value = 0x00, No data present
  • Value = 0x01, Data present

Data register (Read only)

  • Addr = 1
  • ASCII Data

PS/2 Keyboard Subroutines

  • Blocking routine waits for keypress
KB2U	IOR	0X00	0X0C	READ KBD STATUS
	ARI	0X00	0X01	MASK RX DATA PRESENT BIT
	BNZ	KB2U		NO KBD DATA
	IOR	0X01	0X0D	READ KBD DATA
NOKDBD	RTS			DONE KEYBOARD TO UART
  • Non-blocking routine skips read
KB2U	IOR	0X00	0X0C	READ KBD STATUS
	ARI	0X00	0X01	MASK RX DATA PRESENT BIT
	BEZ	NOKDBD		NO KBD DATA
	IOR	0X01	0X0D	READ KBD DATA
	IOW	0X01	0X09	WRITE TO UART DATA
NOKDBD	RTS			DONE KEYBOARD TO UART

Hook-up

  • Add to Top Level VHDL code

Pins

  • Add to top level entity pins list
  -- PS/2 
  ps2Clk  : inout std_logic;
  ps2Data : inout std_logic;

Signals

  • Add signal into architecture section
-- Decodes/Strobes
...
 signal w_kbcs : std_logic;

-- Interfaces
...
  signal w_KbdData  :  std_logic_vector(7 downto 0);

VHDL Instance

-- PS/2 keyboard/mapper to ANSI
KEYBOARD : ENTITY  WORK.Wrap_Keyboard
port MAP (
  i_CLOCK_50 => i_clk,
  i_n_reset  => w_resetClean_n,
  i_kbCS     => w_kbcs,
  i_RegSel   => w_periphAdr(0),
  i_rd_Kbd   => w_kbcs,
  i_ps2_clk  => ps2Clk,
  i_ps2_data => ps2Data,
  o_kbdDat   => w_KbdData
);

Hook-up Strobes/Read Mux

  • Add to strobes and read mux
-- Strobes/Selects
  ...
  w_kbcs <= '1' when (w_periphAdr(7 downto 1) = "0000110") and (w_periphRd = '1') else '0';

-- Peripheral bus read mux
  w_periphIn <= ...
    w_KbdData  when w_periphAdr(7 downto 1) = "0000110"	else
  ...

Resources

  • Logic Cells: 708
  • Registers: 95
  • Memory Bits: 0
  • M9Ks: 0