diff options
Diffstat (limited to 'tests/modehotplug')
| -rw-r--r-- | tests/modehotplug/Makefile | 14 | ||||
| -rw-r--r-- | tests/modehotplug/demo.c | 157 | ||||
| -rwxr-xr-x | tests/modehotplug/test | 1 | 
3 files changed, 172 insertions, 0 deletions
| diff --git a/tests/modehotplug/Makefile b/tests/modehotplug/Makefile new file mode 100644 index 00000000..467fb11a --- /dev/null +++ b/tests/modehotplug/Makefile @@ -0,0 +1,14 @@ + +all: app + +#CFLAGS = -g -ansi -pedantic -DPOSIX_C_SOURCE=199309L \ +#        -D_POSIX_SOURCE -D_XOPEN_SOURCE -D_BSD_SOURCE -D_SVID_SOURCE \ + +app: demo.c +	@gcc $(CFLAGS) -o app -Wall -I../../libdrm -I../../shared-core -L../../libdrm/.libs -ldrm demo.c + +clean: +	@rm -f app + +run: app +	sudo ./test diff --git a/tests/modehotplug/demo.c b/tests/modehotplug/demo.c new file mode 100644 index 00000000..4ef2e386 --- /dev/null +++ b/tests/modehotplug/demo.c @@ -0,0 +1,157 @@ + +#include <assert.h> +#include <stdio.h> +#include <stdlib.h> +#include <stdint.h> +#include <unistd.h> +#include <string.h> + +#include "xf86drm.h" +#include "xf86drmMode.h" + +/* structs for the demo_driver */ + +#define DEMO_MAX_OUTPUTS 8 + +struct demo_driver +{ +	/* drm stuff */ +	int fd; +	drmModeResPtr res; +	uint32_t counter; + +	drmModeOutputPtr outputs[DEMO_MAX_OUTPUTS]; +}; + +struct demo_driver* demoCreateDriver(void); +void demoUpdateRes(struct demo_driver *driver); + +void demoPopulateOutputs(struct demo_driver *driver); +void demoHotplug(struct demo_driver *driver); + +const char* demoGetStatus(drmModeOutputPtr out); + +int main(int argc, char **argv) +{ +	struct demo_driver *driver; +	uint32_t temp; +	int i; + +	printf("starting demo\n"); + +	driver = demoCreateDriver(); + +	if (!driver) { +		printf("failed to create driver\n"); +		return 1; +	} + +	driver->counter = drmModeGetHotplug(driver->fd); +	demoPopulateOutputs(driver); +	while (driver->counter != (temp = drmModeGetHotplug(driver->fd))) { +		demoPopulateOutputs(driver); +		driver->counter = temp; +	} + +	for (i = 0; i < driver->res->count_outputs && i < DEMO_MAX_OUTPUTS; i++) { +		printf("Output %u is %s\n", +			driver->outputs[i]->output_id, +			demoGetStatus(driver->outputs[i])); +	} + +	while(1) { +		usleep(100000); +		temp = drmModeGetHotplug(driver->fd); +		if (temp == driver->counter) +			continue; + +		demoHotplug(driver); +		driver->counter = temp; +	} + +	return 0; +} + +const char* demoGetStatus(drmModeOutputPtr output) +{ +	switch (output->connection) { +		case DRM_MODE_CONNECTED: +			return "connected"; +		case DRM_MODE_DISCONNECTED: +			return "disconnected"; +		default: +			return "unknown"; +	} +} + +void demoHotplug(struct demo_driver *driver) +{ +	drmModeResPtr res = driver->res; +	int i; +	drmModeOutputPtr temp, current; + +	for (i = 0; i < res->count_outputs && i < DEMO_MAX_OUTPUTS; i++) { +		temp = drmModeGetOutput(driver->fd, res->outputs[i]); +		current = driver->outputs[i]; + +		if (temp->connection != current->connection) { +			printf("Output %u became %s was %s\n", +				temp->output_id, +				demoGetStatus(temp), +				demoGetStatus(current)); +		} + +		drmModeFreeOutput(current); +		driver->outputs[i] = temp; +	} +} + +void demoPopulateOutputs(struct demo_driver *driver) +{ +	drmModeResPtr res = driver->res; +	int i; + +	for (i = 0; i < res->count_outputs && i < DEMO_MAX_OUTPUTS; i++) { +		drmModeFreeOutput(driver->outputs[i]); +		driver->outputs[i] = drmModeGetOutput(driver->fd, res->outputs[i]); +	} +} + +struct demo_driver* demoCreateDriver(void) +{ +	struct demo_driver* driver = malloc(sizeof(struct demo_driver)); + +	memset(driver, 0, sizeof(struct demo_driver)); + +	driver->fd = drmOpen("i915", NULL); + +	if (driver->fd < 0) { +		printf("Failed to open the card fb\n"); +		goto err_driver; +	} + +	demoUpdateRes(driver); +	if (!driver->res) { +		printf("could not retrive resources\n"); +		goto err_res; +	} + +	return driver; + +err_res: +	drmClose(driver->fd); +err_driver: +	free(driver); +	return NULL; +} + +void demoUpdateRes(struct demo_driver *driver) +{ +	if (driver->res) +		drmModeFreeResources(driver->res); + +	driver->res = drmModeGetResources(driver->fd); + +	if (!driver->res) +		printf("failed to get resources from kernel\n"); +} diff --git a/tests/modehotplug/test b/tests/modehotplug/test new file mode 100755 index 00000000..f98e3708 --- /dev/null +++ b/tests/modehotplug/test @@ -0,0 +1 @@ +LD_PRELOAD=../../libdrm/.libs/libdrm.so ./app | 
