Contents
Overview of Keyboard Layouts on Windows 2
Keyboard type and keyboard subtype 2
PS/2-based keyboards 2
HID-based keyboards 3
Implementation of HID-based keyboard layouts in Windows 10 3
Implementation of HID-based keyboard layouts in Windows 8.1 and earlier 4
Keyboard INF type and subtype override values 4
Sample INF 5
Korean 101 HID Keyboard INF 5
Japanese 106 HID Keyboard INF 6
Resources 7
Overview of Keyboard Layouts on Windows
This paper is intended to help OEMs, ODMs, and IHVs develop keyboards across different layouts. It presumes that you have an understanding of Windows input stack and keyboard layouts.
The Windows operating system enables users to have keyboards with different layouts. Some keyboards use 101 keys while others (such as Japanese and Korean keyboards) have additional keys beyond the standard 101 (keyboards that emit additional scan codes and HID usages beyond standard 101 keyboards). This paper outlines the steps that you take to ensure that USB, I2C, Bluetooth, and PS/2-based keyboards with more than 101 keys operate correctly.
|
|
English keyboard layout
|
Japanese keyboard layout
| Keyboard type and keyboard subtype
The Windows behavior for keyboards needs to be implemented differently for a PS/2-based and a human interface device (HID)- based keyboards that leverage USB, Bluetooth, or I2C as their transports) solution. The following section provides details on each solution.
PS/2-based keyboards
To enable Windows to correctly support Japanese and Korean layouts on PS/2 keyboards, please ensure the following
A Japanese or Korean layout keyboard must report the correct compatible ID for that layout (please see the table below) compared to the English layout keyboard. This solution only works for embedded keyboards (laptops or docking stations).
PC manufacturers can optionally provide an INF, if they wish to provide a more specific device name or metadata associated with the keyboard.
HID-based keyboards
To enable Windows to correctly support Japanese and Korean layouts on HID-based keyboards, please ensure the following:
A Japanese or Korean layout keyboard must report a different (unique) hardware ID compared to the English layout keyboard.
PC manufacturers must provide an INF that maps the hardware ID to the correct Keyboard Type and Keyboard Subtype. For details, see the Sample INF.
Implementation of HID-based keyboard layouts in Windows 10
This section applies only to Windows 10 implementations of HID Keyboard layouts.
For Windows 10, Keyboard Layout implementation follows the guidance of the HID committee in the approved HID usage table review request 42.
HID Usages
The following Keyboard Physical Layout usages are implemented in Windows 10 (excerpted from the approved usage table review request 42):
0x2C3 Keyboard Physical Layout
SV – One of the values below, the remaining values reserved:
0: Unknown Layout
1: 101 (e.g., US)
2: 103 (Korea)
3: 102 (e.g., German)
4: 104 (e.g., ABNT Brazil)
5: 106 (DOS/V Japan)*
This usage does not refer to the legend set printed on the keys, but only to the physical keyset layout, defined by the relative location and shape of the textual keys in relation to each other. This usage indicates which of the de facto standard physical layouts to which the keyboard conforms. These layouts are commonly understood.
*Note that the 106 layout also covers the 109 Japanese layout.
Keyboard Physical Layout should be implemented on keyboards by IHVs who make keyboards for different locations, such as Japan. Set the correct HID usage, and Windows 10 automatically detects the HID usage.
Implementation of HID-based keyboard layouts in Windows 8.1 and earlier
For details about the keyboard layouts supported by Windows 8.1 and earlier versions, see Windows Keyboard Layouts.
Keyboard INF type and subtype override values
Windows supports the following Keyboard Type and Keyboard Subtype values:
Bus
|
Keyboard description
|
Compat ID
|
DDInstall section in Keyboard.inf
|
Keyboard
type
|
Keyboard subtype
|
PS/2
|
Standard
|
*PNP030x
|
STANDARD_Inst
|
4
|
0
|
PS/2
|
Japanese (106/109)
|
*PNP0320
|
106_TYPE_Inst
|
7
|
2
|
PS/2
|
Korean (101b)
|
*PNP0343
|
101B_TYPE_Inst
|
8
|
4
|
PS/2
|
Korean (101c)
|
*PNP0344
|
101C_TYPE_Inst
|
8
|
5
|
PS/2
|
Korean (103/106)
|
*PNP0345
|
103_TYPE_Inst
|
8
|
6
|
HID
|
Japanese (106/109)
|
N/A
|
HID_106_Keyboard_Inst
|
7
|
2
|
*For more information about Type and Subtype, please see kbd.h in the Windows Driver Kit.
Sample INF
The following sections provide two sample INFs that show how a keyboard manufacturer can write an INF for their Korean and Japanese HID keyboards.
Korean 101 HID Keyboard INF
;
; A sample Vendor Copyright INF File for Korean 101 HID keyboards
;
;
[Version]
Signature ="$Windows NT$"
Class =Keyboard
ClassGUID ={4D36E96B-E325-11CE-BFC1-08002BE10318}
Provider =%VendorName%
DriverVer =09/19/2008,6.0.0.0
CatalogFile =VendorXYZ.cat
[ControlFlags]
ExcludeFromSelect=*
;*****************************************
; Install Section
;*****************************************
[Manufacturer]
%VendorName% = VendorXYZDevice,NTx86
[VendorXYZDevice.NTx86]
%VendorXYZ.DeviceDesc% = VendorXYZDevice_Install, HID\VID_xxxx&PID_yyyy
[VendorXYZDevice_Install.NT]
Include = keyboard.inf
Needs = HID_Keyboard_Inst.NT
[VendorXYZDevice_Install.NT.HW]
AddReg = VendorXYZDevice.HW.AddReg
Include = keyboard.inf
Needs = HID_Keyboard_Inst.NT.HW
[VendorXYZDevice.HW.AddReg]
HKR,,"KeyboardTypeOverride",0x00010001,8
HKR,,"KeyboardSubtypeOverride",0x00010001,4
[VendorXYZDevice_Install.NT.Services]
Include = keyboard.inf
Needs = HID_Keyboard_Inst.NT.Services
;*****************************************
; Strings section
;*****************************************
[Strings]
VendorName = "Vendor XYZ"
DiskName = "Vendor XYZ Installation Disk"
VendorXYZ.DeviceDesc = "VendorXYZ Device"
Japanese 106 HID Keyboard INF
;
; A sample Vendor Copyright INF File for Japanese 106 HID keyboards
;
;
[Version]
Signature ="$Windows NT$"
Class =Keyboard
ClassGUID ={4D36E96B-E325-11CE-BFC1-08002BE10318}
Provider =%VendorName%
DriverVer =09/19/2008,6.0.0.0
CatalogFile =VendorXYZ.cat
[ControlFlags]
ExcludeFromSelect=*
;*****************************************
; Install Section
;*****************************************
[Manufacturer]
%VendorName% = VendorXYZDevice,NTx86
[VendorXYZDevice.NTx86]
%VendorXYZ.DeviceDesc% = VendorXYZDevice_Install, HID\VID_xxxx&PID_yyyy
[VendorXYZDevice_Install.NT]
Include = keyboard.inf
Needs = HID_106_Keyboard_Inst.NT
[VendorXYZDevice_Install.NT.HW]
Include = keyboard.inf
Needs = HID_106_Keyboard_Inst.NT.HW
[VendorXYZDevice_Install.NT.Services]
Include = keyboard.inf
Needs = HID_106_Keyboard_Inst.NT.Services
;*****************************************
; Strings section
;*****************************************
[Strings]
VendorName = "Vendor XYZ"
DiskName = "Vendor XYZ Installation Disk"
VendorXYZ.DeviceDesc = "VendorXYZ Device"
Resources
Windows Keyboard Layouts: http://msdn.microsoft.com/en-us/goglobal/bb964651.aspx
Touch, Input, and HID: Architecture and Driver Support: http://msdn.microsoft.com/en-us/library/windows/hardware/gg487435.aspx
HID Usage Table: http://www.usb.org/developers/hidpage/HUTRR42c.pdf
|