summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/lm32/shared/milkymist_usbinput/usbinput.c
diff options
context:
space:
mode:
authorSebastien Bourdeauducq <sebastien@milkymist.org>2012-03-03 16:02:33 -0500
committerGedare Bloom <gedare@rtems.org>2012-03-03 16:02:33 -0500
commitdc1a3b9c6cffa080780672553a80e43cad2e9732 (patch)
treec4e770a417f7d0531ba600c49ab0fb24c0c8a290 /c/src/lib/libbsp/lm32/shared/milkymist_usbinput/usbinput.c
parentPR2029: Milkymist VGA: adjust video timings (diff)
downloadrtems-dc1a3b9c6cffa080780672553a80e43cad2e9732.tar.bz2
PR 2032: Milkymist USB: Ioctl interface for loading USB firmware
Leave the task of providing a suitable firmware for the Milkymist softusb core to the application instead of having an inflexible array in the driver. Signed-off-by: Gedare Bloom <gedare@rtems.org>
Diffstat (limited to '')
-rw-r--r--c/src/lib/libbsp/lm32/shared/milkymist_usbinput/usbinput.c60
1 files changed, 41 insertions, 19 deletions
diff --git a/c/src/lib/libbsp/lm32/shared/milkymist_usbinput/usbinput.c b/c/src/lib/libbsp/lm32/shared/milkymist_usbinput/usbinput.c
index 69317489a9..d8dd4cc8ce 100644
--- a/c/src/lib/libbsp/lm32/shared/milkymist_usbinput/usbinput.c
+++ b/c/src/lib/libbsp/lm32/shared/milkymist_usbinput/usbinput.c
@@ -8,7 +8,7 @@
*
* $Id$
*
- * COPYRIGHT (c) 2010, 2011 Sebastien Bourdeauducq
+ * COPYRIGHT (c) 2010, 2011, 2012 Sebastien Bourdeauducq
*/
#define RTEMS_STATUS_CHECKS_USE_PRINTK
@@ -25,10 +25,6 @@
#include "../include/system_conf.h"
#include "milkymist_usbinput.h"
-static const unsigned char input_firmware[] = {
-#include "softusb-input.h"
-};
-
#include "comloc.h"
#define DEVICE_NAME "/dev/usbinput"
@@ -76,23 +72,9 @@ rtems_device_driver usbinput_initialize(
)
{
rtems_status_code sc;
- volatile unsigned int *usb_dmem
- = (volatile unsigned int *)MM_SOFTUSB_DMEM_BASE;
- volatile unsigned int *usb_pmem
- = (volatile unsigned int *)MM_SOFTUSB_PMEM_BASE;
- int i, nwords;
rtems_isr_entry dummy;
MM_WRITE(MM_SOFTUSB_CONTROL, SOFTUSB_CONTROL_RESET);
- for(i=0;i<SOFTUSB_DMEM_SIZE/4;i++)
- usb_dmem[i] = 0;
- for(i=0;i<SOFTUSB_PMEM_SIZE/2;i++)
- usb_pmem[i] = 0;
- nwords = (sizeof(input_firmware)+1)/2;
- for(i=0;i<nwords;i++)
- usb_pmem[i] = ((unsigned int)(input_firmware[2*i]))
- |((unsigned int)(input_firmware[2*i+1]) << 8);
- MM_WRITE(MM_SOFTUSB_CONTROL, 0);
mouse_consume = 0;
keyboard_consume = 0;
@@ -157,3 +139,43 @@ rtems_device_driver usbinput_read(
return RTEMS_UNSATISFIED;
}
}
+
+static void load_firmware(const unsigned char *firmware, int length)
+{
+ int i, nwords;
+ volatile unsigned int *usb_dmem
+ = (volatile unsigned int *)MM_SOFTUSB_DMEM_BASE;
+ volatile unsigned int *usb_pmem
+ = (volatile unsigned int *)MM_SOFTUSB_PMEM_BASE;
+
+ MM_WRITE(MM_SOFTUSB_CONTROL, SOFTUSB_CONTROL_RESET);
+ for(i=0;i<SOFTUSB_DMEM_SIZE/4;i++)
+ usb_dmem[i] = 0;
+ for(i=0;i<SOFTUSB_PMEM_SIZE/2;i++)
+ usb_pmem[i] = 0;
+ nwords = (length+1)/2;
+ for(i=0;i<nwords;i++)
+ usb_pmem[i] = ((unsigned int)(firmware[2*i]))
+ |((unsigned int)(firmware[2*i+1]) << 8);
+ MM_WRITE(MM_SOFTUSB_CONTROL, 0);
+}
+
+rtems_device_driver usbinput_control(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *arg
+)
+{
+ rtems_libio_ioctl_args_t *args = arg;
+ struct usbinput_firmware_description *fd
+ = (struct usbinput_firmware_description *)args->buffer;
+
+ if(args->command == USBINPUT_LOAD_FIRMWARE) {
+ load_firmware(fd->data, fd->length);
+ args->ioctl_return = 0;
+ return RTEMS_SUCCESSFUL;
+ } else {
+ args->ioctl_return = -1;
+ return RTEMS_UNSATISFIED;
+ }
+}