问题描述
我正在尝试使用 DDC 读取 Mac mini 外接显示器的亮度 我使用的是使用 HDMI 端口的戴尔 (D1918H)。
读取方法是这样的
IOI2CRequest request;
UInt8 reply_data[11] = {};
bool result = false;
UInt8 data[256];
for (int i = 1; i <= kMaxRequests; i++) {
bzero(&request,sizeof(request));
request.commFlags = 0;
request.sendAddress = 0x6E;
request.sendTransactionType = kIOI2CSimpleTransactionType;
request.sendBuffer = (vm_address_t) &data[0];
request.sendBytes = 5; //Dubios
data[0] = 0x51;
data[1] = 0x82; //Dubios - Number of packets
data[2] = 0x01; // We want to read this time
data[3] = (*p_read).control_id;
data[4] = 0x6E ^ data[0] ^ data[1] ^ data[2] ^ data[3];
request.replyAddress = 0x6f; //think this should be 6F
request.replyTransactionType = kIOI2CDDCciReplyTransactionType;
request.replyBuffer = (vm_address_t) &reply_data[0] ;
request.replyBytes = sizeof(reply_data);
request.minReplyDelay = 50 * 10000;
result = DisplayRequest(displayID,&request,displayUUIDByEDID);
result = (result && reply_data[0] == request.sendAddress && reply_data[2] == 0x2 && reply_data[4] == read->control_id && reply_data[10] == (request.replyAddress ^ request.replySubAddress ^ reply_data[1] ^ reply_data[2] ^ reply_data[3] ^ reply_data[4] ^ reply_data[5] ^ reply_data[6] ^ reply_data[7] ^ reply_data[8] ^ reply_data[9]));
printf("Data values %d and %d %f\n",reply_data[7],reply_data[9],(float) reply_data[9] / reply_data[7] );
if (result) { // checksum is ok
break;
}
if(request.result != KERN_SUCCESS)
DisplayRequestError(request.result);
// reset values and return 0,if data reading fails
if (i >= kMaxRequests) {
read->success = false;
read->max_value = 0;
read->current_value = 0;
printf("Data reading Failed after %d tries\n",i);
return 0;
}
usleep(400000); // 40msec -> See DDC/CI Vesa Standard - 4.4.1 Communication Error Recovery
printf("\n");
}
read->success = true;
read->max_value = reply_data[7];
read->current_value = reply_data[9];
printf("Success Reading values max value = %d current value = %d\n",read->max_value,read->current_value);
return result;
IOI2CConnectRef connect;
if (IOI2CInterfaceOpen(interface,kNilOptions,&connect) == KERN_SUCCESS) {
printf("Interface Opened\n");
result = (IOI2CSendRequest(connect,request) == KERN_SUCCESS);
}
result is returning KERN_SUCCESS but request->result is returning -536870206 kIOReturnBadArgument
and I am not getting the brightness value.
如果设置 request.replyTransactionType = kIOI2CSimpleTransactionType;不会有任何错误,但会为亮度当前值和最大值获取垃圾值或零。 kIOI2CDDCciReplyTransactionType 的参数是否有问题(支持)? 提前致谢。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)