summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/lm32/shared/milkymist_usbinput/usbinput.c
diff options
context:
space:
mode:
Diffstat (limited to 'c/src/lib/libbsp/lm32/shared/milkymist_usbinput/usbinput.c')
-rw-r--r--c/src/lib/libbsp/lm32/shared/milkymist_usbinput/usbinput.c70
1 files changed, 51 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 022d7306f6..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,16 +25,13 @@
#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"
static int mouse_consume;
static int keyboard_consume;
+static int midi_consume;
static rtems_id event_q;
@@ -58,6 +55,14 @@ static rtems_isr interrupt_handler(rtems_vector_number n)
rtems_message_queue_send(event_q, msg, 8);
keyboard_consume = (keyboard_consume + 1) & 0x07;
}
+
+ while(midi_consume != COMLOC_MIDI_PRODUCE) {
+ for(i=0;i<3;i++)
+ msg[i] = COMLOC_MIDI(4*midi_consume+i+1);
+ rtems_message_queue_send(event_q, msg, 3);
+ midi_consume = (midi_consume + 1) & 0x0f;
+ }
+
}
rtems_device_driver usbinput_initialize(
@@ -67,26 +72,13 @@ 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;
+ midi_consume = 0;
sc = rtems_io_register_name(DEVICE_NAME, major, 0);
RTEMS_CHECK_SC(sc, "create USB input device");
@@ -147,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;
+ }
+}