View Single Post
Old 11-05-2013, 08:21 PM   #445
twobob
( ͡° ͜ʖ ͡°){ʇlnɐɟ ƃǝs}Týr
twobob ought to be getting tired of karma fortunes by now.twobob ought to be getting tired of karma fortunes by now.twobob ought to be getting tired of karma fortunes by now.twobob ought to be getting tired of karma fortunes by now.twobob ought to be getting tired of karma fortunes by now.twobob ought to be getting tired of karma fortunes by now.twobob ought to be getting tired of karma fortunes by now.twobob ought to be getting tired of karma fortunes by now.twobob ought to be getting tired of karma fortunes by now.twobob ought to be getting tired of karma fortunes by now.twobob ought to be getting tired of karma fortunes by now.
 
twobob's Avatar
 
Posts: 6,552
Karma: 6015922
Join Date: Jun 2012
Location: uti gratia usura (Yao ying da ying; Mo ying da yieng)
Device: PW-WIFI|K5-3G+WIFI| K4|K3-3G|DXG|K2| Rooted Nook Touch
https://dl.dropboxusercontent.com/u/15900420/PW-pump

EXPERIMENTAL inversion pump for the PW.

replaces need for eips. fixes colors.


just run it in parallel with the viewer.

[root@kindle root]# /mnt/us/PW-pump
Quote:
using XRandR: screen size = 758x1024, rotation = UR
EPDC fbdev is /dev/fb0
1: (x,y)=(0,0) (w,h)=(758,1024)
2: (x,y)=(338,572) (w,h)=(78,46)
3: (x,y)=(338,572) (w,h)=(161,46)
4: (x,y)=(420,572) (w,h)=(164,46)
5: (x,y)=(505,572) (w,h)=(79,46)
6: (x,y)=(256,420) (w,h)=(328,198)
7: (x,y)=(420,420) (w,h)=(79,46)
8: (x,y)=(588,572) (w,h)=(79,46)
9: (x,y)=(588,522) (w,h)=(79,96)
10: (x,y)=(588,420) (w,h)=(79,148)
11: (x,y)=(588,420) (w,h)=(79,46)
12: (x,y)=(420,522) (w,h)=(79,46)
13: (x,y)=(420,522) (w,h)=(79,96)

POSSIBLE ERRORS:

/mnt/us # /mnt/us/PW-pump
Quote:
using XRandR: screen size = 758x1024, rotation = UR EPDC fbdev is /dev/fb0
15: (x,y)=(172,268) (w,h)=(327,300)
16: (x,y)=(420,472) (w,h)=(79,46)
17: (x,y)=(450,730) (w,h)=(71,71)
18: (x,y)=(130,943) (w,h)=(426,71)
19: (x,y)=(2,2) (w,h)=(748,1012)
Error in ioctl(MXCFB_SEND_UPDATE) call
/dev/fb0: Cannot allocate memory
at which point it will bomb out...

meh, it's experimental. currently I'm just testing it.

As you can see from the screen shot the image /thinks/ it is still b&w...
but on the screen you see the correct colour inversion.

: )



Other then me breaking it this is the work of seaniko, Freescale and Hawhill.
And probably a bunch of other people too...

(It's gpl so I think I need to include the source)
Header: https://github.com/hwhw/kindlevncvie...nclude/mxcfb.h
Spoiler:
Code:
/*
 * Copyright (C) 2010-2011 Freescale Semiconductor, Inc. All Rights Reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 *
 */

/*
 * @file mxc_epdc_x11_fb_test.c
 *
 * @brief MXC EPDC unit test applicationi for framebuffer updates
 * based on X11 changes to its root window
 *
 */

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <poll.h>
#include <X11/Xlib.h>
#include <X11/extensions/Xdamage.h>
#include <X11/extensions/Xrandr.h>
#include <linux/fb.h>
#include "mxcfb.h"
#include <sys/ioctl.h>
#include <time.h>

#define INIT_UPDATE_MARKER      0x12345678

static int kbhit(void)
{
	struct pollfd pollfd;
	pollfd.fd = 0;
	pollfd.events = POLLIN;
	pollfd.revents = 0;

	return poll(&pollfd, 1, 0);
}

int main (int argc, char* argv[])
{
	/* Declare and init variables used after cleanup: goto. */
	Display* xDisplay = NULL;
	Damage xDamageScreen = 0;
	int fd = -1;
	XRRScreenConfiguration* xrrScreenConfig = NULL;

	/* Open the X display */
	xDisplay = XOpenDisplay(NULL);
	if (NULL == xDisplay)
	{
		printf("\nError: unable to open X display\n");
		goto cleanup;
	}

	/* Acess the root window for the display. */
	Window xRootWindow = XDefaultRootWindow(xDisplay);
	if (0 == xRootWindow)
	{
		printf("\nError: unable to access root window for screen\n");
		goto cleanup;
	}

	/* Access the XRandR screen configuration. */
	xrrScreenConfig = XRRGetScreenInfo(xDisplay, xRootWindow);
	if (NULL == xrrScreenConfig)
	{
		printf("\nError: unable to query XRandR screen config\n");
		goto cleanup;
	}

	/* Query the list of XRandR configured screen sizes. */
	int xrrSizeListCount;
	XRRScreenSize* xrrSizeList =
		XRRConfigSizes(xrrScreenConfig, &xrrSizeListCount);

	/* Query the current XRandR screen rotation and which screen size */
	/* is currently being used. */
	Rotation xrrRotate;
	int xrrSizeIndex =
		XRRConfigCurrentConfiguration( xrrScreenConfig, &xrrRotate);
	const int screenWidth = xrrSizeList[xrrSizeIndex].width;
	const int screenHeight = xrrSizeList[xrrSizeIndex].height;

	/* Display XRandR information */
	printf("using XRandR: screen size = %dx%d, rotation = ",
		screenWidth, screenHeight);
	int fbRotate = -1;
	if (RR_Rotate_0 & xrrRotate)
	{
		printf("UR\n");
		fbRotate = FB_ROTATE_UR;
	}
	else if (RR_Rotate_90 & xrrRotate)
	{
		printf("CW\n");
		fbRotate = FB_ROTATE_CW;
	}
	else if (RR_Rotate_180 & xrrRotate)
	{
		printf("UD\n");
		fbRotate = FB_ROTATE_UD;
	}
	else if (RR_Rotate_270 & xrrRotate)
	{
		printf("CCW\n");
		fbRotate = FB_ROTATE_CCW;
	}
	else
	{
		printf("???\n");
	}
	if (-1 == fbRotate)
	{
		printf("\nError: unsupported XRandR rotation = 0x%04x\n",
			xrrRotate);
		goto cleanup;
	}

	/* Query the damage extension associated with this display. */
	int xDamageEventBase;
	int xDamageErrorBase;
	if (!XDamageQueryExtension(xDisplay, &xDamageEventBase, &xDamageErrorBase))
	{
		printf("\nError: unable to query XDamage extension\n");
		goto cleanup;
	}

	/* Setup to receive damage notification on the main screen */
	/* each time the bounding box increases until it is reset. */
	xDamageScreen =
		XDamageCreate(xDisplay, xRootWindow,
			XDamageReportBoundingBox);
	if (0 == xDamageScreen)
	{
		printf("\nError: unable to setup X damage on display screen\n");
		goto cleanup;
	}

	/* Find the EPDC FB device */
	char fbDevName[10] = "/dev/fb";
	int fbDevNum = 0;
	struct fb_fix_screeninfo fbFixScreenInfo;
	do {
		/* Close previously opened fbdev */
		if (fd >= 0)
		{
			close(fd);
			fd = -1;
		}

		/* Open next fbdev */
		fbDevName[7] = '0' + (fbDevNum++);
		fd = open(fbDevName, O_RDWR, 0);
		if (fd < 0)
		{
			printf("Error in opening fb device\n");
			perror(fbDevName);
			goto cleanup;
		}

		/* Query fbdev fixed screen info. */
		if (0 > ioctl(fd, FBIOGET_FSCREENINFO, &fbFixScreenInfo))
		{
			printf("Error in ioctl(FBIOGET_FSCREENINFFO) call\n");
			perror(fbDevName);
			goto cleanup;
		}
    
	} while (0 != strcmp(fbFixScreenInfo.id, "mxc_epdc_fb"));
	printf("EPDC fbdev is %s\n", fbDevName);

	/* Query fbdev var screen info. */
	struct fb_var_screeninfo fbVarScreenInfo;
	if (0 > ioctl(fd, FBIOGET_VSCREENINFO, &fbVarScreenInfo))
	{
		printf("Error in ioctl(FBIOGET_VSCREENINFO) call\n");
		perror(fbDevName);
		goto cleanup;
	}

	/* Force EPDC to initialize */
	fbVarScreenInfo.activate = FB_ACTIVATE_FORCE;
	if (0 > ioctl(fd, FBIOPUT_VSCREENINFO, &fbVarScreenInfo))
	{
		printf("Error in ioctl(FBIOPUT_VSCREENINFO) call\n");
		perror(fbDevName);
		goto cleanup;
	}

	/* Put EPDC into region update mode. */
	int mxcfbSetAutoUpdateMode = AUTO_UPDATE_MODE_REGION_MODE;
	if (0 > ioctl(fd, MXCFB_SET_AUTO_UPDATE_MODE, &mxcfbSetAutoUpdateMode))
	{
		printf("Error in ioctl(MXCFB_SET_AUTO_UPDATE_MODE) call\n");
		perror(fbDevName);
		goto cleanup;
	}

        /* Set EPDC update scheme. */
        int mxcfbSetUpdateScheme = UPDATE_SCHEME_SNAPSHOT;
        if (0 > ioctl(fd, MXCFB_SET_UPDATE_SCHEME, &mxcfbSetUpdateScheme))
        {
                printf("Error in ioctl(MXCFB_SET_UPDATE_SCHEME) call\n");
                perror(fbDevName);
                goto cleanup;
        }

	/* Setup waveform modes. */
        struct mxcfb_waveform_modes mxcfbWaveformModes;


	/* Common properties for EPDC screen update */
	struct mxcfb_update_data mxcfbUpdateData;
        mxcfbUpdateData.update_region.left = 0;
        mxcfbUpdateData.update_region.width = 0x2F6;
        mxcfbUpdateData.update_region.top = 0;
        mxcfbUpdateData.update_region.height = 0x400;
        mxcfbUpdateData.update_mode = UPDATE_MODE_PARTIAL;
        mxcfbUpdateData.waveform_mode = WAVEFORM_MODE_GL16;
        mxcfbUpdateData.update_marker = 1;


        mxcfbUpdateData.flags = EPDC_FLAG_ENABLE_INVERSION;
                if (0 > ioctl(fd, MXCFB_SEND_UPDATE, &mxcfbUpdateData))
                {
                        printf("Error in ioctl(MXCFB_SEND_UPDATE) call\n");
                        perror(fbDevName);
                        goto cleanup;
                }

	int numPanelUpdates = 0;
	while (1)
	{
		int numDamageUpdates = 0;
		int updateLeft, updateRight;
		int updateTop, updateBottom;

		while (XPending(xDisplay))
		{
			XEvent xEvent;
			XNextEvent(xDisplay, &xEvent);
			if ((XDamageNotify+xDamageEventBase) == xEvent.type)
			{
				XDamageNotifyEvent* xDamageNotifyEvent =
					(XDamageNotifyEvent*)&xEvent;

				int left = xDamageNotifyEvent->area.x;
				int top = xDamageNotifyEvent->area.y;
				int right = left + xDamageNotifyEvent->area.width;
				int bottom = top + xDamageNotifyEvent->area.height;

				if (numDamageUpdates++ > 0)
				{
					if (left < updateLeft)
					{
						updateLeft = left;
					}
					if (right > updateRight)
					{
						updateRight = right;
					}
					if (top < updateTop)
					{
						updateTop = top;
					}
					if (bottom > updateBottom)
					{
						updateBottom = bottom;
					}
				}
				else
				{
					updateLeft = left;
					updateTop = top;
					updateRight = right;
					updateBottom = bottom;
				}
			}
		
		}

			usleep (30000);  // Bit of grace time.

		/* Send accum bound rect updates to EPDC */
		mxcfbUpdateData.update_marker = ++numPanelUpdates;

		if (FB_ROTATE_UR == fbRotate)
		{
			mxcfbUpdateData.update_region.left = 0;
			mxcfbUpdateData.update_region.top = 0;

mxcfbUpdateData.update_region.width = 758 ; // screenWidth;
mxcfbUpdateData.update_region.height = 1024 ;// screenHeight;

		}
		else if (FB_ROTATE_UD == fbRotate)
		{
			mxcfbUpdateData.update_region.left = 0;
			mxcfbUpdateData.update_region.top = 0;

			mxcfbUpdateData.update_region.width =
				screenWidth - updateLeft;
			mxcfbUpdateData.update_region.height =
				screenHeight - updateTop;
		}
		else if (FB_ROTATE_CW == fbRotate)
		{
			mxcfbUpdateData.update_region.left = 0;
			mxcfbUpdateData.update_region.top = 0;

			mxcfbUpdateData.update_region.width =
				screenWidth - updateTop;
			mxcfbUpdateData.update_region.height =
				updateRight;
		}
		else if (FB_ROTATE_CCW == fbRotate)
		{
			mxcfbUpdateData.update_region.left = 0;
			mxcfbUpdateData.update_region.top = 0;

			mxcfbUpdateData.update_region.width =
				updateBottom;
			mxcfbUpdateData.update_region.height =
				screenHeight - updateLeft;
		}
		else
		{
			continue;
		}

		if (0 > ioctl(fd, MXCFB_SEND_UPDATE, &mxcfbUpdateData))
		{
			printf("Error in ioctl(MXCFB_SEND_UPDATE) call\n");
			perror(fbDevName);
			goto cleanup;
		}

		/* Display what getting updated */
		printf("%d: (x,y)=(%d,%d) (w,h)=(%d,%d)\n",
			numPanelUpdates,
			updateLeft, updateTop,
			updateRight - updateLeft,
			updateBottom - updateTop);

		/* Clear the damage update bounding box */
		XDamageSubtract(xDisplay, xDamageScreen, None, None);

		/* Wait for previous EPDC update to finish */
		if (0 > ioctl(fd, MXCFB_WAIT_FOR_UPDATE_COMPLETE,
				&mxcfbUpdateData.update_marker))
		{
			printf("Error in ioctl(MXCFB_WAIT_FOR_UPDATE_COMPLETE) call\n");
			perror(fbDevName);
			goto cleanup;
		}
		
	}

cleanup:
	if (fd >= 0)
	{
		close(fd);
		fd = -1;
	}

	if (NULL != xrrScreenConfig)
	{
		XRRFreeScreenConfigInfo(xrrScreenConfig);
		xrrScreenConfig = NULL;
	}

	if (0 != xDamageScreen)
	{
		XDamageDestroy(xDisplay, xDamageScreen);
		xDamageScreen = 0;
	}

	if (NULL != xDisplay)
	{
		XCloseDisplay(xDisplay);
		xDisplay = NULL;
	}

	return 0;
}
Attached Thumbnails
Click image for larger version

Name:	screenshot_2013_11_06T02_37_58+0000.png
Views:	148
Size:	38.4 KB
ID:	114759   Click image for larger version

Name:	screenshot_2013_11_06T02_37_53+0000.png
Views:	140
Size:	40.9 KB
ID:	114760  

Last edited by twobob; 11-05-2013 at 09:49 PM.
twobob is offline   Reply With Quote