diff options
Diffstat (limited to 'cpukit/libmisc/fb')
-rw-r--r-- | cpukit/libmisc/fb/fb.h | 91 | ||||
-rw-r--r-- | cpukit/libmisc/fb/mw_print.c | 92 | ||||
-rw-r--r-- | cpukit/libmisc/fb/mw_uid.c | 150 | ||||
-rw-r--r-- | cpukit/libmisc/fb/mw_uid.h | 185 |
4 files changed, 518 insertions, 0 deletions
diff --git a/cpukit/libmisc/fb/fb.h b/cpukit/libmisc/fb/fb.h new file mode 100644 index 0000000000..cf49d7bd91 --- /dev/null +++ b/cpukit/libmisc/fb/fb.h @@ -0,0 +1,91 @@ +/* + * 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 FBIOSWAPBUFFERS 0x4607 +#define FBIOSETBUFFERMODE 0x4608 + +#define FB_SINGLE_BUFFERED 0 +#define FB_TRIPLE_BUFFERED 1 + +#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_print.c b/cpukit/libmisc/fb/mw_print.c new file mode 100644 index 0000000000..4e8abf2bd8 --- /dev/null +++ b/cpukit/libmisc/fb/mw_print.c @@ -0,0 +1,92 @@ +/* + * COPYRIGHT (c) 1989-2011. + * On-Line Applications Research Corporation (OAR). + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.com/license/LICENSE. + * + * $Id$ + */ + +#if HAVE_CONFIG_H +#include "config.h" +#endif + +#include <rtems/mw_uid.h> +#include <stdio.h> + +const char *uid_buttons( + unsigned short btns, + char *buffer, + size_t max +) +{ + snprintf( + buffer, + max, + "LEFT=%s CENTER=%s RIGHT=%s", + ((btns & MV_BUTTON_LEFT) ? "down" : "up"), + ((btns & MV_BUTTON_CENTER) ? "down" : "up"), + ((btns & MV_BUTTON_RIGHT) ? "down" : "up") + ); + return buffer; +} + +void uid_print_message( + struct MW_UID_MESSAGE *uid +) +{ + uid_print_message_with_plugin( NULL, printk_plugin, uid ); +} + +void uid_print_message_with_plugin( + void *context, + rtems_printk_plugin_t handler, + struct MW_UID_MESSAGE *uid +) +{ + char buttons[80]; + + switch (uid->type) { + case MV_UID_INVALID: + (*handler)( context, "MV_UID_INVALID\n" ); + break; + case MV_UID_REL_POS: + (*handler)( + context, + "MV_UID_REL_POS - %s x=%d y=%d z=%d\n", + uid_buttons( uid->m.pos.btns, buttons, sizeof(buttons)), + uid->m.pos.x, /* x location */ + uid->m.pos.y, /* y location */ + uid->m.pos.z /* z location, 0 for 2D */ + ); + break; + case MV_UID_ABS_POS: + (*handler)( + context, + "MV_UID_ABS_POS - %s x=%d y=%d z=%d\n", + uid_buttons( uid->m.pos.btns, buttons, sizeof(buttons)), + uid->m.pos.x, /* x location */ + uid->m.pos.y, /* y location */ + uid->m.pos.z /* z location, 0 for 2D */ + ); + break; + case MV_UID_KBD: + (*handler)( context, + "MV_UID_KBD - code=0x%04x modifiers=0x%02x mode=0x%02x\n", + uid->m.kbd.code, /* keycode or scancode */ + uid->m.kbd.modifiers, /* key modifiers */ + uid->m.kbd.mode /* current Kbd mode */ + ); + break; + case MV_UID_TIMER: + (*handler)( context, "MV_UID_TIMER\n" ); + break; + default: + (*handler)( context, "Invalid device type\n" ); + break; + } + +} + diff --git a/cpukit/libmisc/fb/mw_uid.c b/cpukit/libmisc/fb/mw_uid.c new file mode 100644 index 0000000000..e3cf34f276 --- /dev/null +++ b/cpukit/libmisc/fb/mw_uid.c @@ -0,0 +1,150 @@ +/* + * + * 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 +) +{ + rtems_status_code status; + + /* + * 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 ) { + open_count++; + return 0; + } + + status = rtems_message_queue_create( + rtems_build_name( q_name[0], q_name[1], q_name[2], q_name[3] ), + 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 ) ) { + 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 can 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..89f440acf4 --- /dev/null +++ b/cpukit/libmisc/fb/mw_uid.h @@ -0,0 +1,185 @@ +/* + * 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 + +#include <sys/types.h> +#include <rtems/bspIo.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/* 0x41XX -- IOCTL 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. + */ + +/** + * This method creates the message queue that holds events from the + * input devices. + * + * @param[in] q_name is the name of the message queue + * @param[in] flags controls the behaviour of the queue + * @param[in] max_msgs specifies the maximum number of pending messages + * + * @note The message queue is from the Classic API. + * + * @return This method returns 0 on success and -1 on error. + */ +extern int uid_open_queue( const char *q_name, int flags, size_t max_msgs ); + +/** + * This method closes the message queue and deletes it. + * + * @return This method returns 0 on success and -1 on error. + */ +extern int uid_close_queue( void ); + +/** + * This method reads a message from the queue. It waits up to the specified + * timeout in miliseconds. A @a timeout of 0 is a poll. + * + * @param[in] m will be filled in with the received message + * @param[in] timeout is the maximum number of mulliseconds to wait + * + * @return This method returns 0 on success and -1 on error. + */ +extern int uid_read_message( struct MW_UID_MESSAGE *m, unsigned long timeout ); + +/** + * This methods writes a message to the queue. + * + * @param[in] m is the message to send + * + * @return This method returns 0 on success and -1 on error. + */ +extern int uid_send_message( struct MW_UID_MESSAGE *m ); + +/** + * This method registers the device associated with @a fd to + * 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 ); + +/** + * This methods prints the specified UID message using printk + * + * @param[in] uid points to the message to print + */ +void uid_print_message( + struct MW_UID_MESSAGE *uid +); + +/** + * This methods prints the specified UID message using your fprintf + * style method of choice. + * + * @param[in] context is a pointer to a data area which may be + * used by some print handlers + * @param[in] handler is the fprintf style method to invoke + * @param[in] uid points to the message to print + */ +void uid_print_message_with_plugin( + void *context, + rtems_printk_plugin_t handler, + struct MW_UID_MESSAGE *uid +); + +#ifdef __cplusplus +} +#endif + +#endif /* _MW_UID_H */ |