Monitor USB VBUS to control D+ pull-up resistor.

This commit is contained in:
Gareth McMullin 2012-03-24 19:25:16 +13:00
parent ebf15cf5e2
commit c0493ee0e8
2 changed files with 38 additions and 6 deletions

View File

@ -28,6 +28,7 @@
#include <libopencm3/stm32/f1/rcc.h>
#include <libopencm3/stm32/nvic.h>
#include <libopencm3/stm32/exti.h>
#include <libopencm3/stm32/f1/gpio.h>
#include <libopencm3/usb/usbd.h>
#include <libopencm3/usb/cdc.h>
@ -436,8 +437,6 @@ static int cdcacm_control_request(struct usb_setup_data *req, uint8_t **buf,
#endif
case DFU_GETSTATUS:
if(req->wIndex == DFU_IF_NO) {
u32 bwPollTimeout = 0; /* 24-bit integer in DFU class spec */
(*buf)[0] = DFU_STATUS_OK;
(*buf)[1] = 0;
(*buf)[2] = 0;
@ -526,6 +525,8 @@ uint8_t usbd_control_buffer[256];
void cdcacm_init(void)
{
void exti15_10_isr(void);
get_dev_unique_id(serial_no);
usbd_init(&stm32f103_usb_driver, &dev, &config, usb_strings);
@ -533,10 +534,20 @@ void cdcacm_init(void)
usbd_register_set_config_callback(cdcacm_set_config);
nvic_enable_irq(NVIC_USB_LP_CAN_RX0_IRQ);
nvic_enable_irq(USB_VBUS_IRQ);
gpio_set(USB_VBUS_PORT, USB_VBUS_PIN);
gpio_set(USB_PU_PORT, USB_PU_PIN);
gpio_set_mode(USB_PU_PORT, GPIO_MODE_OUTPUT_10_MHZ,
GPIO_CNF_OUTPUT_PUSHPULL, USB_PU_PIN);
gpio_set_mode(USB_VBUS_PORT, GPIO_MODE_INPUT,
GPIO_CNF_INPUT_PULL_UPDOWN, USB_VBUS_PIN);
/* Configure EXTI for USB VBUS monitor */
exti_select_source(USB_VBUS_PIN, USB_VBUS_PORT);
exti_set_trigger(USB_VBUS_PIN, EXTI_TRIGGER_BOTH);
exti_enable_request(USB_VBUS_PIN);
exti15_10_isr();
}
void usb_lp_can_rx0_isr(void)
@ -544,6 +555,21 @@ void usb_lp_can_rx0_isr(void)
usbd_poll();
}
void exti15_10_isr(void)
{
if (gpio_get(USB_VBUS_PORT, USB_VBUS_PIN)) {
/* Drive pull-up high if VBUS connected */
gpio_set_mode(USB_PU_PORT, GPIO_MODE_OUTPUT_10_MHZ,
GPIO_CNF_OUTPUT_PUSHPULL, USB_PU_PIN);
} else {
/* Allow pull-up to float if VBUS disconnected */
gpio_set_mode(USB_PU_PORT, GPIO_MODE_INPUT,
GPIO_CNF_INPUT_FLOAT, USB_PU_PIN);
}
exti_reset_request(USB_VBUS_PIN);
}
static char *get_dev_unique_id(char *s)
{
volatile uint32_t *unique_id_p = (volatile uint32_t *)0x1FFFF7E8;

View File

@ -41,7 +41,7 @@
* LED1 = PB10 (Yellow LED : Idle)
* LED2 = PB11 (Red LED : Error)
*
* TPWR = RB0 (input)
* TPWR = RB0 (input) -- analogue on mini design ADC1, ch8
* nTRST = PB1
* SRST_OUT = PA2
* TDI = PA3
@ -50,7 +50,9 @@
* TDO = PA6 (input)
* nSRST = PA7 (input)
*
* USB cable pull-up: PA8 // was PA10 on prototype
* USB cable pull-up: PA8
* USB VBUS detect: PB13 -- New on mini design.
* Enable pull up for compatibility.
* Force DFU mode button: PB12
*/
@ -68,6 +70,10 @@
#define USB_PU_PORT GPIOA
#define USB_PU_PIN GPIO8
#define USB_VBUS_PORT GPIOB
#define USB_VBUS_PIN GPIO13
#define USB_VBUS_IRQ NVIC_EXTI15_10_IRQ
#define LED_PORT GPIOB
#define LED_RUN GPIO2
#define LED_IDLE GPIO10