Skip to content

Commit

Permalink
* Reset on USB Resume, to get a clean state
Browse files Browse the repository at this point in the history
* Increase USB hotplug detect threshold
* SPI stack slave gives up immediately if message length too long
  • Loading branch information
borg42 committed Mar 28, 2014
1 parent 1018c1c commit c8e767d
Show file tree
Hide file tree
Showing 6 changed files with 58 additions and 21 deletions.
10 changes: 9 additions & 1 deletion com/spi/spi_stack/spi_stack_slave.c
@@ -1,5 +1,5 @@
/* bricklib
* Copyright (C) 2010-2012 Olaf Lüke <olaf@tinkerforge.com>
* Copyright (C) 2010-2014 Olaf Lüke <olaf@tinkerforge.com>
*
* spi_stack_slave.c: SPI stack slave functionality
*
Expand Down Expand Up @@ -101,14 +101,22 @@ void SPI_IrqHandler(void) {

SPI_EnableIt(SPI, SPI_IER_RDRF);
__enable_irq();
return;
}

// Something is wrong, this size is not allowed
if(master_length > SPI_STACK_BUFFER_SIZE) {
SPI_EnableIt(SPI, SPI_IER_RDRF);
__enable_irq();
return;
}

// Length to transceive is maximum of slave and master length
uint8_t max_length = MIN(MAX(spi_stack_buffer_size_send, master_length),
SPI_STACK_BUFFER_SIZE);



// Exchange data
for(uint8_t i = 1; i < max_length; i++) {
// Write
Expand Down
29 changes: 15 additions & 14 deletions com/usb/usb.c
@@ -1,5 +1,5 @@
/* bricklib
* Copyright (C) 2009-2012 Olaf Lüke <olaf@tinkerforge.com>
* Copyright (C) 2009-2014 Olaf Lüke <olaf@tinkerforge.com>
*
* usb.c: Communication interface implementation for USB
*
Expand Down Expand Up @@ -55,6 +55,8 @@
#define USB_IN_FUNCTION 1
#define USB_CALLBACK 2

extern uint8_t reset_counter;

extern const USBDDriverDescriptors driver_descriptors;
static USBDDriver usbd_driver;
static uint32_t usb_send_transferred = 0;
Expand Down Expand Up @@ -153,13 +155,9 @@ inline uint16_t usb_recv(void *data, const uint16_t length, uint32_t *options) {
return tmp;
}

void usb_isr_vbus(const Pin *pin) {
brick_reset();
}

bool usb_is_connected(void) {
#ifdef BRICK_CAN_BE_MASTER
return adc_channel_get_data(USB_VOLTAGE_CHANNEL) > USB_VOLTAGE_REFERENCE/2;
return adc_channel_get_data(USB_VOLTAGE_CHANNEL) > VOLTAGE_MAX_VALUE*2/3;
#else
return PIO_Get(&pin_usb_detect);
#endif
Expand All @@ -170,21 +168,24 @@ void usb_detect_configure(void) {
pin_usb_detect.attribute = PIO_PULLDOWN;
PIO_Configure(&pin_usb_detect, 1);
// We use usb_detect_task instead of interrupt
/*
#ifndef BRICK_CAN_BE_MASTER
// Configure PIO
PIO_Configure(&pin_usb_detect, 1);
PIO_ConfigureIt(&pin_usb_detect, usb_isr_vbus);
PIO_EnableIt(&pin_usb_detect);
#endif*/
}

void usb_detect_task(const uint8_t tick_type) {
if(tick_type == TICK_TASK_TYPE_CALCULATION) {
// Reset through usb resume
if(reset_counter > 0) {
reset_counter++;
if(reset_counter == 255) {
brick_reset();
}
}

// Reset through usb detect
if(usb_startup_connected ^ usb_is_connected()) {
usb_detect_task_counter++;
if(usb_detect_task_counter >= 250) {
usb_isr_vbus(NULL);
logi("USB detect: %d\n\r", adc_channel_get_data(USB_VOLTAGE_CHANNEL));
brick_reset();
}
} else {
usb_detect_task_counter = 0;
Expand Down
3 changes: 1 addition & 2 deletions com/usb/usb.h
@@ -1,5 +1,5 @@
/* bricklib
* Copyright (C) 2009-2012 Olaf Lüke <olaf@tinkerforge.com>
* Copyright (C) 2009-2014 Olaf Lüke <olaf@tinkerforge.com>
*
* usb.h: Communication interface implementation for USB
*
Expand Down Expand Up @@ -49,7 +49,6 @@ void usb_recv_callback(void *arg,
uint16_t usb_send(const void *data, const uint16_t length, uint32_t *options);
uint16_t usb_recv(void *data, const uint16_t length, uint32_t *options);

void usb_isr_vbus(const Pin *pin);
void usb_detect_configure(void);
void usb_detect_task(const uint8_t tick_type);
void usb_configure_clock_48mhz(void);
Expand Down
12 changes: 10 additions & 2 deletions com/usb/usb_callbacks.c
@@ -1,5 +1,5 @@
/* bricklib
* Copyright (C) 2010 Olaf Lüke <olaf@tinkerforge.com>
* Copyright (C) 2010-2014 Olaf Lüke <olaf@tinkerforge.com>
*
* usb_callbacks.c: USB callback functions
*
Expand All @@ -24,17 +24,25 @@
#include "config.h"
#include "bricklib/drivers/cmsis/core_cm3.h"
#include "bricklib/logging/logging.h"
#include "bricklib/utility/init.h"

bool usb_first_connection = true;

uint8_t reset_counter = 0;

// Invoked after the USB driver has been initialized.
// Configures the UDP/UDPHS interrupt.
void USBDCallbacks_Initialized(void) {
NVIC_EnableIRQ(UDP_IRQn);
logi("USBDCallbacks_Initialized\n\r");
}

void USBDCallbacks_Resumed(void) {
logi("UDP_ENDPOINT_IDLE\n\r");
logi("USBDCallbacks_Resumed\n\r");
if(!usb_first_connection) {
logi("Brick will reset in 255ms\n\r");
reset_counter = 1;
}
}

void USBDCallbacks_Suspended(void) {
Expand Down
20 changes: 19 additions & 1 deletion utility/init.c
@@ -1,5 +1,5 @@
/* bricklib
* Copyright (C) 2010-2013 Olaf Lüke <olaf@tinkerforge.com>
* Copyright (C) 2010-2014 Olaf Lüke <olaf@tinkerforge.com>
*
* init.c: Implementation of initialization valid for all bricks
*
Expand Down Expand Up @@ -103,9 +103,27 @@ void brick_init(void) {
#endif
logsi("A/D converter initialized\n\r");

// brick_enable_brownout_detection();

bricklet_init();
}

void SUPC_IrqHandler(void) {
loge("SUPC: %x\n\r", SUPC->SUPC_SR);
while(1);
}


void brick_enable_brownout_detection(void) {
SUPC->SUPC_MR |= SUPC_MR_KEY(0xA5) | SUPC_MR_BODDIS_ENABLE;
// SUPC->SUPC_SMMR |= SUPC_SMMR_SMSMPL_CSM | SUPC_SMMR_SMTH_3_2V | SUPC_SMMR_SMIEN_ENABLE;
volatile uint32_t tmp = SUPC->SUPC_SR; // clear sms and smos
NVIC_DisableIRQ(SUPC_IRQn);
NVIC_ClearPendingIRQ(SUPC_IRQn);
NVIC_SetPriority(SUPC_IRQn, 0);
NVIC_EnableIRQ(SUPC_IRQn);
}

void brick_reset(void) {
logd("brick_reset\n\r");
RSTC->RSTC_MR = RSTC_MR_URSTEN |
Expand Down
5 changes: 4 additions & 1 deletion utility/init.h
@@ -1,5 +1,5 @@
/* bricklib
* Copyright (C) 2010-2012 Olaf Lüke <olaf@tinkerforge.com>
* Copyright (C) 2010-2014 Olaf Lüke <olaf@tinkerforge.com>
*
* init.h: Implementation of initialization valid for all bricks
*
Expand Down Expand Up @@ -29,8 +29,11 @@
#define TICK_TASK_TYPE_MESSAGE 1
#define TICK_TASK_TYPE_CALCULATION 2

void SUPC_IrqHandler(void);

void brick_init(void);
void brick_init_new_connection(void);
void brick_enable_brownout_detection(void);
void brick_tick_task(void *parameters);
void brick_init_start_tick_task(void);
void brick_reset(void);
Expand Down

0 comments on commit c8e767d

Please sign in to comment.