10

最近我一直在我的 Mac 上使用 PS3 控制器玩 IOKit 的 HID 部分。我已经设法查看示例代码并连接到我的控制器,接收数据流并解析它(一切,包括加速度计和陀螺仪)。

然而,今天我决定开始设置设备背面的 LED 并触发震动马达,但我就是无法让它工作!

纵观 Apple 为 IOHID 提供的示例代码,我在 HID 设备上设置的东西并不多,只能接收数据。从网上看(只花了半天时间),我得到了我认为是一种有效的发送方法,它使用IOHIDDeviceSetReport(). 但是,我无法确定应该发送哪些数据。

我找到了几个列出数据示例的网站:

(我知道并非所有这些示例都适用于 Mac 和 PS3 控制器)

很多人似乎都在谈论这个,甚至在做(我拒绝相信没有人能做到这一点),但我似乎找不到任何关于如何做到这一点的东西!

我觉得我在这里错过了一个简单的步骤,所以如果有人有任何想法、帮助或解决方案,请告诉我。

谢谢。

我如何尝试发送报告的示例代码(正在返回成功):

CFIndex len = 64;
uint8_t report[64] = {0x0};

IOReturn  tIOReturn = IOHIDDeviceSetReport(deviceRef,
                                           kIOHIDReportTypeOutput,
                                           reportID,
                                           report,
                                           len);

这只是发送很多什么都没有(字面意思),但这只是我正在使用的一个例子,以防万一它不正确。

额外:我也刚刚注意到苹果的IOHIDDeviceSetReport防御与给出的例子不同。

https://developer.apple.com/library/mac/documentation/DeviceDrivers/Conceptual/HID/new_api_10_5/tn2187.html#//apple_ref/doc/uid/TP40000970-CH214-SW81

它说report应该是“报告缓冲区的地址”。但...

https://developer.apple.com/library/mac/documentation/IOKit/Reference/IOHIDDevice_iokit_header_reference/Reference/reference.html#//apple_ref/doc/uid/TP40012408-CHIOHIDDevicehFunctions-DontLinkElementID_23

它说*report(作为指针)是“要发送到设备的报告字节。”。

4

2 回答 2

3

有一个例子:http ://www.circuitsathome.com/mcu/ps3-and-wiimote-game-controllers-on-the-arduino-host-shield-part-2

描述 LED 和 Rumble 控制的代码位于: https ://github.com/ribbotson/USB-Host/blob/master/ps3/PS3USB/ps3_usb.cpp#L187

您作为报告发送的字节似乎需要具有某种格式:

 prog_char output_01_report[] PROGMEM = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                                     0x00, 0x02, 0xff, 0x27, 0x10, 0x00, 0x32, 0xff, 
                                     0x27, 0x10, 0x00, 0x32, 0xff, 0x27, 0x10, 0x00, 
                                     0x32, 0xff, 0x27, 0x10, 0x00, 0x32, 0x00, 0x00, 
                                     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                                     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  };

在 LEDRumble 函数中,这些字节被复制到 buf 中,然后覆盖 buf[9] 以设置 LED 状态,并且从 buf[1] 到 buf[4] 的字节用于配置 Rumble。字节全部发送到控制器。

这里定义了一些常量:https ://github.com/ribbotson/USB-Host/blob/master/ps3/PS3USB/ps3_usb.h#L100

#define psLED1 0x01
#define psLED2 0x02
#define psLED3 0x04
#define psLED4 0x08
#define psRumbleHigh 0x10
#define psRumbleLow 0x20

这些常量作为参数传递给 LEDRumble 函数。

于 2013-12-28T10:54:30.397 回答
2

他们的例子似乎很好,据我所知。在这些情况下,uint8_t[64] 变量或 uint8_t* 变量在传递给 IOHIDDeviceSetReport 时都将被解释为指向 uint8_t 的指针。

我现在处于受限网络中,因此无法提供任何进一步的帮助。但是我稍后会尝试在家里阅读更多关于此的内容,因为我也有一个相关的项目。如果我发现任何可以帮助我们的东西,我会回到这里讨论它。

于 2013-10-25T14:10:06.660 回答