FreeBSD/MS Natural 4000

From TomJudge.com
Jump to: navigation, search


This has been reported to work in later versions of FreeBSD. If you have Microsoft Natural 4000 Keyboard that you want to use with FreeBSD 8.0 you need this patch:

File contents from SVN: usb-natural4000.patch
Index: quirk/usb_quirk.c
===================================================================
--- quirk/usb_quirk.c	(revision 196574)
+++ quirk/usb_quirk.c	(working copy)
@@ -122,6 +122,7 @@
 	{USB_QUIRK_ENTRY(USB_VENDOR_METAGEEK, USB_PRODUCT_METAGEEK_WISPY1B, 0x0000, 0xFFFF, UQ_KBD_IGNORE, UQ_HID_IGNORE, UQ_NONE)},
 	{USB_QUIRK_ENTRY(USB_VENDOR_TENX, USB_PRODUCT_TENX_UAUDIO0, 0x0101, 0x0101, UQ_AUDIO_SWAP_LR, UQ_NONE)},
 	/* MS keyboards do weird things */
+	{USB_QUIRK_ENTRY(USB_VENDOR_MICROSOFT, USB_PRODUCT_MICROSOFT_NATURAL4000, 0x0000, 0xFFFF, UQ_KBD_BOOTPROTO, UQ_NONE)},
 	{USB_QUIRK_ENTRY(USB_VENDOR_MICROSOFT, USB_PRODUCT_MICROSOFT_WLINTELLIMOUSE, 0x0000, 0xFFFF, UQ_MS_LEADING_BYTE, UQ_NONE)},
 	{USB_QUIRK_ENTRY(USB_VENDOR_METAGEEK, USB_PRODUCT_METAGEEK_WISPY24X, 0x0000, 0xFFFF, UQ_KBD_IGNORE, UQ_HID_IGNORE, UQ_NONE)},
 };
@@ -138,6 +139,7 @@
 	[UQ_BUS_POWERED]	= "UQ_BUS_POWERED",
 	[UQ_HID_IGNORE]		= "UQ_HID_IGNORE",
 	[UQ_KBD_IGNORE]		= "UQ_KBD_IGNORE",
+	[UQ_KBD_BOOTPROTO]	= "UQ_KBD_BOOTPROTO",
 	[UQ_MS_BAD_CLASS]	= "UQ_MS_BAD_CLASS",
 	[UQ_MS_LEADING_BYTE]	= "UQ_MS_LEADING_BYTE",
 	[UQ_MS_REVZ]		= "UQ_MS_REVZ",
Index: quirk/usb_quirk.h
===================================================================
--- quirk/usb_quirk.h	(revision 196574)
+++ quirk/usb_quirk.h	(working copy)
@@ -40,6 +40,7 @@
 	UQ_BUS_POWERED,		/* device is bus powered, despite claim */
 	UQ_HID_IGNORE,		/* device should be ignored by hid class */
 	UQ_KBD_IGNORE,		/* device should be ignored by kbd class */
+	UQ_KBD_BOOTPROTO,	/* kbd should use the boot proto. */
 	UQ_MS_BAD_CLASS,	/* doesn't identify properly */
 	UQ_MS_LEADING_BYTE,	/* mouse sends an unknown leading byte */
 	UQ_MS_REVZ,		/* mouse has Z-axis reversed */
Index: input/ukbd.c
===================================================================
--- input/ukbd.c	(revision 196574)
+++ input/ukbd.c	(working copy)
@@ -789,6 +789,17 @@
 	 * according to the BIOS data?
 	 */
 	KBD_PROBE_DONE(kbd);
+	/*
+	 * Set boot protocol if we need the quirk.
+	 */
+
+	if (usb_test_quirk(uaa, UQ_KBD_BOOTPROTO)) {
+		err = usbd_req_set_protocol(sc->sc_udev, &Giant, sc->sc_iface_index, 0);
+		if (err != USB_ERR_NORMAL_COMPLETION) {
+			DPRINTF("set protocol error=%s\n", usbd_errstr(err));
+			goto detach;
+		}
+	}
 
 	/* figure out if there is an ID byte in the data */
 	err = usbd_req_get_hid_desc(uaa->device, NULL, &hid_ptr,
Index: usbdevs
===================================================================
--- usbdevs	(revision 196574)
+++ usbdevs	(working copy)
@@ -1751,6 +1751,7 @@
 product MICROSOFT WLNOTEBOOK3	0x00d2	Wireless Optical Mouse 3000 (Model 1049)
 product MICROSOFT WLUSBMOUSE	0x00b9	Wireless USB Mouse
 product MICROSOFT XBOX360	0x0292	XBOX 360 WLAN
+product MICROSOFT NATURAL4000	0x00db  Natural Ergonomic Keyboard 4000
 
 /* Microtech products */
 product MICROTECH SCSIDB25	0x0004	USB-SCSI-DB25


cd /usr/src/sys/dev/usb;
patch < patchfile
cd /usr/src
make buildkernel
make installkernel
shutdown -r now
Personal tools