summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolas Schodet2013-01-26 18:34:13 +0100
committerNicolas Schodet2013-01-26 18:34:13 +0100
commit2a06cd6240bfc0222fdac51a2c71cc87e43367d6 (patch)
tree99f29133de6ea3b03211d78eb5ab63bcd7b0ee67
parent3953c49f0bb0003f9b1b21bb228f25e4fa45206e (diff)
digital/dev2: set serial speed at runtime
-rw-r--r--digital/dev2/src/common/serial.c6
-rw-r--r--digital/dev2/src/common/serial.h8
-rw-r--r--digital/dev2/src/usb_serial_isp/main.c14
-rwxr-xr-xdigital/dev2/tools/dev2ctl.py10
4 files changed, 38 insertions, 0 deletions
diff --git a/digital/dev2/src/common/serial.c b/digital/dev2/src/common/serial.c
index f7f3fe06..3f2868fa 100644
--- a/digital/dev2/src/common/serial.c
+++ b/digital/dev2/src/common/serial.c
@@ -52,6 +52,12 @@ serial_uninit (void)
}
void
+serial_set_params (struct serial_parameters_t *params)
+{
+ uart0_set_speed (params->speed);
+}
+
+void
serial_task (void)
{
Endpoint_SelectEndpoint (SERIAL_RX_EPNUM);
diff --git a/digital/dev2/src/common/serial.h b/digital/dev2/src/common/serial.h
index 5b55e681..872adf43 100644
--- a/digital/dev2/src/common/serial.h
+++ b/digital/dev2/src/common/serial.h
@@ -25,6 +25,11 @@
*
* }}} */
+struct serial_parameters_t
+{
+ uint32_t speed;
+};
+
void
serial_init (void);
@@ -32,6 +37,9 @@ void
serial_uninit (void);
void
+serial_set_params (struct serial_parameters_t *params);
+
+void
serial_task (void);
#endif /* serial_h */
diff --git a/digital/dev2/src/usb_serial_isp/main.c b/digital/dev2/src/usb_serial_isp/main.c
index 9639fd83..aad4dbe8 100644
--- a/digital/dev2/src/usb_serial_isp/main.c
+++ b/digital/dev2/src/usb_serial_isp/main.c
@@ -135,6 +135,20 @@ EVENT_HANDLER (USB_UnhandledControlPacket)
Endpoint_ClearSetupIN ();
}
break;
+ /* Set serial parameters. */
+ case 0x70:
+ if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_VENDOR |
+ REQREC_DEVICE))
+ {
+ Endpoint_ClearSetupReceived ();
+ /* Set serial parameters. */
+ struct serial_parameters_t params;
+ Endpoint_Read_Control_Stream_LE (&params, sizeof (params));
+ serial_set_params (&params);
+ /* Send acknowledgement. */
+ Endpoint_ClearSetupIN ();
+ }
+ break;
}
}
diff --git a/digital/dev2/tools/dev2ctl.py b/digital/dev2/tools/dev2ctl.py
index aa69832a..4fd64f65 100755
--- a/digital/dev2/tools/dev2ctl.py
+++ b/digital/dev2/tools/dev2ctl.py
@@ -26,6 +26,7 @@
import sys
from optparse import OptionParser
import usb
+import struct
# Parse options.
opt = OptionParser (description = __doc__)
@@ -35,6 +36,8 @@ opt.add_option ('-u', '--unselect', action = 'store_true', default = False,
help = 'unselect outputs')
opt.add_option ('-g', '--gpio', type = 'int', nargs = 2,
help = 'set DDR and PORT', metavar = 'DDR PORT')
+opt.add_option ('-S', '--serial', type = 'int',
+ help = 'send serial parameters', metavar = 'SPEED')
opt.add_option ('-d', '--dfu', action = 'store_true', default = False,
help = 'go to DFU boot loader')
@@ -43,6 +46,7 @@ if args:
opt.error ('too many arguments')
if ((options.select is not None) + options.unselect
+ (options.gpio is not None)
+ + (options.serial is not None)
+ options.dfu != 1):
opt.error ('choose one of available options')
if options.select is not None and (options.select < 1 or options.select > 4):
@@ -79,5 +83,11 @@ elif options.gpio is not None:
sys.exit (1)
d.controlMsg (usb.TYPE_VENDOR | usb.RECIP_DEVICE, 0x80, 0,
value = options.gpio[0] | (options.gpio[1] << 8))
+elif options.serial is not None:
+ if 'serial' not in prod:
+ print >> sys.stderr, 'not a serial device'
+ sys.exit (1)
+ d.controlMsg (usb.TYPE_VENDOR | usb.RECIP_DEVICE, 0x70,
+ struct.pack ('L', options.serial))
else:
assert 0