Basic backlight support for MacBook Pro
8 Comments Published by Felipe Alfaro Solana September 11th, 2006 in Apple, Hardware, Linux, Power managementI made some modifications to the original bl1.c program from Nicolas Boichat. In summary, this modifications allow:
Specify an absolute brightness value
Let x be the absolute brightness value, such that 0<x<16, that is, the value must between 1 and 15, where 1 is the minimum brightness level before turning off the screen, and 15 is the maximum brightness supported by the LCD screen.
For example:
./bl1 15
./bl1 1
Specify an increment or decrement (delta)
Let d be the delta, and x the current brightness value, then the new brightness value y is y=x+d, and 0<y<16.
y = min(max(1, x + d), 15)
Source code
/*
* Apple Macbook Pro LCD backlight control
*
* Copyright (C) 2006 Nicolas Boichat <nicolas @boichat.ch>
* Copyright (C) 2006 Felipe Alfaro Solana <felipe_alfaro @linuxmail.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
*/
#include <stdio .h>
#include <sys /io.h>
#include <stdlib .h>
void init()
{
if (ioperm(0xB2, 0xB3, 1) < 0)
{
perror("ioperm failed (you should be root).");
exit(2);
}
}
int get_current_value()
{
outb(0x03, 0xB3);
outb(0xBF, 0xB2);
char t = inb(0xB3) >> 4;
return t;
}
int calculate_new_value(const char *arg)
{
int val, new = atoi(arg);
if (arg[0] == '+' || arg[0] == '-')
val = new + get_current_value();
else
val = new;
if (val > 15)
val = 15;
else if (val < 1)
val = 1;
return val;
}
int main(int argc, char** argv)
{
if (argc > 2)
{
printf("Usage:\n");
printf("%s : read current value\n", argv[0]);
printf("%s value : write value [0-15]\n", argv[0]);
exit(1);
}
init();
if (argc < 2)
{
printf("Current value : %d\n", get_current_value());
exit(0);
}
if (argc == 2)
{
int value = calculate_new_value(argv[1]);
outb(0x04 | (value << 4), 0xB3);
outb(0xBF, 0xB2);
printf("new value: %d\n", value);
}
return 0;
}
8 Comments to “Basic backlight support for MacBook Pro”
- 1 Pingback on Nov 5th, 2006 at 22:46
- 2 Pingback on Feb 27th, 2009 at 02:04
Thank you, this works great on iMac version “5,1″ as well (also known as “Late 2006″).
i’m looking for a toll like that but i’m newbie… i’ve got an iMac Alu (mid 2007) 20″ with ATI HD2400Pro.
How to make bli.c work on my computer (i’m under Ubuntu Gusty – Studio version)
Reply at : bouboulabulle[at]caramail.com
Thx !
Hi. I could not get your source file to compile. I fixed one error — extra spaces in the include files. But there must be other errors that I don’t understand. Fortunately, I found a pre-compiled binary on another Ubuntu page. You were credited with program.
Here are the errors:
backlight.increment.c: In function ‘calculate_new_value’:
backlight.increment.c:48: error: stray ‘\342’ in program
backlight.increment.c:48: error: stray ‘\200’ in program
backlight.increment.c:48: error: stray ‘\230’ in program
backlight.increment.c:48: error: stray ‘\342’ in program
backlight.increment.c:48: error: stray ‘\200’ in program
backlight.increment.c:48: error: stray ‘\231’ in program
backlight.increment.c:48: error: expected expression before ‘||’ token
backlight.increment.c:48: error: stray ‘\342’ in program
backlight.increment.c:48: error: stray ‘\200’ in program
backlight.increment.c:48: error: stray ‘\230’ in program
backlight.increment.c:48: error: stray ‘\342’ in program
backlight.increment.c:48: error: stray ‘\200’ in program
backlight.increment.c:48: error: stray ‘\231’ in program
backlight.increment.c: In function ‘main’:
backlight.increment.c:65: error: stray ‘\342’ in program
backlight.increment.c:65: error: stray ‘\200’ in program
backlight.increment.c:65: error: stray ‘\235’ in program
backlight.increment.c:65: error: ‘Usage’ undeclared (first use in this function)
backlight.increment.c:65: error: (Each undeclared identifier is reported only once
backlight.increment.c:65: error: for each function it appears in.)
backlight.increment.c:65: error: expected ‘)’ before ‘:’ token
backlight.increment.c:65: error: stray ‘\’ in program
backlight.increment.c:65: error: stray ‘\342’ in program
backlight.increment.c:65: error: stray ‘\200’ in program
backlight.increment.c:65: error: stray ‘\235’ in program
backlight.increment.c:66: error: stray ‘\342’ in program
backlight.increment.c:66: error: stray ‘\200’ in program
backlight.increment.c:66: error: stray ‘\235’ in program
backlight.increment.c:66: error: expected expression before ‘%’ token
backlight.increment.c:66: error: stray ‘\’ in program
backlight.increment.c:66: error: stray ‘\342’ in program
backlight.increment.c:66: error: stray ‘\200’ in program
backlight.increment.c:66: error: stray ‘\235’ in program
backlight.increment.c:67: error: stray ‘\342’ in program
backlight.increment.c:67: error: stray ‘\200’ in program
backlight.increment.c:67: error: stray ‘\235’ in program
backlight.increment.c:67: error: expected expression before ‘%’ token
backlight.increment.c:67: error: stray ‘\’ in program
backlight.increment.c:67: error: stray ‘\342’ in program
backlight.increment.c:67: error: stray ‘\200’ in program
backlight.increment.c:67: error: stray ‘\235’ in program
backlight.increment.c:75: error: stray ‘\342’ in program
backlight.increment.c:75: error: stray ‘\200’ in program
backlight.increment.c:75: error: stray ‘\235’ in program
backlight.increment.c:75: error: ‘Current’ undeclared (first use in this function)
backlight.increment.c:75: error: expected ‘)’ before ‘value’
backlight.increment.c:75: error: stray ‘\’ in program
backlight.increment.c:75: error: stray ‘\342’ in program
backlight.increment.c:75: error: stray ‘\200’ in program
backlight.increment.c:75: error: stray ‘\235’ in program
backlight.increment.c:82: error: stray ‘\303’ in program
backlight.increment.c:82: error: stray ‘\227’ in program
backlight.increment.c:82: error: expected ‘)’ before numeric constant
backlight.increment.c:82: error: too few arguments to function ‘outb’
backlight.increment.c:84: error: stray ‘\342’ in program
backlight.increment.c:84: error: stray ‘\200’ in program
backlight.increment.c:84: error: stray ‘\235’ in program
backlight.increment.c:84: error: ‘new’ undeclared (first use in this function)
backlight.increment.c:84: error: expected ‘)’ before ‘value’
backlight.increment.c:84: error: stray ‘\’ in program
backlight.increment.c:84: error: stray ‘\342’ in program
backlight.increment.c:84: error: stray ‘\200’ in program
backlight.increment.c:84: error: stray ‘\235’ in program
Some compilers (e.g Linux) don’t support back quotes, so you need to review your code and replace any such with quotes you type yourself, particularly if you copied your code from some place.
i.e instead of ” ’n’ ” you should enter ” ‘n’ “
Umm – the back quotes in my example haven’t come out clearly in my posted reply, but I hope you caught my gist
.
Alternatively make sure any double quotes in your program are really double quotes and not read as two adjacent single quotes.
hey can somebody help me set this up i am a complete newbie w/ linux and i am using it on an intel mac but the brightness is KILLING MY EYES. thanks