diff options
author | Joel Sherrill <joel.sherrill@OARcorp.com> | 2009-08-21 18:39:59 +0000 |
---|---|---|
committer | Joel Sherrill <joel.sherrill@OARcorp.com> | 2009-08-21 18:39:59 +0000 |
commit | cb09a5da6a2da6e13f05acc28c2dcfdc40ce9645 (patch) | |
tree | 3100a0ad48c48e6bf20dc5c99892a54f032f4c8c /cpukit/libmisc/fb | |
parent | 2009-08-21 Roxana Leontie <roxana.leontie@gmail.com> (diff) | |
download | rtems-cb09a5da6a2da6e13f05acc28c2dcfdc40ce9645.tar.bz2 |
2009-08-21 Roxana Leontie <roxana.leontie@gmail.com>
* Makefile.am, preinstall.am, libmisc/Makefile.am: Changed the name of
mw-fb directory into fb. Relocated files.
* libmisc/fb/fb.h, libmisc/fb/mw_uid.c, libmisc/fb/mw_uid.h: New files.
* libmisc/mw-fb/fb.h, libmisc/mw-fb/mw_uid.c, libmisc/mw-fb/mw_uid.h:
Removed.
Diffstat (limited to 'cpukit/libmisc/fb')
-rw-r--r-- | cpukit/libmisc/fb/fb.h | 87 | ||||
-rw-r--r-- | cpukit/libmisc/fb/mw_uid.c | 155 | ||||
-rw-r--r-- | cpukit/libmisc/fb/mw_uid.h | 137 |
3 files changed, 379 insertions, 0 deletions
diff --git a/cpukit/libmisc/fb/fb.h b/cpukit/libmisc/fb/fb.h new file mode 100644 index 0000000000..f42a15f0c9 --- /dev/null +++ b/cpukit/libmisc/fb/fb.h @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2000 - Rosimildo da Silva + * + * MODULE DESCRIPTION: + * Micro FrameBuffer interface for Embedded Systems. + * + * $Id$ + */ + +#ifndef _MW_FB_H +#define _MW_FB_H + +#include <stdint.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/* ioctls + 0x46 is 'F' */ +#define FBIOGET_VSCREENINFO 0x4600 +#define FBIOPUT_VSCREENINFO 0x4601 +#define FBIOGET_FSCREENINFO 0x4602 +#define FBIOGETCMAP 0x4604 +#define FBIOPUTCMAP 0x4605 +#define FB_EXEC_FUNCTION 0x4606 + + +#define FB_TYPE_PACKED_PIXELS 0 /* Packed Pixels */ +#define FB_TYPE_PLANES 1 /* Non interleaved planes */ +#define FB_TYPE_INTERLEAVED_PLANES 2 /* Interleaved planes */ +#define FB_TYPE_TEXT 3 /* Text/attributes */ +#define FB_TYPE_VGA_PLANES 4 /* EGA/VGA planes */ +#define FB_TYPE_VIRTUAL_BUFFER 5 /* Virtual Buffer */ + + +#define FB_VISUAL_MONO01 0 /* Monochr. 1=Black 0=White */ +#define FB_VISUAL_MONO10 1 /* Monochr. 1=White 0=Black */ +#define FB_VISUAL_TRUECOLOR 2 /* True color */ +#define FB_VISUAL_PSEUDOCOLOR 3 /* Pseudo color (like atari) */ +#define FB_VISUAL_DIRECTCOLOR 4 /* Direct color */ +#define FB_VISUAL_STATIC_PSEUDOCOLOR 5 /* Pseudo color readonly */ + +#define FB_ACCEL_NONE 0 /* no hardware accelerator */ + +struct fb_bitfield { + uint32_t offset; /* beginning of bitfield */ + uint32_t length; /* length of bitfield */ + uint32_t msb_right; /* != 0 : Most significant bit is */ + /* right */ +}; + +struct fb_var_screeninfo { + uint32_t xres; /* visible resolution */ + uint32_t yres; + uint32_t bits_per_pixel; /* guess what */ + struct fb_bitfield red; /* bitfield in fb mem if true color, */ + struct fb_bitfield green; /* else only length is significant */ + struct fb_bitfield blue; + struct fb_bitfield transp; /* transparency */ +}; + +struct fb_fix_screeninfo { + volatile char *smem_start; /* Start of frame buffer mem */ + /* (physical address) */ + uint32_t smem_len; /* Length of frame buffer mem */ + uint32_t type; /* see FB_TYPE_* */ + uint32_t visual; /* see FB_VISUAL_* */ + uint32_t line_length; /* number of chars per line */ +}; + +struct fb_cmap { + uint32_t start; /* First entry */ + uint32_t len; /* Number of entries */ + uint16_t *red; /* Red values */ + uint16_t *green; + uint16_t *blue; + uint16_t *transp; /* transparency, can be NULL */ +}; + + + +#ifdef __cplusplus +} +#endif + +#endif /* _MW_FB_H */ diff --git a/cpukit/libmisc/fb/mw_uid.c b/cpukit/libmisc/fb/mw_uid.c new file mode 100644 index 0000000000..dcf0e9d9cb --- /dev/null +++ b/cpukit/libmisc/fb/mw_uid.c @@ -0,0 +1,155 @@ +/* + * + * Copyright (c) 2000 - Rosimildo da Silva + * + * MODULE DESCRIPTION: + * This module implements the input devices interface used by MicroWindows + * in an embedded system environment. + * It uses the RTEMS message queue as the repository for the messages posted + * by the devices registered. + * + * $Id$ + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <stdio.h> +#include <fcntl.h> +#include <sys/ioctl.h> +#include <errno.h> +#include <rtems.h> + +#include <rtems/mw_uid.h> +#include <rtems/seterr.h> + +static rtems_id queue_id = 0; +static int open_count = 0; + +/* +#define MW_DEBUG_ON 1 +*/ + +/* open a message queue with the kernel */ +int uid_open_queue( const char *q_name, int flags __attribute__((unused)), size_t max_msgs ) +{ + static rtems_name queue_name; + + /* + * For the first device calling this function we would create the queue. + * It is assumed that this call is done at initialization, and no concerns + * regarding multi-threading is taken in consideration here. + */ + if( !open_count ) + { + rtems_status_code status; + queue_name = rtems_build_name( q_name[0], + q_name[1], + q_name[2], + q_name[3] ); + status = rtems_message_queue_create( queue_name, + max_msgs, + sizeof( struct MW_UID_MESSAGE ), + RTEMS_FIFO | RTEMS_LOCAL, + &queue_id ); + if( status != RTEMS_SUCCESSFUL ) + { +#ifdef MW_DEBUG_ON + printk( "UID_Queue: error creating queue: %d\n", status ); +#endif + return -1; + } +#ifdef MW_DEBUG_ON + printk( "UID_Queue: id=%X\n", queue_id ); +#endif + } + open_count++; + return 0; +} + + +/* close message queue */ +int uid_close_queue( void ) +{ + if( open_count == 1 ) + { + rtems_message_queue_delete( queue_id ); + queue_id = 0; + } + open_count--; + return 0; +} + +/* reads for a message from the device */ +int uid_read_message( struct MW_UID_MESSAGE *m, unsigned long timeout ) +{ + rtems_status_code status; + size_t size = 0; + unsigned long micro_secs = timeout*1000; + int wait = ( timeout != 0 ); + + status = rtems_message_queue_receive( queue_id, + (void*)m, + &size, + wait ? RTEMS_WAIT : RTEMS_NO_WAIT, + RTEMS_MICROSECONDS_TO_TICKS(micro_secs)); + + if( status == RTEMS_SUCCESSFUL ) + { + return size; + } + else if( ( status == RTEMS_UNSATISFIED ) || ( status == RTEMS_TIMEOUT ) ) + { + /* this macro returns -1 */ + rtems_set_errno_and_return_minus_one( ETIMEDOUT ); + } + /* Here we have one error condition */ +#ifdef MW_DEBUG_ON + printk( "UID_Queue: error reading queue: %d\n", status ); +#endif + return -1; +} + + +/* + * add a message to the queue of events. This method cna be used to + * simulate hardware events, and it can be very handy during development + * a new interface. + */ +int uid_send_message( struct MW_UID_MESSAGE *m ) +{ + rtems_status_code status; + status = rtems_message_queue_send( queue_id, ( void * )m, + sizeof( struct MW_UID_MESSAGE ) ); + return status == RTEMS_SUCCESSFUL ? 0 : -1; +} + +/* + * register the device to insert events to the message + * queue named as the value passed in q_name + */ +int uid_register_device( int fd, const char *q_name ) +{ + return ioctl( fd, MW_UID_REGISTER_DEVICE, q_name ); +} + +/* tell this device to stop adding events to the queue */ +int uid_unregister_device( int fd ) +{ + return ioctl( fd, MW_UID_UNREGISTER_DEVICE, NULL ); +} + +/* set the keyboard */ +int uid_set_kbd_mode( int fd, int mode, int *old_mode ) +{ + if (ioctl( fd, MV_KDGKBMODE, old_mode) < 0) + { + return -1; + } + if (ioctl(fd, MV_KDSKBMODE, mode ) < 0 ) + { + return -1; + } + return 0; +} diff --git a/cpukit/libmisc/fb/mw_uid.h b/cpukit/libmisc/fb/mw_uid.h new file mode 100644 index 0000000000..867a28e2e5 --- /dev/null +++ b/cpukit/libmisc/fb/mw_uid.h @@ -0,0 +1,137 @@ +/* + * Copyright (c) 2000 - Rosimildo da Silva + * + * MODULE DESCRIPTION: + * This module defines the interface for input devices used by MicroWindows + * in an embedded system environment. + * + * $Id$ + */ + +#ifndef _MW_UID_H +#define _MW_UID_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* 0x41XX -- IOCLT functions for the Micro Input Devices commands */ +#define MW_UID_REGISTER_DEVICE 0x4100 +#define MW_UID_UNREGISTER_DEVICE 0x4101 + + +/* devices supported by MicroWindows */ +enum MW_INPUT_DEVICE_TYPE +{ + MV_UID_INVALID = 0, + MV_UID_REL_POS = 1, /* mouse */ + MV_UID_ABS_POS = 2, /* touch-screen */ + MV_UID_KBD = 3, /* keyboard */ + MV_UID_TIMER = 4 /* timer -- not used */ +}; + + +/* matching MicroWindows */ +#define MV_BUTTON_RIGHT 0x01 +#define MV_BUTTON_CENTER 0x02 +#define MV_BUTTON_LEFT 0x04 + +/* modifiers of the keyboard type devices */ +#define MV_KEY_MODIFIER_SHIFT_DOWN 0x10 +#define MV_KEY_MODIFIER_ALT_DOWN 0x20 + +/* indication of the LEDS */ +#define MV_KEY_MODIFIER_CAPS_ON 0x04 +#define MV_KEY_MODIFIER_NUN_LOCK_ON 0x02 +#define MV_KEY_SCROLL_LOCK_ON 0x01 + +/* keyboard modes -- default ASCII */ +#define MV_KEY_MODE_ASCII 0x01 +/* + * This mode one event is sent when a key is pressed, + * and another one is send when a key is released. + */ +#define MV_KEY_MODE_SCANCODE 0x00 + + +/* these defines match with the linux keyboard range + for ioctls functions for the keyboard interface. + 0x4BXX --- keyboard related functions + */ +#define MV_KDGKBMODE 0x4B44 /* gets current keyboard mode */ +#define MV_KDSKBMODE 0x4B45 /* sets current keyboard mode */ + +/* + * Message generated by input devices controlled by MicroWindows. + */ +struct MW_UID_MESSAGE +{ + enum MW_INPUT_DEVICE_TYPE type; /* device type */ + union + { + /* fired when keyboard events are raised */ + struct kbd_t { + unsigned short code; /* keycode or scancode */ + unsigned char modifiers; /* key modifiers */ + unsigned char mode; /* current Kbd mode */ + } kbd; + + /* fired when position events are raised, mouse, touch screen, etc */ + struct pos_t { + unsigned short btns; /* indicates which buttons are pressed */ + short x; /* x location */ + short y; /* y location */ + short z; /* z location, 0 for 2D */ + } pos; + + /* fired by a timer device periodically */ + struct timer_t { + unsigned long frt; /* free running timer */ + unsigned long seq; /* sequence number */ + } tmr; + + } m; +}; + + +/* + * API for creating/closing/accessing the message queue used by the micro + * input device interface. All functions in this interface returns a + * zero ( 0 ) on success. One exception for that is the "read" routine + * that returns the number of bytes read. Negaive numbers indicate errors + * + * The implementation of the message queue for RTEMS uses a POSIX message + * queue interface. It should be very portable among systems with a POSIX + * support. + */ + +/* creates the message queue that holds events from the input devices */ +extern int uid_open_queue( const char *q_name, int flags, size_t max_msgs ); + +/* closes message queue */ +extern int uid_close_queue( void ); + +/* + * reads a message from the queue. It waits up to the specified + * timeout in mili-seconds. + */ +extern int uid_read_message( struct MW_UID_MESSAGE *m, unsigned long timeout ); + +/* write a message to the queue */ +extern int uid_write_message( struct MW_UID_MESSAGE *m ); + + +/* register device to insert data to the queue */ +extern int uid_register_device( int fd, const char *q_name ); + +/* unregister device to stop adding messages to the queue */ +extern int uid_unregister_device( int fd ); + +/* set the keyboard */ +extern int uid_set_kbd_mode( int fd, int mode, int *old_mode ); + +#ifdef __cplusplus +} +#endif + +#endif /* _MW_UID_H */ |