Skip to content

Instantly share code, notes, and snippets.

@dguerri
Last active July 2, 2021 09:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dguerri/c97f8213ce7a7e0fc723935ab86bd3a0 to your computer and use it in GitHub Desktop.
Save dguerri/c97f8213ce7a7e0fc723935ab86bd3a0 to your computer and use it in GitHub Desktop.
/******************************************************************************************************
DISCLAIMER: I am not responsible of any damage caused by running this script, use it at your own risk!
*******************************************************************************************************/
@import Darwin;
@import Foundation;
@import IOKit;
// clang -fmodules -o ddc-test ddc-test.m && ./ddc-test 50 0
typedef CFTypeRef IOAVServiceRef;
extern IOAVServiceRef IOAVServiceCreate(CFAllocatorRef allocator);
extern IOReturn IOAVServiceReadI2C(IOAVServiceRef service, uint32_t chipAddress, uint32_t offset, void* outputBuffer,
uint32_t outputBufferSize);
extern IOReturn IOAVServiceWriteI2C(IOAVServiceRef service, uint32_t chipAddress, uint32_t dataAddress, void* inputBuffer,
uint32_t inputBufferSize);
#define BRIGHTNESS 0x10
#define CONTRAST 0x12
#define AUDIO_SPEAKER_VOLUME 0x62
#define AUDIO_MUTE 0x8D
int main(int argc, char** argv) {
IOReturn err;
IOAVServiceRef avService = IOAVServiceCreate(kCFAllocatorDefault);
if (!avService) {
NSLog(@"Can't open IOAVService: do you have an external monitor?");
return 1;
}
char data[16];
data[0] = 0x84;
data[1] = 0x03;
data[3] = 0x00;
if (argc < 2 || argc > 3) {
NSLog(@"Syntax %s <brightness 0-100> <volume 0-100>", argv[0]);
return 1;
}
if (argc >= 2) {
usleep(30000);
data[2] = BRIGHTNESS;
data[4] = atoi(argv[1]);
data[5] = 0x6E ^ 0x51 ^ data[0] ^ data[1] ^ data[2] ^ data[3] ^ data[4];
err = IOAVServiceWriteI2C(avService, 0x37, 0x51, data, 6);
if (err) {
NSLog(@"Something went wrong");
return 1;
}
}
if (argc == 3) {
usleep(30000);
data[2] = AUDIO_SPEAKER_VOLUME;
data[4] = atoi(argv[2]);
data[5] = 0x6E ^ 0x51 ^ data[0] ^ data[1] ^ data[2] ^ data[3] ^ data[4];
err = IOAVServiceWriteI2C(avService, 0x37, 0x51, data, 6);
if (err) {
NSLog(@"Something went wrong");
return 1;
}
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment