diff -ur pbbuttons-0.4/pbbserver/backlight.c pbbuttons-0.4-colin/pbbserver/backlight.c --- pbbuttons-0.4/pbbserver/backlight.c Thu Feb 21 22:57:27 2002 +++ pbbuttons-0.4-colin/pbbserver/backlight.c Wed Jul 10 17:34:40 2002 @@ -27,18 +27,18 @@ ioctl(fd, PMU_IOC_GRAB_BACKLIGHT, 0); } -int set_backlight_level(int fd, int op) +int set_backlight_level(int fd_pmu, int fd_fb, int op) { int level = 0; - - if (ioctl(fd, PMU_IOC_GET_BACKLIGHT, &level) >= 0) { + + if (ioctl(fd_pmu, PMU_IOC_GET_BACKLIGHT, &level) >= 0) { switch (op) { case OP_BRIGHTNESS_UP: if (level < BACKLIGHT_MAX) level++; break; case OP_BRIGHTNESS_DOWN: - if (level > BACKLIGHT_OFF) + if (level >= BACKLIGHT_OFF) level--; break; case OP_BRIGHTNESS_MIN: @@ -47,8 +47,14 @@ case OP_BRIGHTNESS_MAX: level = BACKLIGHT_MAX; } - if (ioctl(fd, PMU_IOC_SET_BACKLIGHT, &level) >= 0) - return level; + if(level == -1) { + ioctl(fd_fb, FBIOBLANK, 1); + } + else { + ioctl(fd_fb, FBIOBLANK, 0); + if (ioctl(fd_pmu, PMU_IOC_SET_BACKLIGHT, &level) >= 0) + return level; + } } return -1; } diff -ur pbbuttons-0.4/pbbserver/backlight.h pbbuttons-0.4-colin/pbbserver/backlight.h --- pbbuttons-0.4/pbbserver/backlight.h Thu Feb 21 22:53:47 2002 +++ pbbuttons-0.4-colin/pbbserver/backlight.h Wed Jul 10 17:27:13 2002 @@ -27,8 +27,13 @@ #define PMU_IOC_GRAB_BACKLIGHT _IOR('B', 6, 0) #endif +#ifndef FBIOBLANK +#define FBIOBLANK 0x4611 /* 0 or vesa-level+1 */ +#endif + /* prototypes */ void init_backlight(int fd); /* switch backlight control to user space */ -int set_backlight_level(int fd, int op); /* set backlight level according OP */ +int set_backlight_level(int fd_pmu, int fd_fb, int op); /* set backlight level according OP */ + #endif /* INCLUDE_BACKLIGHT_H */ diff -ur pbbuttons-0.4/pbbserver/errorcodes.h pbbuttons-0.4-colin/pbbserver/errorcodes.h --- pbbuttons-0.4/pbbserver/errorcodes.h Mon Feb 25 16:26:02 2002 +++ pbbuttons-0.4-colin/pbbserver/errorcodes.h Wed Jul 10 17:18:22 2002 @@ -15,6 +15,7 @@ /* errorcodes */ #define ERR_OK 0 #define ERR_NOPMU -1 +#define ERR_NOFB -18 #define ERR_NOMIXER -2 #define ERR_NOKEYBEVENT -3 #define ERR_NOBUTTONEVENT -4 diff -ur pbbuttons-0.4/pbbserver/event.c pbbuttons-0.4-colin/pbbserver/event.c --- pbbuttons-0.4/pbbserver/event.c Mon Feb 25 21:08:18 2002 +++ pbbuttons-0.4-colin/pbbserver/event.c Wed Jul 10 17:28:48 2002 @@ -90,15 +90,15 @@ if (value) { if (code == md->keybrightup) { if (mod) - level = set_backlight_level(md->fd_pmu, OP_BRIGHTNESS_MAX); + level = set_backlight_level(md->fd_pmu, md->fd_fb, OP_BRIGHTNESS_MAX); else - level = set_backlight_level(md->fd_pmu, OP_BRIGHTNESS_UP); + level = set_backlight_level(md->fd_pmu, md->fd_fb, OP_BRIGHTNESS_UP); distribute_to_clients(&md->mp_data, DISPLAYBRIGHTNESS, level); } else if (code == md->keybrightdn) { if (mod) - level = set_backlight_level(md->fd_pmu, OP_BRIGHTNESS_MIN); + level = set_backlight_level(md->fd_pmu, md->fd_fb, OP_BRIGHTNESS_MIN); else - level = set_backlight_level(md->fd_pmu, OP_BRIGHTNESS_DOWN); + level = set_backlight_level(md->fd_pmu, md->fd_fb, OP_BRIGHTNESS_DOWN); distribute_to_clients(&md->mp_data, DISPLAYBRIGHTNESS, level); } else if (code == md->keyvolup) { volume = increment_master_volume(&md->sd_data, mod ? +10 : +1); diff -ur pbbuttons-0.4/pbbserver/init.c pbbuttons-0.4-colin/pbbserver/init.c --- pbbuttons-0.4/pbbserver/init.c Tue Feb 26 09:36:46 2002 +++ pbbuttons-0.4-colin/pbbserver/init.c Wed Jul 10 17:23:16 2002 @@ -59,6 +59,12 @@ } else init_backlight(md->fd_pmu); + if ((md->fd_fb = open(md->fbdev, O_RDWR)) <= 0) { /* open FB device */ + md->lasterrno = errno; + return ERR_NOFB; + } else + init_backlight(md->fd_pmu); + if ((md->fd_keybev = open_eventdev(0x0200, 0x0f00)) == -1) return ERR_NOKEYBEVENT; @@ -108,6 +114,9 @@ case ERR_NOPMU: fprintf(stderr, _("ERROR: Can't open pmu [%s]: %s\n"), md->pmudev, strerror(md->lasterrno)); break; + case ERR_NOFB: + fprintf(stderr, _("ERROR: Can't open fb [%s]: %s\n"), md->fbdev, strerror(md->lasterrno)); + break; case ERR_NOMIXER: fprintf(stderr, _("ERROR: Can't open mixer [%s]: %s\n"), md->mixerdev, strerror(md->lasterrno)); break; @@ -137,6 +146,7 @@ " -%c, --version display version information and exit\n" " -%c, --detach start %s as background process\n" " -%c, --pmu=PMU use alternative pmu device [%s]\n" + " -%c, --fb=FB use alternative fb device [%s]\n" " -%c, --mixer=MIXER use alternative mixer device [%s]\n" " -%c, --cdrom=CDROM use alternative cdrom device [%s]\n" " -%c, --keybup=KEY use alternative keycode to increase brightness [%i]\n" @@ -145,8 +155,8 @@ " -%c, --keyvdn=KEY use alternative keycode to decrease volume [%i]\n" " -%c, --keymute=KEY use alternative keycode to mute/unmute [%i]\n" " -%c, --keyeject=KEY use alternative keycode to eject a CDROM [%i]\n"), - ARG_HELP, ARG_VERSION, ARG_DETACH, md->prgname, ARG_PMU, - DEFAULT_PMU, ARG_MIXER, DEFAULT_MIXER, ARG_CDROM, DEFAULT_CDROM, + ARG_HELP, ARG_VERSION, ARG_DETACH, md->prgname, ARG_PMU, + DEFAULT_PMU, ARG_FB, DEFAULT_FB, ARG_MIXER, DEFAULT_MIXER, ARG_CDROM, DEFAULT_CDROM, ARG_KEYBUP, KEY_BRIGHTNESSUP, ARG_KEYBDN, KEY_BRIGHTNESSDOWN, ARG_KEYVUP, KEY_VOLUMEUP, ARG_KEYVDN, KEY_VOLUMEDOWN, ARG_KEYMUTE, KEY_MUTE, ARG_KEYEJECT, KEY_EJECTCD); @@ -161,6 +171,8 @@ case ERR_NOTACHARDEVICE: if (md->errsource == md->pmudev) src = _("PMU"); + else if (md->errsource == md->fbdev) + src = _("FB"); else src = _("Mixer"); fprintf(stderr, _("ERROR: The given %s [%s] is not a character device.\n"), src, md->errsource); @@ -171,6 +183,7 @@ case ERR_PRINTSTATUS: printf(_("Status: %s\n" " PMU device: %s\n" + " FB device: %s\n" " Mixer device: %s\n" " CDROM device: %s\n" " Keycode for brightness up: %i\n" @@ -179,7 +192,7 @@ " Keycode for volume down: %i\n" " Keycode for mute: %i\n" " Keycode for eject CD: %i\n"), - md->prgname, md->pmudev, md->mixerdev, md->cdromdev, md->keybrightup, + md->prgname, md->pmudev, md->fbdev, md->mixerdev, md->cdromdev, md->keybrightup, md->keybrightdn, md->keyvolup, md->keyvoldn, md->keymute, md->keyejectcd); break; case ERR_FORKED: @@ -201,6 +214,7 @@ {"detach", no_argument, 0, ARG_DETACH}, {"status", no_argument, 0, ARG_STATUS}, /* only for debug purposes */ {"pmu", required_argument, 0, ARG_PMU}, + {"fb", required_argument, 0, ARG_FB}, {"mixer", required_argument, 0, ARG_MIXER}, {"cdrom", required_argument, 0, ARG_CDROM}, {"keybup", required_argument, 0, ARG_KEYBUP}, @@ -220,6 +234,7 @@ md->child = 0; md->pmudev = DEFAULT_PMU; + md->fbdev = DEFAULT_FB; md->mixerdev = DEFAULT_MIXER; md->cdromdev = DEFAULT_CDROM; md->keybrightup = KEY_BRIGHTNESSUP; @@ -240,6 +255,13 @@ case ARG_PMU: if((err = check_devorfile(md->pmudev = optarg, TYPE_CHARDEV))) { md->errsource = md->pmudev; + md->lasterrno = errno; + return err; + } + break; + case ARG_FB: + if((err = check_devorfile(md->fbdev = optarg, TYPE_CHARDEV))) { + md->errsource = md->fbdev; md->lasterrno = errno; return err; } diff -ur pbbuttons-0.4/pbbserver/init.h pbbuttons-0.4-colin/pbbserver/init.h --- pbbuttons-0.4/pbbserver/init.h Mon Feb 25 21:07:58 2002 +++ pbbuttons-0.4-colin/pbbserver/init.h Wed Jul 10 17:26:17 2002 @@ -39,6 +39,7 @@ #endif #define DEFAULT_PMU "/dev/pmu" +#define DEFAULT_FB "/dev/fb" #define DEFAULT_MIXER "/dev/mixer" #define DEFAULT_CDROM "/dev/cdrom" @@ -49,11 +50,12 @@ /* short options for optarg */ -#define ARG_ALL "hvsp:m:c:dB:C:V:W:M:E:" +#define ARG_ALL "hvspf:m:c:dB:C:V:W:M:E:" #define ARG_HELP 'h' #define ARG_VERSION 'v' #define ARG_STATUS 's' #define ARG_PMU 'p' +#define ARG_FB 'f' #define ARG_MIXER 'm' #define ARG_CDROM 'c' #define ARG_DETACH 'd' @@ -67,11 +69,13 @@ struct init { char *prgname; /* programname without any leading path */ char *pmudev; /* pathname of the PMU device */ + char *fbdev; /* pathname of the FB device */ char *mixerdev; /* pathname of the mixer device */ char *cdromdev; /* pathname of the cdrom device */ int fd_keybev; /* filehandle of the keyboard event device */ int fd_buttonev; /* filehandle of the button event device */ int fd_pmu; /* filehandle of the PMU device */ + int fd_fb; /* filehandle of the FB device */ struct msgport_data mp_data; /* definitions for IPC message handling */ struct sound_data sd_data; /* definitions for sound management */ unsigned short modifier; /* currently pressed modifier keys */