intel_acpi.c

来自「是由intel提供的针对intel显卡915以上系列的linux驱动」· C语言 代码 · 共 232 行

C
232
字号
#ifndef XFree86LOADER#include <fcntl.h>#include <errno.h>#include <stdio.h>#endif#include <sys/un.h>#include <sys/socket.h>#include "X.h"#include "os.h"#include "xf86.h"#include "xf86Priv.h"#define XF86_OS_PRIVS#include "xf86_OSproc.h"#include "i830.h" #define ACPI_SOCKET  "/var/run/acpid.socket"#define ACPI_EVENTS  "/proc/acpi/event"#define ACPI_VIDEO_NOTIFY_SWITCH	0x80#define ACPI_VIDEO_NOTIFY_PROBE		0x81#define ACPI_VIDEO_NOTIFY_CYCLE		0x82#define ACPI_VIDEO_NOTIFY_NEXT_OUTPUT	0x83#define ACPI_VIDEO_NOTIFY_PREV_OUTPUT	0x84#define ACPI_VIDEO_NOTIFY_CYCLE_BRIGHTNESS	0x82#define	ACPI_VIDEO_NOTIFY_INC_BRIGHTNESS	0x83#define ACPI_VIDEO_NOTIFY_DEC_BRIGHTNESS	0x84#define ACPI_VIDEO_NOTIFY_ZERO_BRIGHTNESS	0x85#define ACPI_VIDEO_NOTIFY_DISPLAY_OFF		0x86#define ACPI_VIDEO_HEAD_INVALID		(~0u - 1)#define ACPI_VIDEO_HEAD_END		(~0u)static void I830CloseACPI(void);pointer I830ACPIihPtr = NULL;PMClose I830ACPIOpen(void);#define LINE_LENGTH 80#define MAX_NO_EVENTS 10static intI830ACPIGetEventFromOs(int fd, pmEvent *events, int num){    char ev[LINE_LENGTH];    int n;    memset(ev, 0, LINE_LENGTH);    n = read( fd, ev, LINE_LENGTH );    /* Check that we have a video event */    if (strstr(ev, "video") == ev) {	char *video = NULL;	char *GFX = NULL;	char *notify = NULL;	char *data = NULL; /* doesn't appear to be used in the kernel */	unsigned long int notify_l, data_l;	video = strtok(ev, "video");	GFX = strtok(NULL, " ");#if 0	ErrorF("GFX: %s\n",GFX);#endif	notify = strtok(NULL, " ");	notify_l = strtoul(notify, NULL, 16);#if 0	ErrorF("notify: 0x%lx\n",notify_l);#endif	data = strtok(NULL, " ");	data_l = strtoul(data, NULL, 16);#if 0	ErrorF("data: 0x%lx\n",data_l);#endif	/* Currently we don't differentiate events */	switch (notify_l) {		case ACPI_VIDEO_NOTIFY_SWITCH:			break;		case ACPI_VIDEO_NOTIFY_PROBE:			break;		case ACPI_VIDEO_NOTIFY_CYCLE:			break;		case ACPI_VIDEO_NOTIFY_NEXT_OUTPUT:			break;		case ACPI_VIDEO_NOTIFY_PREV_OUTPUT:			break;		default:			break;	}	/* We should probably add the ACPI events to the common layer */        events[0] = XF86_APM_CAPABILITY_CHANGED;	return 1;    }        return 0;}static voidI830HandlePMEvents(int fd, pointer data){    pmEvent events[MAX_NO_EVENTS];    int i,j,n;    if (!I830ACPIGetEventFromOs)	return;    if ((n = I830ACPIGetEventFromOs(fd,events,MAX_NO_EVENTS))) {	do {	    for (j = 0; j < n; j++) {		xf86EnterServerState(SETUP);		for (i = 0; i < xf86NumScreens; i++) {	    	    xf86EnableAccess(xf86Screens[i]);	    	    if (xf86Screens[i]->PMEvent)			xf86Screens[i]->PMEvent(i,events[j],FALSE);		}		xf86EnterServerState(OPERATING);	    }	    break;	} while (1);    }}PMCloseI830ACPIOpen(void){    int fd;        struct sockaddr_un addr;    int r = -1;#ifdef DEBUG    ErrorF("ACPI: OSPMOpen called\n");#endif    if (I830ACPIihPtr)	return NULL;   #ifdef DEBUG    ErrorF("ACPI: Opening device\n");#endif    if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) > -1) {	memset(&addr, 0, sizeof(addr));	addr.sun_family = AF_UNIX;	strcpy(addr.sun_path, ACPI_SOCKET);	if ((r = connect(fd, (struct sockaddr*)&addr, sizeof(addr))) == -1) {	    shutdown(fd, 2);            close(fd);	    fd = -1;	}    }    /* acpid's socket isn't available, so try going direct */    if (fd == -1) {        if ((fd = open(ACPI_EVENTS, O_RDONLY)) < 0) {	    xf86MsgVerb(X_WARNING,3,"Open ACPI failed (%s) (%s)\n", ACPI_EVENTS,	    	strerror(errno));	    return NULL;    	}    }    I830ACPIihPtr = xf86AddInputHandler(fd,I830HandlePMEvents,NULL);    xf86MsgVerb(X_INFO,3,"Open ACPI successful (%s)\n", (r != -1) ? ACPI_SOCKET : ACPI_EVENTS);    return I830CloseACPI;}static voidI830CloseACPI(void){    int fd;    #ifdef DEBUG   ErrorF("ACPI: Closing device\n");#endif    if (I830ACPIihPtr) {	fd = xf86RemoveInputHandler(I830ACPIihPtr);	shutdown(fd, 2);        close(fd);	I830ACPIihPtr = NULL;    }}#ifdef XFree86LOADERstatic MODULESETUPPROTO(intel_acpiSetup);static XF86ModuleVersionInfo intel_acpiVersRec ={	"intel_acpi",	"Tungsten Graphics, Inc",	MODINFOSTRING1,	MODINFOSTRING2,	XF86_VERSION_CURRENT,	INTEL_MAJOR_VERSION, INTEL_MINOR_VERSION, INTEL_PATCHLEVEL,	ABI_CLASS_EXTENSION,	ABI_EXTENSION_VERSION,	MOD_CLASS_EXTENSION,	{0,0,0,0}};XF86ModuleData intel_acpiModuleData = { &intel_acpiVersRec, intel_acpiSetup, NULL };ModuleInfoRec INTELACPI = {    1,    "INTELACPI",    NULL,    0,    NULL,};/*ARGSUSED*/static pointerintel_acpiSetup(pointer Module, pointer Options, int *ErrorMajor, int *ErrorMinor){    static Bool Initialised = FALSE;    if (!Initialised) {	Initialised = TRUE;#ifndef REMOVE_LOADER_CHECK_MODULE_INFO	if (xf86LoaderCheckSymbol("xf86AddModuleInfo"))#endif	xf86AddModuleInfo(&INTELACPI, Module);    }    return (pointer)TRUE;}#endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?