如何在USBSerialDriverKit中设置IOTTYBaseName?调用SetProperties方法返回-301错误码求助
解决USBSerialDriverKit中设置kIOTTYBaseNameKey返回-301错误的问题
首先,你遇到的-301错误码对应kIOReturnInvalidProperty,意思是你尝试设置的属性要么不被支持,要么使用了错误的方式/时机来设置。你当前用super::SetProperties的方法行不通,原因有两个:
SetProperties方法的设计初衷是响应用户空间发起的属性修改请求,而不是驱动自身用来修改内部属性的API;kIOTTYBaseNameKey这个属性需要在TTY设备实例化之前就完成设置,通过SetProperties的时机太晚,而且该属性不支持这种方式修改。
正确的实现方式
你应该在驱动的Start或者Init阶段,直接通过IORegistryEntrySetCFProperty来设置这个属性,代码示例如下:
IOReturn YourUSBDriver::Start(IOService* provider) { IOReturn result = super::Start(provider); if (result != kIOReturnSuccess) { return result; } // 将你的TTY名称转换为CFStringRef(注意编码要正确) CFStringRef ttyBaseName = CFStringCreateWithCString( kCFAllocatorDefault, "my-custom-tty", kCFStringEncodingUTF8 ); if (ttyBaseName) { // 直接向注册表设置属性 result = this->IORegistryEntrySetCFProperty( CFSTR(kIOTTYBaseNameKey), ttyBaseName ); if (result == kIOReturnSuccess) { PL_OSLOG("Successfully set IOTTYBaseName"); } else { PL_OSLOG("Failed to set IOTTYBaseName, error code: %d", result); } CFRelease(ttyBaseName); // 记得释放CF对象,避免内存泄漏 } return result; }
额外注意事项
- 如果你用的是
OSString而不是CFStringRef,也可以用IORegistryEntrySetProperty方法,用法类似; - 要确保TTY名称符合系统规范,不要包含特殊字符,否则可能无法生成对应的
/dev/tty.*设备节点; - 这个属性必须在TTY驱动初始化完成前设置,所以
Start方法是最合适的时机,不要等到后续阶段再尝试设置。
内容的提问来源于stack exchange,提问作者曾勝億
相关产品推荐
相关产品推荐

