mac-rom/Drivers/Backlight/Register.c

519 lines
15 KiB
C

/*
File: register.c
Contains: Register control for backlight.
Written by: Andy Gong x6595
Copyright: © 1991-1993 by Apple Computer, Inc., all rights reserved.
Change History (most recent first):
<SM5> 12/13/93 PN Roll in KAOs and Horror changes to support Malcom and AJ
machines
<SM4> 2/11/93 CSS Update from Horror. Comments follow:
<H4> 6/30/92 ag Moved cpu depended initialization code to cpu.c file, and input
routines to input.c.
<H3> 5/7/92 ag Use new table record for min/max limits.
<H2> 4/24/92 ag return error from initialization.
<2> 3/23/92 JSM OSEvents.h is obsolete, use Events.h.
<1> 10/24/91 SAM/KSM Rolled in Regatta file.
Regatta Change History:
<8> 8/21/91 SAM Undid the last mod. Using GetKeys again.
<7> 8/19/91 SAM (ag) added a key repeat delay to the key processing stuff.
<6> 7/30/91 SAM (ag) removed special initialization code in set brightness,
changed type of pram value to int to allow for negative error
check.
<5> 7/18/91 SAM (ag) cleaned up initialization code.
<4> 6/30/91 SAM Merged from TERROR [<5>].
<3> 6/14/91 SAM (ag) added support in set level routine to handle passing in an
illegal value as a flag to indicated initialization. Changed low
power handling, get input and set output routines will key off
of power state.
<1> 5/15/91 SAM Split off from TERRORProj.
Terror Change History:
<5> 6/24/91 ag Changed init code to initialize to user value. Changed calling
structure for setting backlight. Changed lookup tables to byte
size elements.
<4> 6/10/91 ag Changed low power handling, get input and set output routines
will key off of power state.
<3> 5/10/91 ag added support in set level routine to handle passing in an
illegal value as a flag to indicated initialization.
<2> 4/23/91 ag cleaned up init code, moved initial code to main (backlight.c).
*/
#define PORTABLE_HW 0xFC0202
/*page*/
/************************************/
/*** INCLUDE FILES DECLARATIONS ***/
#include <SysEqu.h>
#include <types.h>
#include <traps.h>
#include <memory.h>
#include <Events.h>
#include <OSUtils.h>
#include <devices.h>
#include <errors.h>
#include <Shutdown.h>
#include <Stdlib.h>
#include "PowerMgr.h"
#include "backlight.h"
void SleepEntry();
// *** backlight stuff
#define ON_BIT 0x02 /* 0 = off, 1 = on*/
#define L_CS_BIT 0x20 /* 0 = select chip to accept data */
#define COUNTDN_BIT 0x40 /* 0 = down, 1 = up */
#define COUNT_BIT 0x80 /* 1 - 0 - 1 pulsed to count */
#define ALL_BITS COUNT_BIT + COUNTUP_BIT + L_CS_BIT
#define SELECT(backlightreg,value) value &= (~L_CS_BIT); *backlightreg = value
#define DESELECT(backlightreg,value) value |= L_CS_BIT ; *backlightreg = value
#define MAXSTROBECOUNT 256
#define MAXPOTVALUE 255 /* maximum value of digital pot */
#define MINPOTVALUE 0 /* maximum value of digital pot */
/* brightness boundaries */
#define kMaxBrightness 30 /* <5> maximum brightness */
#define kMinBrightness 0 /* minimum brightness */
#define REPEATTIME 5
#define REPEATTHRESHOLD 1
#define BACKLIGHT_ON true
#define BACKLIGHT_OFF false
#define SLEEPQELEMENTTYPE 16
// *** keyboard stuff
#define KEYDOWNTEST(keynum,map) (map[keynum >> 3] & (1 << (keynum % 8)))
#define KEYDOWNBYTETEST(bytenum,keymask,map) (map[bytenum] & keymask)
#define UPARROW 0x7E
#define DOWNARROW 0x7D
#define RIGHTARROW 0x7C
#define LEFTARROW 0x7B
#define BYTEMASK_7_CTL 0x88
#define BYTEMASK_7_OPT 0x44
#define BYTEMASK_7_SFT 0x11
typedef struct
{
long oldvector;
char keysActive;
char keymodifiers;
short unused;
} posteventtype, *posteventtypeptr;
extern setTableType PortableTbl5V;
int GetBacklightInfo(short mask, short shift);
void SaveBacklightInfo(short new,short mask, short shift);
TurnOnOff(Boolean on);
setNewKeys(int keycombo);
/*page
***************************************************************************************************
** Register control software **********************************************************************
***************************************************************************************************
*/
OSErr InitRegControls(driverGlobalPtr globalPtr)
{
int SetBrightness();
int KbdControl();
int RegisterClose();
unsigned int pramBrightness;
void ShutdownBacklight();
if (BACKLIGHTSIGREG & TABLE_5V) globalPtr->settingTable = &PortableTbl5V;
globalPtr->keycodes = GetPramKeyData();
pramBrightness = GetPramBrightness(); /* get pram setting */
setNewKeys(globalPtr->keycodes);
if (pramBrightness < 0) /* check for valid brightness value */
{
pramBrightness = globalPtr->settingTable->minimum+1; /* <H3> load default brightness */
SaveBrightness(globalPtr->settingTable->minimum+1); /* <H3> validate, as save new brightness */
};
globalPtr->userBrightness = globalPtr->settingTable->maximum; /* <H3> */
globalPtr->userBrightness = SetBrightness(globalPtr->settingTable->minimum,globalPtr); /* <H3> initialize pot */
globalPtr->userBrightness = SetBrightness(pramBrightness,globalPtr); /* set brightness level */
if (BACKLIGHTSIGREG == BACKLIGHTSIG_UPGRD)
{
globalPtr->sleepQelement.sleepQType = SLEEPQELEMENTTYPE;
globalPtr->sleepQelement.sleepQProc = (ProcPtr) SleepEntry;
SleepQInstall(&globalPtr->sleepQelement); /* install sleep task */
};
ShutDwnInstall( (ShutDwnProcPtr) ShutdownBacklight,sdRestartOrPower); /* install shutdown task */
return(noErr);
};
/*page
***************************************************************************************************
*
*
***************************************************************************************************
*/
void StrobeCount(char *backlightreg, int number, unsigned char value)
{
int index;
if (!number) return; /* return if no strobes */
value |= COUNT_BIT; /* start with count inactive */
for (index = (number << 1); index; index--) /* <15> write twice for each pulse <90/08/01>*/
{
value ^= COUNT_BIT; /* toggle count bit */
*backlightreg = value; /* write value */
}
};
/*page
***************************************************************************************************
*
*
***************************************************************************************************
*/
void ShutdownBacklight()
{
TurnOnOff(BACKLIGHT_OFF);
};
/*page
***************************************************************************************************
*
* This sleep task is necessary due to the fact CPU hardware changed the design of the board and
* power to the backlight is nolonger turned off by the hardware at sleep or shutdown (yuck!).
* Therefore software MUST turn off the backlight for now. ( 90/07/20 ag )
*
*
***************************************************************************************************
*/
void Sleep_Task(driverGlobalPtr globalPtr, int selector)
{
#define SLEEPQELEMENTTYPE 16
#define SLEEP_REQUEST 1
#define SLEEP_DEMAND 2
#define SLEEP_WAKEUP 3
#define SLEEP_REQ_ABORT 4
switch (selector)
{
case SLEEP_DEMAND:
globalPtr->vbl_ok = false;
TurnOnOff(BACKLIGHT_OFF);
break;
case SLEEP_WAKEUP:
if (globalPtr->userBrightness) TurnOnOff(BACKLIGHT_ON);
globalPtr->vbl_ok = true;
break;
case SLEEP_REQ_ABORT:
case SLEEP_REQUEST:
default:
break;
};
};
/*
***************************************************************************************************
*
*
***************************************************************************************************
*/
TurnOnOff(Boolean on)
{
unsigned char regvalue;
char *backlightreg;
Boolean onBitHigh;
backlightreg = (Ptr) PORTABLE_HW;
onBitHigh = (BACKLIGHTSIGREG & ON_HIGH);
regvalue = COUNT_BIT + L_CS_BIT; /* start with count and CS inactive */
if ((onBitHigh && on) || (!onBitHigh && !on))
regvalue |= ON_BIT; /* upgrade has opposite polarity */
*backlightreg = regvalue; /* write value */
};
/*page
***************************************************************************************************
*
*
***************************************************************************************************
*/
int SetBrightness(int new, driverGlobalPtr globalPtr)
{
unsigned char regvalue;
int strobes;
char *backlightreg;
char signature;
Boolean onBitHigh;
Boolean countDownBit;
int current;
unsigned char tablevalue;
Boolean initialize;
initialize = (globalPtr->userBrightness < 0);
PEG_TO_LIMITS(new, globalPtr->maximumTable[globalPtr->powerRange], globalPtr->settingTable->minimum); /* <H3> limit value to valid range */
current = (initialize)
? globalPtr->settingTable->minimum /* <H3> */
: globalPtr->userBrightness;
tablevalue = globalPtr->settingTable->table[new]; /* <H3> look up value from table */
if (!initialize && (tablevalue == globalPtr->lastHWSetting) )
return(new); /* nothing to do; 90/05/15 just turn on; 90/07/02 avoid touching */
/* setup control bits */
signature = BACKLIGHTSIGREG;
onBitHigh = (signature & ON_HIGH);
countDownBit = (signature & COUNT_DWNBIT);
backlightreg = (Ptr) PORTABLE_HW;
regvalue = COUNT_BIT + L_CS_BIT; /* start with count and CS inactive */
if ((onBitHigh && (new != globalPtr->settingTable->minimum)) || (!onBitHigh && (new == globalPtr->settingTable->minimum))) /* <H3> */
regvalue |= ON_BIT; /* upgrade has opposite polarity */
if ((countDownBit && (new <= current)) || (!countDownBit && (new >= current)))
regvalue |= COUNTDN_BIT; /* set the count down bit if new > current */
strobes = (new == globalPtr->settingTable->minimum) /* <H3> */
? MAXSTROBECOUNT /* if minimum, bang against stops */
: abs(globalPtr->lastHWSetting - tablevalue);
SELECT(backlightreg,regvalue); /* assert chip select */
StrobeCount(backlightreg,strobes,regvalue); /* strobe count line */
DESELECT(backlightreg,regvalue); /* deassert chip select */
globalPtr->lastHWSetting = tablevalue; /* save the hardware setting */
return(new);
};
/*page
***************************************************************************************************
*
* bit 2 1 0
* +-----+-----+-----+
* | | | |
* | opt | sft | ctl |
* | | | |
* +-----+-----+-----+
*
* 90/12/18 ag recoded key down check.
*
*
*
***************************************************************************************************
*/
Boolean KeysDown(int value, char kbdmap[])
{
#define CONTROLBIT 0x01;
#define SHIFTBIT 0x02;
#define OPTIONBIT 0x04;
int keysDown;
if (!value) return (false); /* no key combinations */
keysDown = 0;
if (kbdmap[7] & BYTEMASK_7_CTL) keysDown += CONTROLBIT;
if (kbdmap[7] & BYTEMASK_7_SFT) keysDown += SHIFTBIT;
if (kbdmap[7] & BYTEMASK_7_OPT) keysDown += OPTIONBIT;
return((keysDown == value));
};
/*page
***************************************************************************************************
*
*
***************************************************************************************************
*/
int KbdControl (driverGlobalPtr globalPtr)
{
char kbdmap[16];
int delta;
int returnValue;
int maximum;
returnValue = globalPtr->userBrightness;
maximum = globalPtr->maximumTable[globalPtr->powerRange];
if (globalPtr->userBrightness > maximum)
return(maximum);
GetKeys((KeyMap) &kbdmap[0]);
// postdataptr = &postEventData;
// if (!postdataptr->keysActive)
if (!KeysDown(globalPtr->keycodes,kbdmap))
{
globalPtr->mousedownTicks = 0; /* no mouse event */
globalPtr->kbdactive = false; /* kbd control cancel */
}
else
{
globalPtr->mousedownTicks += 1; /* increment mouse down time */
if (globalPtr->mousedownTicks > ((globalPtr->kbdactive) ? REPEATTIME : REPEATTHRESHOLD) )
{
globalPtr->kbdactive = true;
globalPtr->mousedownTicks = 1;
delta = 0;
if (KEYDOWNTEST(UPARROW,kbdmap) || KEYDOWNTEST(RIGHTARROW,kbdmap)) delta = 1;
if (KEYDOWNTEST(DOWNARROW,kbdmap) || KEYDOWNTEST(LEFTARROW,kbdmap)) delta = -1;
if ((globalPtr->userBrightness+delta) > maximum)
delta = 0;
if ((globalPtr->userBrightness+delta) < 0 )
delta = 0;
returnValue = globalPtr->userBrightness + delta;
};
};
return(returnValue);
};
/*page
***************************************************************************************************
*
*
***************************************************************************************************
*/
int RegisterClose (driverGlobalPtr globalPtr)
{
globalPtr->userBrightness = globalPtr->settingTable->maximum; /* <H3> */
globalPtr->userBrightness = SetBrightness(globalPtr->settingTable->minimum,globalPtr); /* <H3> initialize pot */
SleepQRemove(&globalPtr->sleepQelement); /* remove sleep task */
ShutDwnRemove( (ShutDwnProcPtr) ShutdownBacklight); /* remove shutdown task */
// NSetTrapAddress(postdataptr->oldvector,_PostEvent,OSTrap);
return(0);
};
/*page
***************************************************************************************************
*
* The control routineÉ
*
* return:
* noErr - task completed successfully
* controlErr - illegal control selector
*
*
***************************************************************************************************
*/
OSErr RegisterControl(CntrlParam *ctlPB,driverGlobalPtr globalPtr) /* 'open' entry point */
{
#pragma unused (ctlPB)
int error;
int tempvalue;
error = noErr;
switch(ctlPB->csCode)
{
case kSetScreenBrightness: /* set brightness level */
tempvalue = ctlPB->csParam[0];
globalPtr->userBrightness = (*globalPtr->setlevelproc)(tempvalue,globalPtr);
break;
case kSaveScreenBrightness: /* save brightness level */
SaveBrightness(globalPtr->userBrightness);
break;
case kSetBrightnessKeys:
tempvalue = ctlPB->csParam[0];
globalPtr->keycodes = tempvalue & KEY_VALUE_MASK; /* limit value to key code range */
setNewKeys(globalPtr->keycodes);
break;
case kSavePKeys:
SaveKeyData(globalPtr->keycodes);
break;
default:
error = controlErr;
};
return(error);
};
/*page
***************************************************************************************************
*
* The status routineÉ
*
* return:
* noErr - task completed successfully
* statusErr - illegal control selector
*
***************************************************************************************************
*/
OSErr RegisterStatus(CntrlParam *ctlPB,driverGlobalPtr globalPtr) /* 'open' entry point */
{
short error;
error = noErr;
switch(ctlPB->csCode)
{
case kGetBrightnessKeys: /* return current saved brightness */
ctlPB->csParam[0] = globalPtr->keycodes;
break;
case kGetPBacklight:
ctlPB->csParam[0] = GetPramBrightness();
break;
case kGetPKey:
ctlPB->csParam[0] = GetPramKeyData();
break;
default:
error = statusErr;
};
return(error);
}
setNewKeys(int keycombo)
{
char newKey;
newKey = 0;
if (keycombo & 0x01) newKey |= 0x10;
if (keycombo & 0x02) newKey |= 0x02;
if (keycombo & 0x04) newKey |= 0x08;
};