From 2a06cd6240bfc0222fdac51a2c71cc87e43367d6 Mon Sep 17 00:00:00 2001 From: Nicolas Schodet Date: Sat, 26 Jan 2013 18:34:13 +0100 Subject: digital/dev2: set serial speed at runtime --- digital/dev2/src/common/serial.c | 6 ++++++ digital/dev2/src/common/serial.h | 8 ++++++++ digital/dev2/src/usb_serial_isp/main.c | 14 ++++++++++++++ digital/dev2/tools/dev2ctl.py | 10 ++++++++++ 4 files changed, 38 insertions(+) (limited to 'digital/dev2') 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 @@ -51,6 +51,12 @@ serial_uninit (void) IO_PORT (RX) &= ~IO_BV (RX); } +void +serial_set_params (struct serial_parameters_t *params) +{ + uart0_set_speed (params->speed); +} + void serial_task (void) { 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,12 +25,20 @@ * * }}} */ +struct serial_parameters_t +{ + uint32_t speed; +}; + void serial_init (void); void serial_uninit (void); +void +serial_set_params (struct serial_parameters_t *params); + void serial_task (void); 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 (¶ms, sizeof (params)); + serial_set_params (¶ms); + /* 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 -- cgit v1.2.3