从Mac(IOHIDDeviceSetReport)向PS3 DualShock3控制器发送数据

时间:2013-10-15 23:24:41

标签: macos cocoa hid iokit ps3

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

然而,今天我决定开始设置设备背面的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(作为指针)是“要发送到设备的报告字节。”。

2 个答案:

答案 0 :(得分: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函数。

答案 1 :(得分:2)

就我所读到的而言,他们的榜样似乎很好。在这些情况下,uint8_t [64]变量或uint8_t *变量在传递给IOHIDDeviceSetReport时都将被解释为指向uint8_t的指针。

我现在在受限制的网络上,所以我无法继续提供帮助。但是我稍后会在家里尝试更多地阅读这个内容,因为我也有一个相关的项目。如果我发现任何可以帮助我们的事情,我会回到这里谈谈它。