git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@4278 35acf78f-673a-0410-8e92-d51de3d6d3f4
parent
166d6bf8b5
commit
0bbda501ee
|
@ -398,7 +398,7 @@ static void otg_fifo_read_to_buffer(uint8_t *buf, size_t n, size_t max) {
|
||||||
/**
|
/**
|
||||||
* @brief Reads a packet from the RXFIFO.
|
* @brief Reads a packet from the RXFIFO.
|
||||||
*
|
*
|
||||||
* @param[in] oqp pointer to an @p InputQueue object
|
* @param[in] iqp pointer to an @p InputQueue object
|
||||||
* @param[in] n number of bytes to pull from the FIFO
|
* @param[in] n number of bytes to pull from the FIFO
|
||||||
*
|
*
|
||||||
* @notapi
|
* @notapi
|
||||||
|
|
|
@ -93,7 +93,7 @@ static const USBEndpointConfig ep0config = {
|
||||||
*
|
*
|
||||||
* @param[in] usbp pointer to the @p USBDriver object
|
* @param[in] usbp pointer to the @p USBDriver object
|
||||||
*/
|
*/
|
||||||
static void pm_reset(USBDriver *usbp) {
|
static void usb_pm_reset(USBDriver *usbp) {
|
||||||
|
|
||||||
/* The first 64 bytes are reserved for the descriptors table. The effective
|
/* The first 64 bytes are reserved for the descriptors table. The effective
|
||||||
available RAM for endpoint buffers is just 448 bytes.*/
|
available RAM for endpoint buffers is just 448 bytes.*/
|
||||||
|
@ -106,72 +106,73 @@ static void pm_reset(USBDriver *usbp) {
|
||||||
* @param[in] usbp pointer to the @p USBDriver object
|
* @param[in] usbp pointer to the @p USBDriver object
|
||||||
* @param[in] size size of the packet buffer to allocate
|
* @param[in] size size of the packet buffer to allocate
|
||||||
*/
|
*/
|
||||||
static uint32_t pm_alloc(USBDriver *usbp, size_t size) {
|
static uint32_t usb_pm_alloc(USBDriver *usbp, size_t size) {
|
||||||
uint32_t next;
|
uint32_t next;
|
||||||
|
|
||||||
next = usbp->pmnext;
|
next = usbp->pmnext;
|
||||||
usbp->pmnext += size;
|
usbp->pmnext += size;
|
||||||
chDbgAssert(usbp->pmnext <= USB_PMA_SIZE, "pm_alloc(), #1", "PMA overflow");
|
chDbgAssert(usbp->pmnext <= USB_PMA_SIZE, "usb_pm_alloc(), #1", "PMA overflow");
|
||||||
return next;
|
return next;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Reads from a dedicated packet buffer.
|
* @brief Reads from a dedicated packet buffer.
|
||||||
*
|
*
|
||||||
* @param[in] usbp pointer to the @p USBDriver object
|
* @param[in] udp pointer to a @p stm32_usb_descriptor_t
|
||||||
* @param[in] ep endpoint number
|
|
||||||
* @param[out] buf buffer where to copy the packet data
|
* @param[out] buf buffer where to copy the packet data
|
||||||
* @param[in] n maximum number of bytes to copy. This value must
|
* @param[in] n maximum number of bytes to copy. This value must
|
||||||
* not exceed the maximum packet size for this endpoint.
|
* not exceed the maximum packet size for this endpoint.
|
||||||
* @return The received packet size regardless the specified
|
|
||||||
* @p n parameter.
|
|
||||||
* @retval 0 Zero size packet received.
|
|
||||||
*
|
*
|
||||||
* @notapi
|
* @notapi
|
||||||
*/
|
*/
|
||||||
static size_t usb_read_packet_buffer(USBDriver *usbp, usbep_t ep,
|
static void usb_packet_read_to_buffer(stm32_usb_descriptor_t *udp,
|
||||||
uint8_t *buf, size_t n) {
|
uint8_t *buf, size_t n) {
|
||||||
uint32_t *pmap;
|
uint32_t *pmap= USB_ADDR2PTR(udp->RXADDR0);
|
||||||
stm32_usb_descriptor_t *udp;
|
|
||||||
size_t count;
|
|
||||||
|
|
||||||
(void)usbp;
|
|
||||||
udp = USB_GET_DESCRIPTOR(ep);
|
|
||||||
pmap = USB_ADDR2PTR(udp->RXADDR0);
|
|
||||||
count = (size_t)udp->RXCOUNT0 & RXCOUNT_COUNT_MASK;
|
|
||||||
if (n > count)
|
|
||||||
n = count;
|
|
||||||
n = (n + 1) / 2;
|
n = (n + 1) / 2;
|
||||||
while (n > 0) {
|
while (n > 0) {
|
||||||
|
/* Note, this line relies on the Cortex-M3/M4 ability to perform
|
||||||
|
unaligned word accesses.*/
|
||||||
*(uint16_t *)buf = (uint16_t)*pmap++;
|
*(uint16_t *)buf = (uint16_t)*pmap++;
|
||||||
buf += 2;
|
buf += 2;
|
||||||
n--;
|
n--;
|
||||||
}
|
}
|
||||||
return count;
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Reads from a dedicated packet buffer.
|
||||||
|
*
|
||||||
|
* @param[in] udp pointer to a @p stm32_usb_descriptor_t
|
||||||
|
* @param[in] iqp pointer to an @p InputQueue object
|
||||||
|
* @param[in] n maximum number of bytes to copy. This value must
|
||||||
|
* not exceed the maximum packet size for this endpoint.
|
||||||
|
*
|
||||||
|
* @notapi
|
||||||
|
*/
|
||||||
|
static void usb_packet_read_to_queue(stm32_usb_descriptor_t *udp,
|
||||||
|
InputQueue *iqp, size_t n) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Writes to a dedicated packet buffer.
|
* @brief Writes to a dedicated packet buffer.
|
||||||
*
|
*
|
||||||
* @param[in] usbp pointer to the @p USBDriver object
|
* @param[in] udp pointer to a @p stm32_usb_descriptor_t
|
||||||
* @param[in] ep endpoint number
|
|
||||||
* @param[in] buf buffer where to fetch the packet data
|
* @param[in] buf buffer where to fetch the packet data
|
||||||
* @param[in] n maximum number of bytes to copy. This value must
|
* @param[in] n maximum number of bytes to copy. This value must
|
||||||
* not exceed the maximum packet size for this endpoint.
|
* not exceed the maximum packet size for this endpoint.
|
||||||
*
|
*
|
||||||
* @notapi
|
* @notapi
|
||||||
*/
|
*/
|
||||||
static void usb_write_packet_buffer(USBDriver *usbp, usbep_t ep,
|
static void usb_packet_write_from_buffer(stm32_usb_descriptor_t *udp,
|
||||||
const uint8_t *buf, size_t n) {
|
const uint8_t *buf,
|
||||||
uint32_t *pmap;
|
size_t n) {
|
||||||
stm32_usb_descriptor_t *udp;
|
uint32_t *pmap = USB_ADDR2PTR(udp->TXADDR0);
|
||||||
|
|
||||||
(void)usbp;
|
|
||||||
udp = USB_GET_DESCRIPTOR(ep);
|
|
||||||
pmap = USB_ADDR2PTR(udp->TXADDR0);
|
|
||||||
udp->TXCOUNT0 = (uint16_t)n;
|
udp->TXCOUNT0 = (uint16_t)n;
|
||||||
n = (n + 1) / 2;
|
n = (n + 1) / 2;
|
||||||
while (n > 0) {
|
while (n > 0) {
|
||||||
|
/* Note, this line relies on the Cortex-M3/M4 ability to perform
|
||||||
|
unaligned word accesses.*/
|
||||||
*pmap++ = *(uint16_t *)buf;
|
*pmap++ = *(uint16_t *)buf;
|
||||||
buf += 2;
|
buf += 2;
|
||||||
n--;
|
n--;
|
||||||
|
@ -223,7 +224,8 @@ static void usb_prepare_transmit(USBDriver *usbp, usbep_t ep, size_t n) {
|
||||||
/* Transfer initialization.*/
|
/* Transfer initialization.*/
|
||||||
if (n > (size_t)usbp->epc[ep]->in_maxsize)
|
if (n > (size_t)usbp->epc[ep]->in_maxsize)
|
||||||
n = (size_t)usbp->epc[ep]->in_maxsize;
|
n = (size_t)usbp->epc[ep]->in_maxsize;
|
||||||
usb_write_packet_buffer(usbp, ep, isp->mode.linear.txbuf, n);
|
usb_packet_write_from_buffer(USB_GET_DESCRIPTOR(ep),
|
||||||
|
isp->mode.linear.txbuf, n);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
|
@ -317,8 +319,9 @@ CH_IRQ_HANDLER(Vector90) {
|
||||||
n = epcp->in_maxsize;
|
n = epcp->in_maxsize;
|
||||||
else
|
else
|
||||||
n = epcp->in_state->txsize;
|
n = epcp->in_state->txsize;
|
||||||
usb_write_packet_buffer(usbp, ep,
|
usb_packet_write_from_buffer(USB_GET_DESCRIPTOR(ep),
|
||||||
epcp->in_state->mode.linear.txbuf, n);
|
epcp->in_state->mode.linear.txbuf,
|
||||||
|
n);
|
||||||
usb_lld_start_in(usbp, ep);
|
usb_lld_start_in(usbp, ep);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -335,10 +338,13 @@ CH_IRQ_HANDLER(Vector90) {
|
||||||
_usb_isr_invoke_setup_cb(usbp, ep);
|
_usb_isr_invoke_setup_cb(usbp, ep);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
n = usb_read_packet_buffer(usbp, ep,
|
stm32_usb_descriptor_t *udp = USB_GET_DESCRIPTOR(ep);
|
||||||
epcp->out_state->mode.linear.rxbuf,
|
n = (size_t)udp->RXCOUNT0 & RXCOUNT_COUNT_MASK;
|
||||||
epcp->out_state->rxsize);
|
|
||||||
usb_lld_start_out(usbp, ep);
|
/* Reads the packet into the linear buffer.*/
|
||||||
|
usb_packet_read_to_buffer(udp, epcp->out_state->mode.linear.rxbuf, n);
|
||||||
|
|
||||||
|
/* Transaction data updated.*/
|
||||||
epcp->out_state->mode.linear.rxbuf += n;
|
epcp->out_state->mode.linear.rxbuf += n;
|
||||||
epcp->out_state->rxcnt += n;
|
epcp->out_state->rxcnt += n;
|
||||||
epcp->out_state->rxsize -= n;
|
epcp->out_state->rxsize -= n;
|
||||||
|
@ -453,7 +459,7 @@ void usb_lld_reset(USBDriver *usbp) {
|
||||||
STM32_USB->CNTR = cntr;
|
STM32_USB->CNTR = cntr;
|
||||||
|
|
||||||
/* Resets the packet memory allocator.*/
|
/* Resets the packet memory allocator.*/
|
||||||
pm_reset(usbp);
|
usb_pm_reset(usbp);
|
||||||
|
|
||||||
/* EP0 initialization.*/
|
/* EP0 initialization.*/
|
||||||
usbp->epc[0] = &ep0config;
|
usbp->epc[0] = &ep0config;
|
||||||
|
@ -521,8 +527,8 @@ void usb_lld_init_endpoint(USBDriver *usbp, usbep_t ep) {
|
||||||
dp = USB_GET_DESCRIPTOR(ep);
|
dp = USB_GET_DESCRIPTOR(ep);
|
||||||
dp->TXCOUNT0 = 0;
|
dp->TXCOUNT0 = 0;
|
||||||
dp->RXCOUNT0 = nblocks;
|
dp->RXCOUNT0 = nblocks;
|
||||||
dp->TXADDR0 = pm_alloc(usbp, epcp->in_maxsize);
|
dp->TXADDR0 = usb_pm_alloc(usbp, epcp->in_maxsize);
|
||||||
dp->RXADDR0 = pm_alloc(usbp, epcp->out_maxsize);
|
dp->RXADDR0 = usb_pm_alloc(usbp, epcp->out_maxsize);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -536,7 +542,7 @@ void usb_lld_disable_endpoints(USBDriver *usbp) {
|
||||||
unsigned i;
|
unsigned i;
|
||||||
|
|
||||||
/* Resets the packet memory allocator.*/
|
/* Resets the packet memory allocator.*/
|
||||||
pm_reset(usbp);
|
usb_pm_reset(usbp);
|
||||||
|
|
||||||
/* Disabling all endpoints.*/
|
/* Disabling all endpoints.*/
|
||||||
for (i = 1; i <= USB_ENDOPOINTS_NUMBER; i++) {
|
for (i = 1; i <= USB_ENDOPOINTS_NUMBER; i++) {
|
||||||
|
|
Loading…
Reference in New Issue