User-space driver and process race condition

From Jollen's Wiki

Jump to: navigation, search

lcd-2

/*
*
* Copyright (c) 2006 www.jollen.org
*
*  jollen <jollen@jollen.org>
*
*   This file may be redistributed under the terms of the GNU Public
*   License.
*
* Subject: direct fb mmap demo for Jollen-Kit!
*
*/

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/mman.h> // be sure to include this file
#include <sys/stat.h>

#define	XX 240  /* (0,0)~(239,319) */
#define YY 320
#define BPP 4  /* 4 bytes */

static void waitkey(void)
{
   printf("Press 'ENTER' to next demo...\n");
   getchar();
}

int put_xy(unsigned char *mem, int x, int y, int c)
{
   unsigned int adr;

   if (x > XX) return -1;
   if (y > YY) return -2;

   adr = (unsigned int)mem+BPP*(y*XX+x);

   *((unsigned int *)adr) = c;
}

int DFB_rect(unsigned char *mem, int x1, int y1, int x2, int y2, int c)
{
    int xline = x2-x1+1;
    int yline = y2-y1+1;

    int i;

    for (i = 0; i < xline; i++) {
       put_xy(mem, x1+i, y1, c);
       put_xy(mem, x1+i, y2, c);
    }
    for (i = 0; i < yline; i++) {
       put_xy(mem, x1, y1+i, c);
       put_xy(mem, x2, y1+i, c);
    }
}

int DFB_clean(unsigned char *mem)
{
   memset(mem, 0, XX*YY*BPP);
}

int DFB_effect1(unsigned char *map)
{
    int i,j ;

    DFB_rect(map, 10, 10, 60, 60, 0x006f0000);
    for (i = 0; i < 20; i++) {
       DFB_rect(map, 10+(i-1)*5, 10+(i-1)*5, 60+(i-1)*5, 60+(i-1)*5, 0x00ff0000);
       DFB_rect(map, 10+i*5, 10+i*5, 60+i*5, 60+i*5, 0x006f0000);
       for (j = 0; j < 400000; j++) {}
    }
}

int DFB_effect2(unsigned char *map)
{
    int i,j ;

    for (i = 0; i < 20; i++) {
       DFB_rect(map, 10+i*5, 10+i*5, 60+i*5, 60+i*5, 0x006f0000+i*3);
       for (j = 0; j < 400000; j++) {}
    }
}

int DFB_fill_red(unsigned char *map)
{
    int i, j;

    for (i = 0; i < 240; i++)
      for (j = 0; j < 320; j++)
	put_xy(map, i, j, 0x00ff0000);
}

int DFB_fill_blue(unsigned char *map)
{
    int i, j;

    for (i = 0; i < 240; i++)
      for (j = 0; j < 320; j++)
	put_xy(map, i, j, 0x0000ff00);
}

int main(int argc, char *argv[])
{
    int i, j, color;
    int fd;
    unsigned int num = 0;
    unsigned char *map;
    pid_t child;

    if (argc == 1) argv[1] = "0";

  fd = open ("/dev/lcd", O_RDWR);
  if (fd < 0)
    {
      printf ("Error : Can not open framebuffer device\n");
      exit (1);
    }

  map = (unsigned char *)mmap(0, 240*320*4, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
  close (fd);

    if (!map) {
        printf("direct fb: mapping failed.\n");
    }
 
    child = fork();

    if (child) /* parent process */ {
        while (1) {
		DFB_fill_red(map);
		sleep(1);
	}
    } else /* child process */ {
        while (1) {
		DFB_fill_blue(map);
		sleep(1);
	}
    }

    return 0;
}
Views
個人工具
導航
工具