【问题标题】:Send data to a PS3 DualShock3 controller from a Mac (IOHIDDeviceSetReport)从 Mac 向 PS3 DualShock3 控制器发送数据 (IOHIDDeviceSetReport)
【发布时间】:2013-10-23 22:32:15
【问题描述】:

我最近在我的带有 PS3 控制器的 Mac 上玩了 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);

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

补充:我也刚刚注意到 Apple 对 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(作为一个指针)是“要发送到设备的报告字节。”。

【问题讨论】:

  • 你有没有让这个工作达到可以改变 LED 和震动电机状态的地步?我有 IOKit 代码可以读取值,但遵循以下设置输出报告的建议不会更改任何 LED。
  • @TristanSeifert 遗憾的是没有。 Karsten 的答案很有用,但我发现以前有链接,但无法让它们工作。让我知道您将来是否有任何运气与隆隆声或 LED。
  • 我已经把它缩小到 IOKit 给我一个关于写入停滞管道的错误,但是没有关于该错误的文档,我对 IOKit 不够熟悉来解决它,所以它可以假设数据永远不会到达设备。以后我会更多地研究它,并随时通知你! (如果我记得,那是……)
  • 我问 Feral 为什么即使游戏有这个选项,PS3 控制器也不振动,他们告诉我苹果在 OS X 中包含的驱动程序不支持这个。在另一个关于这个的讨论中,有人说苹果已经从他们的驱动程序中删除了 ForceFeedback(不记得这是从哪个操作系统开始的)。 --> 因此,由于 HID 驱动程序不支持此功能,即使一切正常,它也只会失败。我认为这也意味着我们无法设置 LED。

标签: macos cocoa hid iokit ps3


【解决方案1】:

有一个例子: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 函数。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 谢谢,如果您有任何想法,请告诉我。 :)
    猜你喜欢
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 2014-02-07
    • 1970-01-01
    • 1970-01-01
    • 2013-05-28
    • 1970-01-01
    • 2018-08-06
    相关资源
    最近更新 更多