summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2011-02-09 15:57:29 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2011-02-09 15:57:29 +0000
commitad6b881fa1713a66f14d557ac857109149fad3b0 (patch)
treeb83c1fa3bb94821b26a07e59d743bdc97fb015f2
parent2011-02-09 Ralf Corsépius <ralf.corsepius@rtems.org> (diff)
downloadrtems-ad6b881fa1713a66f14d557ac857109149fad3b0.tar.bz2
2011-02-09 Jennifer Averett <jennifer.averett@oarcorp.com>
* console/ps2_mouse.c: Formatting changes in preparation for making mouse parsing and serial mouse driver BSP independent.
-rw-r--r--c/src/lib/libbsp/i386/pc386/ChangeLog5
-rw-r--r--c/src/lib/libbsp/i386/pc386/console/ps2_mouse.c596
2 files changed, 244 insertions, 357 deletions
diff --git a/c/src/lib/libbsp/i386/pc386/ChangeLog b/c/src/lib/libbsp/i386/pc386/ChangeLog
index 85c360491c..e9c843e58a 100644
--- a/c/src/lib/libbsp/i386/pc386/ChangeLog
+++ b/c/src/lib/libbsp/i386/pc386/ChangeLog
@@ -1,3 +1,8 @@
+2011-02-09 Jennifer Averett <jennifer.averett@oarcorp.com>
+
+ * console/ps2_mouse.c: Formatting changes in preparation for making
+ mouse parsing and serial mouse driver BSP independent.
+
2011-02-09 Ralf Corsépius <ralf.corsepius@rtems.org>
* timer/timer.c: Include <rtems/btimer.h>.
diff --git a/c/src/lib/libbsp/i386/pc386/console/ps2_mouse.c b/c/src/lib/libbsp/i386/pc386/console/ps2_mouse.c
index 58694066cc..893bb2c669 100644
--- a/c/src/lib/libbsp/i386/pc386/console/ps2_mouse.c
+++ b/c/src/lib/libbsp/i386/pc386/console/ps2_mouse.c
@@ -68,7 +68,7 @@ static void ( *driver_input_handler_ps2 )( void *, unsigned char *, int ) = 0;
*/
void ps2_set_driver_handler( int port, void ( *handler )( void *, unsigned char *, int ) )
{
- driver_input_handler_ps2 = handler;
+ driver_input_handler_ps2 = handler;
}
static void mdelay( unsigned long t )
@@ -117,82 +117,80 @@ static rtems_irq_connect_data ps2_isr_data = { AUX_IRQ,
static void kb_wait(void)
{
- unsigned long timeout = KBC_TIMEOUT;
+ unsigned long timeout = KBC_TIMEOUT;
- do {
- /*
- * "handle_kbd_event()" will handle any incoming events
- * while we wait - keypresses or mouse movement.
- */
- unsigned char status = handle_kbd_event();
+ do {
+ /*
+ * "handle_kbd_event()" will handle any incoming events
+ * while we wait - keypresses or mouse movement.
+ */
+ unsigned char status = handle_kbd_event();
- if (! (status & KBD_STAT_IBF))
- return;
+ if (! (status & KBD_STAT_IBF))
+ return;
- mdelay(1);
+ mdelay(1);
+ timeout--;
+ } while (timeout);
- timeout--;
- } while (timeout);
-#ifdef KBD_REPORT_TIMEOUTS
- printk( "Keyboard timed out[1]\n");
-#endif
+ #ifdef KBD_REPORT_TIMEOUTS
+ printk( "Keyboard timed out[1]\n");
+ #endif
}
static int do_acknowledge(unsigned char scancode)
{
- if (reply_expected) {
- /* Unfortunately, we must recognise these codes only if we know they
- * are known to be valid (i.e., after sending a command), because there
- * are some brain-damaged keyboards (yes, FOCUS 9000 again) which have
- * keys with such codes :(
- */
- if (scancode == KBD_REPLY_ACK) {
- acknowledge = 1;
- reply_expected = 0;
- return 0;
- } else if (scancode == KBD_REPLY_RESEND) {
- resend = 1;
- reply_expected = 0;
- return 0;
- }
- /* Should not happen... */
-#if 0
- printk( "keyboard reply expected - got %02x\n",
- scancode);
-#endif
- }
- return 1;
+ if (reply_expected) {
+
+ /* Unfortunately, we must recognise these codes only if we know they
+ * are known to be valid (i.e., after sending a command), because there
+ * are some brain-damaged keyboards (yes, FOCUS 9000 again) which have
+ * keys with such codes :(
+ */
+ if (scancode == KBD_REPLY_ACK) {
+ acknowledge = 1;
+ reply_expected = 0;
+ return 0;
+ } else if (scancode == KBD_REPLY_RESEND) {
+ resend = 1;
+ reply_expected = 0;
+ return 0;
+ }
+
+ /* Should not happen... */
+ #if 0
+ printk( "keyboard reply expected - got %02x\n", scancode);
+ #endif
+ }
+ return 1;
}
static inline void handle_mouse_event(unsigned char scancode)
{
- if (mouse_reply_expected) {
- if (scancode == AUX_ACK) {
- mouse_reply_expected--;
- return;
- }
- mouse_reply_expected = 0;
- }
-
- if (aux_count) {
- int head = queue->head;
-
- queue->buf[head] = scancode;
- head = (head + 1) & (AUX_BUF_SIZE-1);
- if (head != queue->tail) {
- queue->head = head;
- }
- /* if the input queue is active, add to it */
- if( driver_input_handler_ps2 )
- {
- driver_input_handler_ps2( NULL, &scancode, 1 );
- }
- else
- {
- /* post this byte to termios */
- rtems_termios_enqueue_raw_characters( termios_ttyp_paux, (char *)&scancode, 1 );
- }
- }
+ if (mouse_reply_expected) {
+ if (scancode == AUX_ACK) {
+ mouse_reply_expected--;
+ return;
+ }
+ mouse_reply_expected = 0;
+ }
+
+ if (aux_count) {
+ int head = queue->head;
+ queue->buf[head] = scancode;
+ head = (head + 1) & (AUX_BUF_SIZE-1);
+ if (head != queue->tail) {
+ queue->head = head;
+ }
+
+ /* if the input queue is active, add to it */
+ if( driver_input_handler_ps2 ) {
+ driver_input_handler_ps2( NULL, &scancode, 1 );
+ } else {
+ /* post this byte to termios */
+ rtems_termios_enqueue_raw_characters( termios_ttyp_paux, (char *)&scancode, 1 );
+ }
+ }
}
/*
@@ -204,141 +202,44 @@ static inline void handle_mouse_event(unsigned char scancode)
*/
static unsigned char handle_kbd_event(void)
{
- unsigned char status = kbd_read_status();
- unsigned int work = 10000;
-
- while (status & KBD_STAT_OBF) {
- unsigned char scancode;
-
- scancode = kbd_read_input();
-
- if (status & KBD_STAT_MOUSE_OBF) {
- handle_mouse_event(scancode);
- } else {
- do_acknowledge(scancode);
- printk("pc_keyb: %X ", scancode );
- }
- status = kbd_read_status();
- if(!work--)
- {
- printk("pc_keyb: controller jammed (0x%02X).\n",
- status);
- break;
- }
- }
-
- return status;
+ unsigned char status = kbd_read_status();
+ unsigned int work = 10000;
+
+ while (status & KBD_STAT_OBF) {
+ unsigned char scancode;
+ scancode = kbd_read_input();
+ if (status & KBD_STAT_MOUSE_OBF) {
+ handle_mouse_event(scancode);
+ } else {
+ do_acknowledge(scancode);
+ printk("pc_keyb: %X ", scancode );
+ }
+ status = kbd_read_status();
+ if(!work--) {
+ printk("pc_keyb: controller jammed (0x%02X).\n", status);
+ break;
+ }
+ }
+ return status;
}
static void ps2_mouse_interrupt(rtems_irq_hdl_param ignored)
{
- handle_kbd_event();
-}
-
-/*
- * send_data sends a character to the keyboard and waits
- * for an acknowledge, possibly retrying if asked to. Returns
- * the success status.
- *
- * Don't use 'jiffies', so that we don't depend on interrupts
- */
-#if 0
-static int send_data(unsigned char data)
-{
- int retries = 3;
-
- do {
- unsigned long timeout = KBD_TIMEOUT;
-
- acknowledge = 0; /* Set by interrupt routine on receipt of ACK. */
- resend = 0;
- reply_expected = 1;
- kbd_write_output_w(data);
- for (;;) {
- if (acknowledge)
- return 1;
- if (resend)
- break;
- mdelay(1);
- if (!--timeout) {
-#ifdef KBD_REPORT_TIMEOUTS
- printk( "Keyboard timeout[2]\n");
-#endif
- return 0;
- }
- }
- } while (retries-- > 0);
-#ifdef KBD_REPORT_TIMEOUTS
- printk( "keyboard: Too many NACKs -- noisy kbd cable?\n");
-#endif
- return 0;
-}
-#endif
-
-#if 0
-#define KBD_NO_DATA (-1) /* No data */
-#define KBD_BAD_DATA (-2) /* Parity or other error */
-
-static int kbd_read_data(void)
-{
- int retval = KBD_NO_DATA;
- unsigned char status;
-
- status = kbd_read_status();
- if (status & KBD_STAT_OBF) {
- unsigned char data = kbd_read_input();
-
- retval = data;
- if (status & (KBD_STAT_GTO | KBD_STAT_PERR))
- retval = KBD_BAD_DATA;
- }
- return retval;
-}
-
-static void kbd_clear_input(void)
-{
- int maxread = 100; /* Random number */
-
- do {
- if (kbd_read_data() == KBD_NO_DATA)
- break;
- } while (--maxread);
-}
-
-static int kbd_wait_for_input(void)
-{
- long timeout = KBD_INIT_TIMEOUT;
-
- do {
- int retval = kbd_read_data();
- if (retval >= 0)
- return retval;
- mdelay(1);
- } while (--timeout);
- return -1;
+ handle_kbd_event();
}
-#endif
static void kbd_write_command_w(int data)
{
- kb_wait();
- kbd_write_command(data);
+ kb_wait();
+ kbd_write_command(data);
}
-#if 0
-static void kbd_write_output_w(int data)
-{
- kb_wait();
- kbd_write_output(data);
-}
-#endif
-
static void kbd_write_cmd(int cmd)
{
- kb_wait();
- kbd_write_command(KBD_CCMD_WRITE_MODE);
- kb_wait();
- kbd_write_output(cmd);
+ kb_wait();
+ kbd_write_command(KBD_CCMD_WRITE_MODE);
+ kb_wait();
+ kbd_write_output(cmd);
}
/*
@@ -346,36 +247,35 @@ static void kbd_write_cmd(int cmd)
*/
static int detect_auxiliary_port(void)
{
- int loops = 10;
- int retval = 0;
-
- /* Put the value 0x5A in the output buffer using the "Write
- * Auxiliary Device Output Buffer" command (0xD3). Poll the
- * Status Register for a while to see if the value really
- * turns up in the Data Register. If the KBD_STAT_MOUSE_OBF
- * bit is also set to 1 in the Status Register, we assume this
- * controller has an Auxiliary Port (a.k.a. Mouse Port).
- */
- kb_wait();
- kbd_write_command(KBD_CCMD_WRITE_AUX_OBUF);
-
- kb_wait();
- kbd_write_output(0x5a); /* 0x5a is a random dummy value. */
-
- do {
- unsigned char status = kbd_read_status();
-
- if (status & KBD_STAT_OBF) {
- (void) kbd_read_input();
- if (status & KBD_STAT_MOUSE_OBF) {
- printk( "Detected PS/2 Mouse Port.\n");
- retval = 1;
- }
- break;
- }
- mdelay(1);
- } while (--loops);
- return retval;
+ int loops = 10;
+ int retval = 0;
+
+ /* Put the value 0x5A in the output buffer using the "Write
+ * Auxiliary Device Output Buffer" command (0xD3). Poll the
+ * Status Register for a while to see if the value really
+ * turns up in the Data Register. If the KBD_STAT_MOUSE_OBF
+ * bit is also set to 1 in the Status Register, we assume this
+ * controller has an Auxiliary Port (a.k.a. Mouse Port).
+ */
+ kb_wait();
+ kbd_write_command(KBD_CCMD_WRITE_AUX_OBUF);
+
+ kb_wait();
+ kbd_write_output(0x5a); /* 0x5a is a random dummy value. */
+
+ do {
+ unsigned char status = kbd_read_status();
+ if (status & KBD_STAT_OBF) {
+ kbd_read_input();
+ if (status & KBD_STAT_MOUSE_OBF) {
+ printk( "Detected PS/2 Mouse Port.\n");
+ retval = 1;
+ }
+ break;
+ }
+ mdelay(1);
+ } while (--loops);
+ return retval;
}
/*
@@ -383,10 +283,10 @@ static int detect_auxiliary_port(void)
*/
static void aux_write_dev(int val)
{
- kb_wait();
- kbd_write_command(KBD_CCMD_WRITE_MOUSE);
- kb_wait();
- kbd_write_output(val);
+ kb_wait();
+ kbd_write_command(KBD_CCMD_WRITE_MOUSE);
+ kb_wait();
+ kbd_write_output(val);
}
/*
@@ -394,26 +294,26 @@ static void aux_write_dev(int val)
*/
static void aux_write_ack(int val)
{
- kb_wait();
- kbd_write_command(KBD_CCMD_WRITE_MOUSE);
- kb_wait();
- kbd_write_output(val);
- /* we expect an ACK in response. */
- mouse_reply_expected++;
- kb_wait();
+ kb_wait();
+ kbd_write_command(KBD_CCMD_WRITE_MOUSE);
+ kb_wait();
+ kbd_write_output(val);
+ /* we expect an ACK in response. */
+ mouse_reply_expected++;
+ kb_wait();
}
static unsigned char get_from_queue(void)
{
- unsigned char result;
- result = queue->buf[queue->tail];
- queue->tail = (queue->tail + 1) & (AUX_BUF_SIZE-1);
- return result;
+ unsigned char result;
+ result = queue->buf[queue->tail];
+ queue->tail = (queue->tail + 1) & (AUX_BUF_SIZE-1);
+ return result;
}
static int queue_empty(void)
{
- return queue->head == queue->tail;
+ return queue->head == queue->tail;
}
/*
@@ -423,14 +323,14 @@ static int queue_empty(void)
static int release_aux(void)
{
- if (--aux_count)
- return 0;
- kbd_write_cmd(AUX_INTS_OFF); /* Disable controller ints */
- kbd_write_command_w(KBD_CCMD_MOUSE_DISABLE);
-
- BSP_remove_rtems_irq_handler( &ps2_isr_data );
- return 0;
+ if (--aux_count)
+ return 0;
+ kbd_write_cmd(AUX_INTS_OFF); /* Disable controller ints */
+ kbd_write_command_w(KBD_CCMD_MOUSE_DISABLE);
+ BSP_remove_rtems_irq_handler( &ps2_isr_data );
+ return 0;
}
+
/*
* Install interrupt handler.
* Enable auxiliary device.
@@ -463,116 +363,98 @@ static int open_aux(void)
*/
size_t read_aux(char * buffer, size_t count )
{
- size_t i = count;
- unsigned char c;
-
- if (queue_empty())
- {
- return 0;
- }
- while (i > 0 && !queue_empty())
- {
- c = get_from_queue();
- *buffer++ = c;
- i--;
- }
- return count-i;
+ size_t i = count;
+ unsigned char c;
+
+ if (queue_empty()) {
+ return 0;
+ }
+ while (i > 0 && !queue_empty()) {
+ c = get_from_queue();
+ *buffer++ = c;
+ i--;
+ }
+ return count-i;
}
/*
* Write to the aux device.
*/
-
static int write_aux( int minor, const char * buffer, int count )
{
- int retval = 0;
-
- if (count) {
- int written = 0;
-
- if (count > 32)
- count = 32; /* Limit to 32 bytes. */
- do {
- char c;
- c = *buffer++;
- aux_write_dev(c);
- written++;
- } while (--count);
- retval = -EIO;
- if (written) {
- retval = written;
- }
- }
- return retval;
-}
-
-#if 0
-static unsigned int aux_poll()
-{
- if( !queue_empty() )
- return 1;
- return 0;
+ int retval = 0;
+
+ if (count) {
+ int written = 0;
+ if (count > 32)
+ count = 32; /* Limit to 32 bytes. */
+ do {
+ char c;
+ c = *buffer++;
+ aux_write_dev(c);
+ written++;
+ } while (--count);
+ retval = -EIO;
+ if (written) {
+ retval = written;
+ }
+ }
+ return retval;
}
-#endif
static int psaux_init( void )
{
- if( !detect_auxiliary_port() )
- {
- printk( "PS/2 - mouse not found.\n" );
- return -EIO;
- }
-
- queue = (struct aux_queue *)malloc( sizeof(*queue) );
- memset(queue, 0, sizeof(*queue));
- queue->head = queue->tail = 0;
- queue->proc_list = NULL;
-
-#ifdef INITIALIZE_MOUSE
- kbd_write_command_w(KBD_CCMD_MOUSE_ENABLE); /* Enable Aux. */
- aux_write_ack(AUX_SET_SAMPLE);
- aux_write_ack(100); /* 100 samples/sec */
- aux_write_ack(AUX_SET_RES);
- aux_write_ack(3); /* 8 counts per mm */
- aux_write_ack(AUX_SET_SCALE21); /* 2:1 scaling */
-#endif /* INITIALIZE_MOUSE */
- kbd_write_command(KBD_CCMD_MOUSE_DISABLE); /* Disable aux device. */
- kbd_write_cmd(AUX_INTS_OFF); /* Disable controller ints. */
- return 0;
+ if( !detect_auxiliary_port() ) {
+ printk( "PS/2 - mouse not found.\n" );
+ return -EIO;
+ }
+ queue = (struct aux_queue *)malloc( sizeof(*queue) );
+ memset(queue, 0, sizeof(*queue));
+ queue->head = queue->tail = 0;
+ queue->proc_list = NULL;
+
+ #ifdef INITIALIZE_MOUSE
+ kbd_write_command_w(KBD_CCMD_MOUSE_ENABLE); /* Enable Aux. */
+ aux_write_ack(AUX_SET_SAMPLE);
+ aux_write_ack(100); /* 100 samples/sec */
+ aux_write_ack(AUX_SET_RES);
+ aux_write_ack(3); /* 8 counts per mm */
+ aux_write_ack(AUX_SET_SCALE21); /* 2:1 scaling */
+ #endif /* INITIALIZE_MOUSE */
+ kbd_write_command(KBD_CCMD_MOUSE_DISABLE); /* Disable aux device. */
+ kbd_write_cmd(AUX_INTS_OFF); /* Disable controller ints. */
+ return 0;
}
/*
* paux device driver INITIALIZE entry point.
*/
-rtems_device_driver
-paux_initialize( rtems_device_major_number major,
- rtems_device_minor_number minor,
- void *arg)
+rtems_device_driver paux_initialize(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *arg)
{
- rtems_status_code status;
+ rtems_status_code status;
/*
* Set up TERMIOS
*/
- rtems_termios_initialize();
-
- printk( "PS/2 mouse probe.\n" );
- if( psaux_init() < 0 )
- {
- printk("Error detecting PS/2 mouse --\n");
+ rtems_termios_initialize();
- /* we might want to finish the application here !!! */
- }
- open_aux();
+ printk( "PS/2 mouse probe.\n" );
+ if( psaux_init() < 0 ) {
+ printk("Error detecting PS/2 mouse --\n");
+ /* we might want to finish the application here !!! */
+ }
+ open_aux();
/*
* Register the device
*/
status = rtems_io_register_name ("/dev/mouse", major, 0);
- if (status != RTEMS_SUCCESSFUL)
- {
- printk("Error registering paux device!\n");
- rtems_fatal_error_occurred (status);
+ if (status != RTEMS_SUCCESSFUL) {
+ printk("Error registering paux device!\n");
+ rtems_fatal_error_occurred (status);
}
return RTEMS_SUCCESSFUL;
} /* tty_initialize */
@@ -590,16 +472,16 @@ static int paux_last_close(int major, int minor, void *arg)
*/
static ssize_t write_aux_echo( int minor, const char * buffer, size_t count )
{
- return 0;
+ return 0;
}
/*
* paux device driver OPEN entry point
*/
-rtems_device_driver
-paux_open(rtems_device_major_number major,
- rtems_device_minor_number minor,
- void *arg)
+rtems_device_driver paux_open(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *arg)
{
rtems_status_code status;
static rtems_termios_callbacks cb =
@@ -622,10 +504,10 @@ paux_open(rtems_device_major_number major,
/*
* paux device driver CLOSE entry point
*/
-rtems_device_driver
-paux_close(rtems_device_major_number major,
- rtems_device_minor_number minor,
- void *arg)
+rtems_device_driver paux_close(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *arg)
{
return (rtems_termios_close (arg));
}
@@ -634,10 +516,10 @@ paux_close(rtems_device_major_number major,
* paux device driver READ entry point.
* Read characters from the PS/2 mouse.
*/
-rtems_device_driver
-paux_read(rtems_device_major_number major,
- rtems_device_minor_number minor,
- void *arg)
+rtems_device_driver paux_read(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *arg)
{
return rtems_termios_read (arg);
} /* tty_read */
@@ -646,10 +528,10 @@ paux_read(rtems_device_major_number major,
* paux device driver WRITE entry point.
* Write characters to the PS/2 mouse.
*/
-rtems_device_driver
-paux_write(rtems_device_major_number major,
- rtems_device_minor_number minor,
- void * arg)
+rtems_device_driver paux_write(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *arg)
{
rtems_libio_rw_args_t *rw_args = (rtems_libio_rw_args_t *)arg;
char *buffer = rw_args->buffer;
@@ -661,28 +543,28 @@ paux_write(rtems_device_major_number major,
/*
* Handle ioctl request.
*/
-rtems_device_driver
-paux_control(rtems_device_major_number major,
- rtems_device_minor_number minor,
- void * arg
+rtems_device_driver paux_control(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *arg
)
{
- rtems_libio_ioctl_args_t *args = arg;
- switch( args->command )
- {
- default:
+ rtems_libio_ioctl_args_t *args = arg;
+
+ switch( args->command ) {
+ default:
return rtems_termios_ioctl (arg);
- break;
+ break;
- case MW_UID_REGISTER_DEVICE:
+ case MW_UID_REGISTER_DEVICE:
printk( "PS2 Mouse: reg=%s\n", args->buffer );
register_mou_msg_queue( args->buffer, -1 );
- break;
+ break;
- case MW_UID_UNREGISTER_DEVICE:
+ case MW_UID_UNREGISTER_DEVICE:
unregister_mou_msg_queue( -1 );
- break;
- }
- args->ioctl_return = 0;
- return RTEMS_SUCCESSFUL;
+ break;
+ }
+ args->ioctl_return = 0;
+ return RTEMS_SUCCESSFUL;
}