User-space driver and process race condition
From Jollen's Wiki
[編輯]
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;
}


