Skip to content

Instantly share code, notes, and snippets.

@dguerri
Created July 1, 2021 16:38
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/0bfc9a405b722fe9fe29698cfab0cb53 to your computer and use it in GitHub Desktop.
Save dguerri/0bfc9a405b722fe9fe29698cfab0cb53 to your computer and use it in GitHub Desktop.
stuff for M1 i2c
// clang -Wall -fmodules -framework Foundation i2c-rw.m -o ./i2c-rw && sudo ./i2c-rw
@import Darwin;
@import Foundation;
@import IOKit;
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
#define RW_SIZE 10
int main(int argc, char **argv) {
IOAVServiceRef avService = IOAVServiceCreate(kCFAllocatorDefault);
if (!avService) {
NSLog(@"Can't open IOAVService: do you have an external monitor? Are you "
@"root?");
return 1;
}
UInt8 data[RW_SIZE];
NSData *nsdata;
IOReturn err;
memset(data, 0, sizeof(data));
err = IOAVServiceReadI2C(avService, 0x37, 0x0, data, sizeof(data));
if (err) {
NSLog(@"Nope first i2c: %s", mach_error_string(err));
return 1;
}
nsdata = [NSData dataWithBytes:(const void *)data
length:(NSUInteger)sizeof(data)];
NSLog(@"First read from i2c: %@", nsdata);
usleep(30000);
data[0] = 0x51;
data[1] = 0x82;
data[2] = 0x01;
data[3] = BRIGHTNESS;
data[4] = 0x6e ^ data[0] ^ data[1] ^ data[2] ^ data[3];
uint32_t len = 5;
err = IOAVServiceWriteI2C(avService, 0x37, 0x1, data, len);
if (err) {
NSLog(@"Nope i2c: %s", mach_error_string(err));
return 1;
}
nsdata = [NSData dataWithBytes:(const void *)data length:(NSUInteger)len];
NSLog(@"Written to i2c: %@", nsdata);
usleep(30000);
memset(data, 0, sizeof(data));
err = IOAVServiceReadI2C(avService, 0x37, 0x0, data, sizeof(data));
if (err) {
NSLog(@"Nope first i2c: %s", mach_error_string(err));
return 1;
}
nsdata = [NSData dataWithBytes:(const void *)data
length:(NSUInteger)sizeof(data)];
NSLog(@"Second read from i2c: %@", nsdata);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment