#include <sys/param.h>
#include <sys/device.h>
#include <sys/systm.h>
#include <sys/task.h>
#include <machine/bus.h>
#include <dev/ofw/openfirm.h>
#include <macppc/macppc/ofw_machdep.h>
#include <dev/adb/adb.h>
#include "audio.h"
#include "cd.h"
#include "wskbd.h"
#define ABTN_HANDLER_ID 31
struct abtn_softc {
struct device sc_dev;
int origaddr;
int adbaddr;
int handler_id;
};
int abtn_match(struct device *, void *, void *);
void abtn_attach(struct device *, struct device *, void *);
void abtn_adbcomplete(caddr_t, caddr_t, int);
#if NWSKBD > 0
extern int cd_eject(void);
#if NAUDIO > 0
extern int wskbd_set_mixervolume(long, long);
#endif
#endif
const struct cfattach abtn_ca = {
sizeof(struct abtn_softc), abtn_match, abtn_attach
};
struct cfdriver abtn_cd = {
NULL, "abtn", DV_DULL
};
struct task eject_task =
TASK_INITIALIZER((void (*)(void *))cd_eject, NULL);
int
abtn_match(struct device *parent, void *cf, void *aux)
{
struct adb_attach_args *aa = aux;
if (strcmp(aa->name, adb_device_name) != 0)
return (0);
if (aa->origaddr == ADBADDR_MISC &&
aa->handler_id == ABTN_HANDLER_ID)
return 1;
return 0;
}
void
abtn_attach(struct device *parent, struct device *self, void *aux)
{
struct abtn_softc *sc = (struct abtn_softc *)self;
struct adb_attach_args *aa = aux;
ADBSetInfoBlock adbinfo;
printf(": brightness/volume/eject buttons\n");
sc->origaddr = aa->origaddr;
sc->adbaddr = aa->adbaddr;
sc->handler_id = aa->handler_id;
adbinfo.siServiceRtPtr = (Ptr)abtn_adbcomplete;
adbinfo.siDataAreaAddr = (caddr_t)sc;
set_adb_info(&adbinfo, sc->adbaddr);
}
void
abtn_adbcomplete(caddr_t buffer, caddr_t data, int adb_command)
{
u_int cmd, brightness;
cmd = buffer[1];
switch (cmd) {
case 0x0a:
brightness = cons_brightness;
if (brightness == MAX_BRIGHTNESS)
brightness++;
brightness -= STEP_BRIGHTNESS;
of_setbrightness(brightness);
break;
case 0x09:
brightness = cons_brightness + STEP_BRIGHTNESS;
of_setbrightness(brightness);
break;
#if NAUDIO > 0 && NWSKBD > 0
case 0x08:
case 0x01:
wskbd_set_mixervolume(0, 1);
break;
case 0x07:
case 0x02:
wskbd_set_mixervolume(-1, 1);
break;
case 0x06:
case 0x03:
wskbd_set_mixervolume(1, 1);
break;
#endif
case 0x0c:
break;
#if NWSKBD > 0 && NCD > 0
case 0x0b:
task_add(systq, &eject_task);
break;
#endif
case 0x7f:
break;
default:
#ifdef DEBUG
if ((cmd & ~0x7f) == 0)
printf("unknown ADB button 0x%x\n", cmd);
#endif
break;
}
}