/* build: gcc -O2 -Wall -W -Wno-unused-parameter -o set-backlight.o -c set-backlight.c gcc -o set-backlight set-backlight.o */ #define DSME_SET_DISPLAY_BRIGHTNESS 0x0289 #include #include #include #include #include int main( int argc, char *argv[] ){ int dsme_fd; unsigned level, is_n810 = 0; // get device model { FILE *fp; // code ported from advanced-backlight if((fp = fopen("/proc/component_version", "r")) != NULL){ char version; fseek(fp, sizeof(char)*15, 0); // The important character is the 16th in the file fread(&version, sizeof(char), 1, fp); fclose(fp); if(version == '4') is_n810 = 1; } } // get brightness level argument if(argc != 2){ fprintf(stderr, "Syntax: %s \n", argv[0]); return EXIT_FAILURE; } sscanf(argv[1], "%u", &level); if(level > 127) level = 127; if(level == 0 && !is_n810) level = 1; // open DSME socket struct sockaddr_un addr; dsme_fd = socket(PF_UNIX, SOCK_STREAM, 0); if(dsme_fd < 0){ fprintf(stderr, "can't open dsme socket\n"); return EXIT_FAILURE; } memset(&addr, 0, sizeof(addr)); addr.sun_family = AF_UNIX; strcpy(addr.sun_path, "/tmp/dsmesock"); if(connect(dsme_fd, (struct sockaddr *)&addr, sizeof(addr)) < 0){ close(dsme_fd); fprintf(stderr, "can't connect to dsme socket\n"); return EXIT_FAILURE; } // write brightness level to socket printf("setting brightness to %u\n", level); struct { unsigned len; unsigned type; unsigned arg; } message; message.len = sizeof(message); message.type = DSME_SET_DISPLAY_BRIGHTNESS; message.arg = ((unsigned)level * 2) + 1; send(dsme_fd, (void *)&message, sizeof(message), 0); // close DSME socket close(dsme_fd); return EXIT_SUCCESS; }