diff options
author | Sebastien Bourdeauducq <sebastien@milkymist.org> | 2012-03-03 16:02:33 -0500 |
---|---|---|
committer | Gedare Bloom <gedare@rtems.org> | 2012-03-03 16:02:33 -0500 |
commit | dc1a3b9c6cffa080780672553a80e43cad2e9732 (patch) | |
tree | c4e770a417f7d0531ba600c49ab0fb24c0c8a290 /c/src/lib/libbsp/lm32/shared/milkymist_usbinput/usbinput.c | |
parent | PR2029: Milkymist VGA: adjust video timings (diff) | |
download | rtems-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.c | 60 |
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; + } +} |