diff --git a/include/libopencm3/stm32/common/usart_common_all.h b/include/libopencm3/stm32/common/usart_common_all.h index 13344202..553ba285 100644 --- a/include/libopencm3/stm32/common/usart_common_all.h +++ b/include/libopencm3/stm32/common/usart_common_all.h @@ -359,6 +359,8 @@ void usart_enable_rx_interrupt(u32 usart); void usart_disable_rx_interrupt(u32 usart); void usart_enable_tx_interrupt(u32 usart); void usart_disable_tx_interrupt(u32 usart); +void usart_enable_error_interrupt(u32 usart); +void usart_disable_error_interrupt(u32 usart); bool usart_get_flag(u32 usart, u32 flag); bool usart_get_interrupt_source(u32 usart, u32 flag); diff --git a/include/libopencm3/stm32/f1/ethernet.h b/include/libopencm3/stm32/f1/ethernet.h index 08edd841..7fa437f2 100644 --- a/include/libopencm3/stm32/f1/ethernet.h +++ b/include/libopencm3/stm32/f1/ethernet.h @@ -200,4 +200,11 @@ #define ETH_DMAIER_AISE 0x00008000 #define ETH_DMAIER_NSIE 0x00010000 +BEGIN_DECLS + +void eth_smi_write(u8 phy, u8 reg, u16 data); +u16 eth_smi_read(u8 phy, u8 reg); + +END_DECLS + #endif diff --git a/include/libopencm3/stm32/f1/rcc.h b/include/libopencm3/stm32/f1/rcc.h index 868ad9ce..01c9346e 100644 --- a/include/libopencm3/stm32/f1/rcc.h +++ b/include/libopencm3/stm32/f1/rcc.h @@ -517,6 +517,7 @@ void rcc_peripheral_clear_reset(volatile u32 *reg, u32 clear_reset); void rcc_set_sysclk_source(u32 clk); void rcc_set_pll_multiplication_factor(u32 mul); void rcc_set_pll2_multiplication_factor(u32 mul); +void rcc_set_pll3_multiplication_factor(u32 mul); void rcc_set_pll_source(u32 pllsrc); void rcc_set_pllxtpre(u32 pllxtpre); void rcc_set_adcpre(u32 adcpre); @@ -524,7 +525,10 @@ void rcc_set_ppre2(u32 ppre2); void rcc_set_ppre1(u32 ppre1); void rcc_set_hpre(u32 hpre); void rcc_set_usbpre(u32 usbpre); -u32 rcc_get_system_clock_source(int i); +void rcc_set_prediv1(u32 prediv); +void rcc_set_prediv2(u32 prediv); +void rcc_set_prediv1_source(u32 rccsrc); +u32 rcc_system_clock_source(void); void rcc_clock_setup_in_hsi_out_64mhz(void); void rcc_clock_setup_in_hsi_out_48mhz(void); void rcc_clock_setup_in_hsi_out_24mhz(void); diff --git a/include/libopencm3/stm32/timer.h b/include/libopencm3/stm32/timer.h index 4977674d..3803bd2c 100644 --- a/include/libopencm3/stm32/timer.h +++ b/include/libopencm3/stm32/timer.h @@ -1028,7 +1028,7 @@ BEGIN_DECLS void timer_reset(u32 timer_peripheral); void timer_enable_irq(u32 timer_peripheral, u32 irq); void timer_disable_irq(u32 timer_peripheral, u32 irq); -bool timer_return_interrupt_source(u32 timer_peripheral, u32 flag); +bool timer_interrupt_source(u32 timer_peripheral, u32 flag); bool timer_get_flag(u32 timer_peripheral, u32 flag); void timer_clear_flag(u32 timer_peripheral, u32 flag); void timer_set_mode(u32 timer_peripheral, u32 clock_div, diff --git a/lib/usb/usb_f103.c b/lib/usb/usb_f103.c index aa323d97..ec98f357 100644 --- a/lib/usb/usb_f103.c +++ b/lib/usb/usb_f103.c @@ -69,9 +69,9 @@ static usbd_device *stm32f103_usbd_init(void) return &usbd_dev; } -static void stm32f103_set_address(usbd_device *usbd_dev, u8 addr) +static void stm32f103_set_address(usbd_device *dev, u8 addr) { - (void)usbd_dev; + (void)dev; /* Set device address and enable. */ SET_REG(USB_DADDR_REG, (addr & USB_DADDR_ADDR) | USB_DADDR_ENABLE); } @@ -82,9 +82,9 @@ static void stm32f103_set_address(usbd_device *usbd_dev, u8 addr) * @param ep Index of endpoint to configure. * @param size Size in bytes of the RX buffer. */ -static void usb_set_ep_rx_bufsize(usbd_device *usbd_dev, u8 ep, u32 size) +static void usb_set_ep_rx_bufsize(usbd_device *dev, u8 ep, u32 size) { - (void)usbd_dev; + (void)dev; if (size > 62) { if (size & 0x1f) size -= 32; @@ -96,7 +96,7 @@ static void usb_set_ep_rx_bufsize(usbd_device *usbd_dev, u8 ep, u32 size) } } -static void stm32f103_ep_setup(usbd_device *usbd_dev, u8 addr, u8 type, +static void stm32f103_ep_setup(usbd_device *dev, u8 addr, u8 type, u16 max_size, void (*callback) (usbd_device *usbd_dev, u8 ep)) { @@ -115,30 +115,30 @@ static void stm32f103_ep_setup(usbd_device *usbd_dev, u8 addr, u8 type, USB_SET_EP_TYPE(addr, typelookup[type]); if (dir || (addr == 0)) { - USB_SET_EP_TX_ADDR(addr, usbd_dev->pm_top); + USB_SET_EP_TX_ADDR(addr, dev->pm_top); if (callback) { - usbd_dev->user_callback_ctr[addr][USB_TRANSACTION_IN] = + dev->user_callback_ctr[addr][USB_TRANSACTION_IN] = (void *)callback; } USB_CLR_EP_TX_DTOG(addr); USB_SET_EP_TX_STAT(addr, USB_EP_TX_STAT_NAK); - usbd_dev->pm_top += max_size; + dev->pm_top += max_size; } if (!dir) { - USB_SET_EP_RX_ADDR(addr, usbd_dev->pm_top); - usb_set_ep_rx_bufsize(usbd_dev, addr, max_size); + USB_SET_EP_RX_ADDR(addr, dev->pm_top); + usb_set_ep_rx_bufsize(dev, addr, max_size); if (callback) { - usbd_dev->user_callback_ctr[addr][USB_TRANSACTION_OUT] = + dev->user_callback_ctr[addr][USB_TRANSACTION_OUT] = (void *)callback; } USB_CLR_EP_RX_DTOG(addr); USB_SET_EP_RX_STAT(addr, USB_EP_RX_STAT_VALID); - usbd_dev->pm_top += max_size; + dev->pm_top += max_size; } } -static void stm32f103_endpoints_reset(usbd_device *usbd_dev) +static void stm32f103_endpoints_reset(usbd_device *dev) { int i; @@ -147,12 +147,12 @@ static void stm32f103_endpoints_reset(usbd_device *usbd_dev) USB_SET_EP_TX_STAT(i, USB_EP_TX_STAT_DISABLED); USB_SET_EP_RX_STAT(i, USB_EP_RX_STAT_DISABLED); } - usbd_dev->pm_top = 0x40 + (2 * usbd_dev->desc->bMaxPacketSize0); + dev->pm_top = 0x40 + (2 * dev->desc->bMaxPacketSize0); } -static void stm32f103_ep_stall_set(usbd_device *usbd_dev, u8 addr, u8 stall) +static void stm32f103_ep_stall_set(usbd_device *dev, u8 addr, u8 stall) { - (void)usbd_dev; + (void)dev; if (addr == 0) USB_SET_EP_TX_STAT(addr, stall ? USB_EP_TX_STAT_STALL : USB_EP_TX_STAT_NAK); @@ -176,9 +176,9 @@ static void stm32f103_ep_stall_set(usbd_device *usbd_dev, u8 addr, u8 stall) } } -static u8 stm32f103_ep_stall_get(usbd_device *usbd_dev, u8 addr) +static u8 stm32f103_ep_stall_get(usbd_device *dev, u8 addr) { - (void)usbd_dev; + (void)dev; if (addr & 0x80) { if ((*USB_EP_REG(addr & 0x7F) & USB_EP_TX_STAT) == USB_EP_TX_STAT_STALL) @@ -191,9 +191,9 @@ static u8 stm32f103_ep_stall_get(usbd_device *usbd_dev, u8 addr) return 0; } -static void stm32f103_ep_nak_set(usbd_device *usbd_dev, u8 addr, u8 nak) +static void stm32f103_ep_nak_set(usbd_device *dev, u8 addr, u8 nak) { - (void)usbd_dev; + (void)dev; /* It does not make sence to force NAK on IN endpoints. */ if (addr & 0x80) return; @@ -222,10 +222,10 @@ static void usb_copy_to_pm(volatile void *vPM, const void *buf, u16 len) *PM = *lbuf; } -static u16 stm32f103_ep_write_packet(usbd_device *usbd_dev, u8 addr, +static u16 stm32f103_ep_write_packet(usbd_device *dev, u8 addr, const void *buf, u16 len) { - (void)usbd_dev; + (void)dev; addr &= 0x7F; if ((*USB_EP_REG(addr) & USB_EP_TX_STAT) == USB_EP_TX_STAT_VALID) @@ -258,10 +258,10 @@ static void usb_copy_from_pm(void *buf, const volatile void *vPM, u16 len) *(u8 *) lbuf = *(u8 *) PM; } -static u16 stm32f103_ep_read_packet(usbd_device *usbd_dev, u8 addr, void *buf, +static u16 stm32f103_ep_read_packet(usbd_device *dev, u8 addr, void *buf, u16 len) { - (void)usbd_dev; + (void)dev; if ((*USB_EP_REG(addr) & USB_EP_RX_STAT) == USB_EP_RX_STAT_VALID) return 0; @@ -275,13 +275,13 @@ static u16 stm32f103_ep_read_packet(usbd_device *usbd_dev, u8 addr, void *buf, return len; } -static void stm32f103_poll(usbd_device *usbd_dev) +static void stm32f103_poll(usbd_device *dev) { u16 istr = *USB_ISTR_REG; if (istr & USB_ISTR_RESET) { - usbd_dev->pm_top = 0x40; - _usbd_reset(usbd_dev); + dev->pm_top = 0x40; + _usbd_reset(dev); USB_CLR_ISTR_RESET(); return; } @@ -295,27 +295,27 @@ static void stm32f103_poll(usbd_device *usbd_dev) else /* IN transaction */ USB_CLR_EP_TX_CTR(ep); - if (usbd_dev->user_callback_ctr[ep][type]) - usbd_dev->user_callback_ctr[ep][type] (usbd_dev, ep); + if (dev->user_callback_ctr[ep][type]) + dev->user_callback_ctr[ep][type] (dev, ep); else USB_CLR_EP_RX_CTR(ep); } if (istr & USB_ISTR_SUSP) { USB_CLR_ISTR_SUSP(); - if (usbd_dev->user_callback_suspend) - usbd_dev->user_callback_suspend(); + if (dev->user_callback_suspend) + dev->user_callback_suspend(); } if (istr & USB_ISTR_WKUP) { USB_CLR_ISTR_WKUP(); - if (usbd_dev->user_callback_resume) - usbd_dev->user_callback_resume(); + if (dev->user_callback_resume) + dev->user_callback_resume(); } if (istr & USB_ISTR_SOF) { - if (usbd_dev->user_callback_sof) - usbd_dev->user_callback_sof(); + if (dev->user_callback_sof) + dev->user_callback_sof(); USB_CLR_ISTR_SOF(); } } diff --git a/lib/usb/usb_private.h b/lib/usb/usb_private.h index 454e8c6b..96236756 100644 --- a/lib/usb/usb_private.h +++ b/lib/usb/usb_private.h @@ -99,6 +99,15 @@ void _usbd_control_in(usbd_device *usbd_dev, u8 ea); void _usbd_control_out(usbd_device *usbd_dev, u8 ea); void _usbd_control_setup(usbd_device *usbd_dev, u8 ea); +int _usbd_standard_request_device(usbd_device *usbd_dev, + struct usb_setup_data *req, u8 **buf, + u16 *len); +int _usbd_standard_request_interface(usbd_device *usbd_dev, + struct usb_setup_data *req, u8 **buf, + u16 *len); +int _usbd_standard_request_endpoint(usbd_device *usbd_dev, + struct usb_setup_data *req, u8 **buf, + u16 *len); int _usbd_standard_request(usbd_device *usbd_dev, struct usb_setup_data *req, u8 **buf, u16 *len);