Fixed TRACESWO capture.

'mon traceswo' reports serial number and interface/endpoint no for libusb.
Interrupt priorities set so TIM3 for trace is highest priority.
Increased trace endpoint packet size to 64.
Buffer many trace packets into a single usb packet.  Stall on overflow.
Fixed stop bit detection in TIM3 interrupt handler.
This commit is contained in:
Gareth McMullin 2012-04-22 12:22:08 +12:00
parent b39572e17c
commit 86626085d8
4 changed files with 34 additions and 9 deletions

View File

@ -166,6 +166,8 @@ void cmd_morse(void)
static void cmd_traceswo(void)
{
extern char serial_no[9];
traceswo_init();
gdb_outf("%s:%02X:%02X\n", serial_no, 5, 0x85);
}

View File

@ -312,7 +312,7 @@ static const struct usb_endpoint_descriptor trace_endp[] = {{
.bDescriptorType = USB_DT_ENDPOINT,
.bEndpointAddress = 0x85,
.bmAttributes = USB_ENDPOINT_ATTR_BULK,
.wMaxPacketSize = 16,
.wMaxPacketSize = 64,
.bInterval = 0,
}};
@ -378,7 +378,7 @@ static const struct usb_config_descriptor config = {
.interface = ifaces,
};
static char serial_no[9];
char serial_no[9];
static const char *usb_strings[] = {
"x",
@ -518,7 +518,7 @@ static void cdcacm_set_config(u16 wValue)
usbd_ep_setup(0x84, USB_ENDPOINT_ATTR_INTERRUPT, 16, NULL);
/* Trace interface */
usbd_ep_setup(0x85, USB_ENDPOINT_ATTR_BULK, 16, trace_buf_drain);
usbd_ep_setup(0x85, USB_ENDPOINT_ATTR_BULK, 64, trace_buf_drain);
usbd_register_control_callback(
USB_REQ_TYPE_CLASS | USB_REQ_TYPE_INTERFACE,
@ -556,7 +556,9 @@ void cdcacm_init(void)
usbd_set_control_buffer_size(sizeof(usbd_control_buffer));
usbd_register_set_config_callback(cdcacm_set_config);
nvic_set_priority(NVIC_USB_LP_CAN_RX0_IRQ, 1);
nvic_enable_irq(NVIC_USB_LP_CAN_RX0_IRQ);
nvic_set_priority(USB_VBUS_IRQ, 14);
nvic_enable_irq(USB_VBUS_IRQ);
gpio_set(USB_VBUS_PORT, USB_VBUS_PIN);

View File

@ -204,6 +204,7 @@ void uart_init(void)
/* Enable interrupts */
USART1_CR1 |= USART_CR1_RXNEIE;
nvic_set_priority(NVIC_USART1_IRQ, 14);
nvic_enable_irq(NVIC_USART1_IRQ);
}

View File

@ -31,6 +31,8 @@
* These can be capture directly to RAM by DMA.
* The core can then process the buffer to extract the frame.
*/
#include "general.h"
#include <libopencm3/stm32/nvic.h>
#include <libopencm3/stm32/timer.h>
#include <libopencm3/stm32/f1/rcc.h>
@ -66,6 +68,7 @@ void traceswo_init(void)
timer_slave_set_mode(TIM3, TIM_SMCR_SMS_RM);
/* Enable capture interrupt */
nvic_set_priority(NVIC_TIM3_IRQ, 0);
nvic_enable_irq(NVIC_TIM3_IRQ);
timer_enable_irq(TIM3, TIM_DIER_CC1IE);
@ -76,14 +79,20 @@ void traceswo_init(void)
timer_enable_counter(TIM3);
}
static uint8_t trace_usb_buf[16];
static uint8_t trace_usb_buf[64];
static uint8_t trace_usb_buf_size;
void trace_buf_push(uint8_t *buf, int len)
{
if (usbd_ep_write_packet(0x85, buf, len) != len) {
memcpy(trace_usb_buf, buf, len);
trace_usb_buf_size = len;
if (trace_usb_buf_size + len > 64) {
/* Stall if upstream to too slow. */
usbd_ep_stall_set(0x85, 1);
trace_usb_buf_size = 0;
return;
}
memcpy(trace_usb_buf + trace_usb_buf_size, buf, len);
trace_usb_buf_size += len;
}
}
@ -106,6 +115,7 @@ void tim3_isr(void)
static uint8_t lastbit;
static uint8_t decbuf[17];
static uint8_t decbuf_pos;
static uint8_t halfbit;
/* Reset decoder state if capture overflowed */
if (sr & (TIM_SR_CC1OF | TIM_SR_UIF)) {
@ -124,8 +134,7 @@ void tim3_isr(void)
duty = TIM_CCR2(TIM3);
/* Reset decoder state if crazy shit happened */
if ((bt && (((duty / bt) > 2) || ((cycle / bt) > 4))) ||
(duty == 0))
if ((bt && ((duty / bt) > 2)) || (duty == 0))
goto flush_and_reset;
if (!bt) {
@ -136,19 +145,30 @@ void tim3_isr(void)
return;
bt = duty;
lastbit = 1;
halfbit = 0;
timer_set_period(TIM3, duty * 5);
timer_clear_flag(TIM3, TIM_SR_UIF);
timer_enable_irq(TIM3, TIM_DIER_UIE);
} else {
/* If high time is extended we need to flip the bit */
if ((duty / bt) > 1)
if ((duty / bt) > 1) {
if (!halfbit) /* lost sync somehow */
goto flush_and_reset;
halfbit = 0;
lastbit ^= 1;
}
decbuf[decbuf_pos >> 3] |= lastbit << (decbuf_pos & 7);
decbuf_pos++;
}
if (((cycle - duty) / bt) > 2)
goto flush_and_reset;
if (((cycle - duty) / bt) > 1) {
/* If low time extended we need to pack another bit. */
if (halfbit) /* this is a valid stop-bit or we lost sync */
goto flush_and_reset;
halfbit = 1;
lastbit ^= 1;
decbuf[decbuf_pos >> 3] |= lastbit << (decbuf_pos & 7);
decbuf_pos++;