标签: iokit

OS X(C)接口的MAC地址

这可能是一个愚蠢的问题,如果它已经在这里得到解决,我道歉,但我搜索得相当多,没有太多运气.我正在尝试用C语言获取接口的硬件地址,而我正在使用OS X(x86-64).我知道如何使用它ifconfig,但我希望我的程序能够自动获取任何计算机,至少OS X计算机.我发现另一个帖子发布了这个链接,几乎可以做我想要的(经过一些修改),但是我不能把iokit函数链接进去ld(我的编译器是gcc).我尝试添加标志-lIOKit,并-framework IOKitgcc命令行,但我仍然得到同样的链接错误.这是我的代码的链接:标题来源.

c macos ethernet interface iokit

7
推荐指数
1
解决办法
3458
查看次数

libusb是Mac OS X上访问USB设备的首选方法吗?

libusb是目前在OS X上通过USB(使用AT命令)与设备通信的首选方法吗?

可可有高水平的等价物吗?

macos usb cocoa usbserial iokit

6
推荐指数
1
解决办法
2964
查看次数

帮助为OS X编写DVB驱动程序

我正在寻找在OS X上访问DVB数据的选项.最初我想支持EyeTV DTT USB设备,但从长远来看,我想支持一些流行的设备.我遇到的问题是没有标准的方法来控制这些设备.

我所知道的所有应用程序都使用它们隐藏应用程序中的驱动程序代码(例如EyeTV本身,它的所有驱动程序完全在用户空间中实现,外部应用程序无法访问),或者它们使用看似def def的MMInputFamily驱动程序(否)源代码可用,作者走了).

我做了一些研究,发现Linux DVB项目支持我想支持的许多设备.进一步的研究表明,几年前曾尝试抽象linux实现,以便可能在其他平台上重新编译.我们的想法是支持设备的努力应该合并,最好的方法是使当前的开源实现在多个平台上运行:但最终似乎总是很少.

针对其他*nix类型平台编译Linux驱动程序的想法也已在其他地方取得了一些成功.作者采用的方法在我链接的页面上详细说明,它似乎也可能在OS X上可行.

无论如何,似乎有很多选择,但没有明显的赢家:

  • 找到MMInputFamily驱动程序的源代码,尝试使其在OS X 10.6上运行并添加对我需要的设备的支持,引用linux源代码以获取指针.问题:源代码无处可寻,作者也未找到.此外,如果他完全赞赏以前将Linux驱动程序移植到OS X的努力,那么作者似乎可能已经走下了另一条路线.
  • 尝试以类似于我链接的FreeBSD项目的方式将Linux驱动程序移植到OS X. 问题:这是非常低级别的工作,如果可以避免,Apple 不建议在此层工作.
  • 使用OS X的IOKit编写驱动程序:这是实现驱动程序的首选方法,但我必须从头开始做一切,显然不是一个小工作.

如果可以,我真的想使用Linux源代码,但我不确定这样的事情是否真的可行.有没有人对继续完成这项任务的最佳方式有任何建议或想法?

macos driver iokit linux-kernel

6
推荐指数
0
解决办法
1380
查看次数

用户空间中Mac OS X上的游戏手柄和操纵杆支持

我一直在搜索如何在Mac上运行游戏手柄和操纵杆支持,我找到的所有资源似乎都建议使用预装的驱动程序以及使用Apple的HID API.

这种方法的缺点是每个操纵杆和游戏手柄都需要加载另一个内核扩展,因此HID管理器可以识别它,或者至少一个代码Info.plist表示它符合早期安装的驱动程序.例如,当我在内部拥有一个360 Xbox驱动程序KEXT时,来自Microsoft的Xbox控制器可以工作,但不是Logitech(我试过F710).

正如Apple建议使用游戏手柄或操纵杆的应用程序应该能够在用户空间自行完成,而不会引入任何KEXT内容.有办法吗?

我想到的就是使用IORegistry或IOUSB API来获取设备(USB Prober至少显示它).然后以某种方式获取设备的描述,然后使用该描述将设备注册为HID.然后可以使用整个HID管理器.

我是在正确的轨道上吗?或者还有其他方法吗?

由于IOKit API实际上提供了像kHIDUsage_GD_Joystick这样的关键字,并且有一个ForceFeedback.h库,我想Apple设计了他们的HID API时考虑了操纵杆和力反馈.这是我可能有用的渺茫希望.

一些参考文档和开源项目:

macos iokit hid joystick

6
推荐指数
1
解决办法
4047
查看次数

无法在OS X中开始使用kext开发

我正在尝试做Apple的"内核扩展"教程.我创建了一个项目文件,创建了Info.plist,构建了它,使用kextlibs来学习依赖关系,将它们添加到Info.plist中,重建,复制到/ tmp,使用kextutil来测试它.到目前为止一切都很好.但是,当我尝试加载kext时,我的启动/停止/探测功能似乎永远不会被调用.我的IOLog消息没有出现在/var/log/system.log中.

实际上,system.log没有显示任何内容.在使用sysctl -w debug.kextlog = 0x0007780E激活kext日志记录后,kernel.log执行了.kernel.log说:"Kext ch.digorydoo.driver.XinputDevice成功解决了依赖关系." 然后:"刷新未加载的kexts和其他未使用的数据." 也许我的班级会立刻变得脸红?

我的类出现在kextstat的末尾,但有0个引用.与ioclasscount相同.在ioreg,我的班级没有出现.

我已经将IOProviderClass设置为IOResources,所以它应该始终有一个引用,对吧?我已正确设置IOMatchCategory.

有什么帮助吗?!!?!非常感谢!

编辑:这是我的Info.plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>CFBundleDevelopmentRegion</key>
    <string>English</string>
    <key>CFBundleExecutable</key>
    <string>${EXECUTABLE_NAME}</string>
    <key>CFBundleName</key>
    <string>${PRODUCT_NAME}</string>
    <key>CFBundleIconFile</key>
    <string></string>
    <key>CFBundleIdentifier</key>
    <string>ch.digorydoo.driver.${PRODUCT_NAME:rfc1034identifier}</string>
    <key>CFBundleInfoDictionaryVersion</key>
    <string>6.0</string>
    <key>CFBundlePackageType</key>
    <string>KEXT</string>
    <key>CFBundleSignature</key>
    <string>????</string>
    <key>CFBundleVersion</key>
    <string>1.0.0</string>
    <key>IOKitPersonalities</key>
    <dict>
        <key>Generic Xinput Gamepad</key>
        <dict>
            <key>CFBundleIdentifier</key>
            <string>ch.digorydoo.driver.${PRODUCT_NAME:rfc1034identifier}</string>
            <key>IOProviderClass</key>
            <string>IOResources</string>
            <key>IOMatchCategory</key>
            <string>ch_digorydoo_driver_XinputDevice</string>
            <key>IOClass</key>
            <string>ch_digorydoo_driver_XinputDevice</string>
            <key>IOKitDebug</key>
            <integer>65535</integer>
        </dict>
    </dict>
    <key>OSBundleLibraries</key>
    <dict>
        <key>com.apple.kpi.iokit</key>
        <string>10.8</string>
        <key>com.apple.kpi.libkern</key>
        <string>10.8</string>
        <key>com.apple.kpi.mach</key>
        <string>10.8</string>
    </dict>
</dict>
</plist>
Run Code Online (Sandbox Code Playgroud)

macos kernel iokit kernel-extension

6
推荐指数
1
解决办法
2852
查看次数

各种 kIOPMAssertionType 之间的差异

kIOPMAssertionTypeNoIdleSleep,kIOPMAssertionTypePreventSystemSleep和有什么区别kIOPMAssertionTypePreventUserIdleSystemSleep

我正在尝试创建一个IOPMAssertion可以防止 mac 自动进入睡眠状态的程序,但我真的不知道应该使用哪一个。我对他们的描述感到困惑,无法理解它们(请参阅文档

如果您好奇,这就是我在代码中执行此操作的方式:

IOReturn success = IOPMAssertionCreateWithName(kIOPMAssertionTypeNoIdleSleep, kIOPMAssertionLevelOn, CFSTR("My app is running"), &preventSleepAssertionID);

if (success != kIOReturnSuccess) {
    NSLog(@"Could not create sleep prevention assertion");
}
Run Code Online (Sandbox Code Playgroud)

objective-c iokit power-management

6
推荐指数
1
解决办法
838
查看次数

沙盒中不允许使用 IOKit?

我是使用 IOKit 的新手,并注意到我认为是沙箱导致它失败。

这是我正在尝试的测试(在 Pascal 中),它在沙箱外运行良好,但是当我启用它时,IOServiceOpen 每次都会返回错误 kIOReturnNotPermitted。

对于某些服务,IOKit 在沙箱中不安全吗?我试图获得一些风扇速度/cpu 温度,我看到 AppStore(沙盒)中有一些应用程序这样做,所以我相信这是可能的。我唯一能确认的似乎有一个与应用程序捆绑在一起的 XPC 服务作为助手,所以也许这是使 IOKit 工作的线索?我基本上尝试了所有的权利,但似乎没有一个对任何人有帮助。

感谢您的任何想法。

procedure TestIOKit;
var
    err: kern_return_t;
    masterPort: mach_port_t;
    iterator: io_iterator_t;
    device: io_object_t;
    matchingDictionary: CFMutableDictionaryRef;
    conn: io_connect_t;
begin
    IOMasterPort(0, masterPort);
    matchingDictionary := IOServiceMatching('AppleSMC');
    err := IOServiceGetMatchingServices(masterPort, matchingDictionary, iterator);
    if err <> kIOReturnSuccess then
        writeln('IOServiceGetMatchingServices: ', err);

    device := IOIteratorNext(iterator);
    IOObjectRelease(iterator);
  if device = 0 then
        writeln('no smc found');

    err := IOServiceOpen(device, mach_task_self_, 0, conn);
  if err <> kIOReturnSuccess then
        writeln('IOServiceOpen: ', err);
end;
Run Code Online (Sandbox Code Playgroud)

macos iokit appstore-sandbox

6
推荐指数
1
解决办法
2620
查看次数

使用IOKit与USB设备通信

我正在尝试制作一个与 USB 设备通信的应用程序,其方式与我screen在终端上使用该命令的方式相同。

为了让我的问题更容易理解,这就是我通常在终端中所做的:

命令 :

ls /dev/tty.usb*
Run Code Online (Sandbox Code Playgroud)

返回:

/dev/tty.usbmodem1411   /dev/tty.usbmodem1451
Run Code Online (Sandbox Code Playgroud)

接下来,我打电话:

screen /dev/tty.usbmodem1411
Run Code Online (Sandbox Code Playgroud)

在此之后,我可以向设备发送命令(例如输入“U”,获得响应)

我现在正在尝试从 Xcode 执行此操作。

使用 IOKit,我设法执行了相当于第一个返回 USB 端口列表的命令:

/dev/tty.usbmodem1411   /dev/tty.usbmodem1451
Run Code Online (Sandbox Code Playgroud)

这是代码:

@IBAction func testPressed(sender: AnyObject) {

        var portIterator: io_iterator_t = 0
        let kernResult = findSerialDevices(kIOSerialBSDModemType, serialPortIterator: &portIterator)
        if kernResult == KERN_SUCCESS {
            printSerialPaths(portIterator)
        }

    }

    func findSerialDevices(deviceType: String, inout serialPortIterator: io_iterator_t ) -> kern_return_t {
        var result: kern_return_t = KERN_FAILURE
        var classesToMatch = IOServiceMatching(kIOSerialBSDServiceValue).takeUnretainedValue()
        var classesToMatchDict = (classesToMatch as NSDictionary) as Dictionary<String, AnyObject>
        classesToMatchDict[kIOSerialBSDTypeKey] …
Run Code Online (Sandbox Code Playgroud)

macos cocoa serial-port iokit swift

6
推荐指数
1
解决办法
9425
查看次数

IOCreatePlugInInterfaceForService 返回神秘错误

我正在尝试在新的 Swift 4.0 Mac 应用程序(不是 iOS)中使用一些旧的 IOKit 功能。我创建了一个桥接头来使用现有的 Objective C 第三方框架 DDHidLib,我目前在 Xcode 9 中工作。

尝试为 USB 游戏手柄创建插件接口的代码在 IOCreatePlugInInterfaceForService 上失败,返回非零错误。

真正奇怪的是我在以前版本的 Xcode 中创建了一个旧的应用程序,它使用相同的框架,并且在新的 Xcode 9 中打开后可以正常工作。 这个以前的项目仍然是 Swift,使用相同 Obj-C 框架的桥接头. 我检查了构建设置并尝试使所有内容匹配,但得到相同的结果;旧应用程序有效,但任何新应用程序都无效。

有没有办法:找出构建设置/编译器中的确切差异以查看难以捉摸的差异,或者进入 IOCreatePlugInInterfaceForService IOKit 方法以查看可能导致错误在一个项目中返回但不是其他?

编辑:这是失败的方法:

- (BOOL) createDeviceInterfaceWithError: (NSError **) error_; {
io_name_t className;
IOCFPlugInInterface ** plugInInterface = NULL;
SInt32 score = 0;
NSError * error = nil;
BOOL result = NO;

mDeviceInterface = NULL;

NSXReturnError(IOObjectGetClass(mHidDevice, className));
if (error)
    goto done;

NSXReturnError(IOCreatePlugInInterfaceForService(mHidDevice, kIOHIDDeviceUserClientTypeID,kIOCFPlugInInterfaceID,&plugInInterface,&score));
if (error)
    goto done;

//Call a …
Run Code Online (Sandbox Code Playgroud)

macos usb xcode iokit swift

6
推荐指数
1
解决办法
4303
查看次数

热插拔后 IOServiceGetMatchingServices() 返回 nil hid 迭代器

我正在维护一个用于访问 USB 设备的库,该库将自身注册为 HID 设备,并使 Mac 应用程序能够执行各种漂亮的操作(GPIO、I2C 等)。该库可以在这里找到:

https://github.com/codemercs-com/io-warrior-mac

由于我将项目升级到 MacOS 10.13 SDK,IOServiceGetMatchingServices() 在从回调调用时返回 nil 迭代器对象DeviceAdded,但不返回错误代码。

我的假设是,自从我在 2002 年左右最初编写这个库以来,IOKit 中的某些内容已经发生了根本性的变化。

我正在注册我的“设备插入”回调,如下所示:

 result = IOServiceAddMatchingNotification(gNotifyPort,
                                          kIOFirstMatchNotification, matchingDict,
                                          IOWarriorAdded, NULL, &gIOWarriorAddedIter);
Run Code Online (Sandbox Code Playgroud)

来源

当插入受支持的设备时,确实会调用此回调,但是当我随后调用 IOServiceGetMatchingServices 时,迭代器为零,或者,当其他设备已连接时,仅包含这些设备,而不包含新插入的设备。

io_iterator_t IOWarriorFindHIDDevices ()
{
    CFMutableDictionaryRef hidMatchDictionary = IOWarriorSetUpHIDMatchingDictionary ();

    // Set up matching dictionary to search the I/O Registry for HID devices we are interested in. Dictionary reference is NULL if error.
    if (NULL == hidMatchDictionary) {
        PrintErrMsg ("Couldn't create a matching dictionary.");
        return 0; …
Run Code Online (Sandbox Code Playgroud)

macos iokit

5
推荐指数
0
解决办法
1656
查看次数