问题
System details:
OS X 10.9.1 (13B42)
USB Infrared Touch Screen details:
Low Speed device @ 3 (0x14400000): ............................................. Composite device from unknown vendor Port Information: 0x101a Not Captive Attached to Root Hub External Device Connected Enabled Connected to External Port Number Of Endpoints (includes EP0): Total Endpoints for Configuration 1 (current): 2 Device Descriptor Descriptor Version Number: 0x0100 Device Class: 0 (Composite) Device Subclass: 0 Device Protocol: 0 Device MaxPacketSize: 8 Device VendorID/ProductID: 0x255E/0x0001 (unknown vendor) Device Version Number: 0x0100 Number of Configurations: 1 Manufacturer String: 0 (none) Product String: 0 (none) Serial Number String: 0 (none) Configuration Descriptor (current config) Length (and contents): 25 Raw Descriptor (hex) 0000: 09 02 19 00 01 01 00 A0 FA 09 04 00 00 01 FF 00 Raw Descriptor (hex) 0010: 00 00 07 05 81 03 08 00 0A Number of Interfaces: 1 Configuration Value: 1 Attributes: 0xA0 (bus-powered, remote wakeup) MaxPower: 500 mA Interface #0 - Vendor-specific Alternate Setting 0 Number of Endpoints 1 Interface Class: 255 (Vendor-specific) Interface Subclass; 0 (Vendor-specific) Interface Protocol: 0 Endpoint 0x81 - Interrupt Input Address: 0x81 (IN) Attributes: 0x03 (Interrupt) Max Packet Size: 8 Polling Interval: 10 ms
My test code source(https://github.com/maqinjun/MyDriver/blob/master/MyDriver/MyDriver/MyDriver.cpp).
As the details, my infrared touch screen is not a HID USB device, and report interrupt input event. So, I need to write a custom USB driver for it. And then, I decided to write a USB driver kext.
According to the Mac Developer Library (I/O Kit Fundamentals),I see the Handling Events.To put the role of the work loop in perspective, it helps first to consider the event sources that it is designed for. In the I/O Kit there are five broad categories of asynchronous events:
- 1. Interrupt events—indirect (secondary) interrupts originating from devices
- 2. Timer events—events delivered periodically by timers, such as timeouts
- 3. I/O commands—I/O requests issued by driver clients to their providers
- 4. Power events—typically generated through calls down the driver stack
- 5. Structural events—typically events involving the I/O Registry
I set up their work loops, event sources, and event handlers in their start function.But not works.So, I can't get the data from USB touch screen device.
My questions:
- 1. Is there other ways to receive the report data from USB device in os x USB kext ?
- 2. How to dispatch the coordinate to system, when get the report data ?
Someone help me?
回答1:
That's not how USB works. USB devices never generate events on their own - you need to find the relevant pipe on the device's interface. Then, you'll need to send requests to the device, and when an event happens, the device will respond.
I suggest reading up on how USB works. Also, if a driver for another operating system already exists for this device, maybe the developer for that can walk you through it? You'll also find that this book for all its faults, does have a decent chapter on writing USB drivers, and explains how USB devices, interfaces, endpoints, etc. fit together.
You might want to look into writing your driver in userspace. Writing kexts isn't really something I'd recommend to novices, and never something I'd recommend if it's possible to do the same thing in userspace.
Finally, please don't expect the users of this site to walk you through the whole learning process of writing a driver for your device. There's a lot of material out there that you can learn from - books, Apple's documentation, blog posts, Apple's source code, 3rd party source code, and so on. Yes, this will probably take you some months. There's no way around that (other than hiring someone else to do it).
来源:https://stackoverflow.com/questions/20876794/how-to-write-a-custom-usb-infrared-touch-screen-driver-for-os-x