使用 DDC

问题描述

我正在尝试使用 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 (将#修改为@)