Basic backlight support for MacBook Pro

I 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;
}

4 Responses to “Basic backlight support for MacBook Pro”

  1. [...] On 11/5/06, Felipe Alfaro Solana wrote: > On 10/4/06, Artur Boicu wrote: > > Dear friends, > > How cand I install Ubuntu on my Mac. It asks me to set up a partition > > called Yaboot. > > Could you give me a step by step instructions? > > Maybe these posts I wrote some time ago may help you: > > http://felipe-alfaro.org/blog/2006/08/19/installing-ubuntu-linux-on-a-macbook-pro/ > http://felipe-alfaro.org/blog/2006/09/19/installing-refit-on-the-hidden-efi-system-partition/ > http://felipe-alfaro.org/blog/2006/09/11/basic-backlight-support-for-macbook-pro/ > http://felipe-alfaro.org/blog/2006/09/11/modifying-screen-brightness-on-ac-state-changes/ > [...]

  2. Thank you, this works great on iMac version “5,1″ as well (also known as “Late 2006″).

  3. 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 !

  4. 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

Leave a Reply