Correct some initialization sequence issues

git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@3208 42af7a65-404d-4744-a932-0658087f49c3
This commit is contained in:
patacongo 2010-12-21 11:44:51 +00:00
parent ec80cc2e27
commit 30f1331d9d
2 changed files with 52 additions and 43 deletions

View File

@ -132,11 +132,11 @@
/* Configurable number of descriptor buffer (TDBUFFER) */
#ifndef CONFIG_USBHOST_TDBUFFERS
# define CONFIG_USBHOST_TDBUFFERS 1
# define CONFIG_USBHOST_TDBUFFERS 2
#endif
#if CONFIG_USBHOST_TDBUFFERS < 1
# error "At least one TD buffer is required"
#if CONFIG_USBHOST_TDBUFFERS < 2
# error "At least two TD buffers are required"
#endif
/* Configurable size of a TD buffer */
@ -170,36 +170,35 @@
* LPC17_BANK1_SIZE 16384
*
* Configuration:
* CONFIG_USBHOST_OHCIRAM_SIZE 1024
* CONFIG_USBHOST_NTDS 1
* CONFIG_USBHOST_OHCIRAM_SIZE 1280
* CONFIG_USBHOST_NTDS 2
* CONFIG_USBHOST_NEDS 2
* CONFIG_USBHOST_TDBUFFERS 1
* CONFIG_USBHOST_TDBUFSIZE 128
* CONFIG_USBHOST_IOBUFSIZE 512
*
* Sizes of things
* CONFIG_USBHOST_NEDS 2
* LPC17_EDFREE_SIZE 48
* LPC17_TDFREE_SIZE 128
* LPC17_TDFREE_SIZE 256
* LPC17_IOFREE_SIZE 512
*
* Memory Layout
* LPC17_OHCIRAM_END (0x20008000 + 16384) = 0x2000c000
* LPC17_OHCIRAM_BASE (0x2000c000 - 1024) = 0x2000bc00
* LPC17_OHCIRAM_SIZE 1024
* LPC17_OHCIRAM_BASE (0x2000c000 - 1280) = 0x2000bb00
* LPC17_OHCIRAM_SIZE 1280
* LPC17_BANK1_HEAPBASE 0x20008000
* LPC17_BANK1_HEAPSIZE (16384 - 1024) = 15360
* LPC17_BANK1_HEAPSIZE (16384 - 1280) = 15104
*
* LPC17_HCCA_BASE 0x2000bc00
* LPC17_TDHEAD_ADDR 0x2000bd00
* LPC17_TDTAIL_ADDR 0x2000bd10
* LPC17_EDCTRL_ADDR 0x2000bd20
* LPC17_EDFREE_BASE 0x2000bd30
* LPC17_TDFREE_BASE 0x2000bd50
* LPC17_IOFREE_BASE 0x2000bdd0
* LPC17_IOBUFFERS (0x2000c000 + 0x2000bdd0) / 512 = 560/512 = 1
* LPC17_HCCA_BASE 0x2000bb00
* LPC17_TDHEAD_ADDR 0x2000bc00
* LPC17_TDTAIL_ADDR 0x2000bc10
* LPC17_EDCTRL_ADDR 0x2000bc20
* LPC17_EDFREE_BASE 0x2000bc30
* LPC17_TDFREE_BASE 0x2000bc50
* LPC17_IOFREE_BASE 0x2000bd50
* LPC17_IOBUFFERS (0x2000c000 - 0x2000bd50) / 512 = 688/512 = 1
*
* Wasted memory: 560-512 = 48 bytes
* Wasted memory: 688-512 = 176 bytes
*/
#define LPC17_HCCA_BASE (LPC17_OHCIRAM_BASE)

View File

@ -1014,7 +1014,7 @@ static int lpc17_enumerate(FAR struct usbhost_driver_s *drvr)
struct lpc17_usbhost_s *priv = (struct lpc17_usbhost_s *)drvr;
struct usb_ctrlreq_s *ctrlreq;
unsigned int len;
uint8_t *td;
uint8_t *buffer;
int ret;
/* Are we connected to a device? The caller should have called the wait()
@ -1029,14 +1029,22 @@ static int lpc17_enumerate(FAR struct usbhost_driver_s *drvr)
}
ulldbg("Enumerate the device\n");
/* Allocate a TD buffer for use in this function */
/* Allocate TD buffers for use in this function. We will need two:
* One for the request and one for the data buffer.
*/
td = lpc17_tdalloc(priv);
if (!td)
ctrlreq = (struct usb_ctrlreq_s *)lpc17_tdalloc(priv);
if (!ctrlreq)
{
return -ENOMEM;
}
ctrlreq = (struct usb_ctrlreq_s *)td;
buffer = lpc17_tdalloc(priv);
if (!buffer)
{
ret = -ENOMEM;
goto errout_nobuffer;
}
/* USB 2.0 spec says at least 50ms delay before port reset */
@ -1067,7 +1075,7 @@ static int lpc17_enumerate(FAR struct usbhost_driver_s *drvr)
lpc17_putle16(ctrlreq->index, 0);
lpc17_putle16(ctrlreq->len, 8);
ret = lpc17_ctrlin(drvr, ctrlreq, td);
ret = lpc17_ctrlin(drvr, ctrlreq, buffer);
if (ret != OK)
{
ulldbg("ERROR: lpc17_ctrlin returned %d\n", ret);
@ -1076,7 +1084,7 @@ static int lpc17_enumerate(FAR struct usbhost_driver_s *drvr)
/* Extract the max packetsize for endpoint 0 */
EDCTRL->ctrl = (uint32_t)(((struct usb_devdesc_s *)td)->mxpacketsize) << ED_CONTROL_MPS_SHIFT;
EDCTRL->ctrl = (uint32_t)(((struct usb_devdesc_s *)buffer)->mxpacketsize) << ED_CONTROL_MPS_SHIFT;
/* Set the device address to 1 */
@ -1106,7 +1114,7 @@ static int lpc17_enumerate(FAR struct usbhost_driver_s *drvr)
lpc17_putle16(ctrlreq->index, 0);
lpc17_putle16(ctrlreq->len, USB_SIZEOF_CFGDESC);
ret = lpc17_ctrlin(drvr, ctrlreq, td);
ret = lpc17_ctrlin(drvr, ctrlreq, buffer);
if (ret != OK)
{
ulldbg("ERROR: lpc17_ctrlin returned %d\n", ret);
@ -1115,7 +1123,7 @@ static int lpc17_enumerate(FAR struct usbhost_driver_s *drvr)
/* Extract the full size of the configuration data */
len = ((struct usb_cfgdesc_s *)td)->len;
len = ((struct usb_cfgdesc_s *)buffer)->len;
/* Get all of the configuration data */
@ -1125,24 +1133,13 @@ static int lpc17_enumerate(FAR struct usbhost_driver_s *drvr)
lpc17_putle16(ctrlreq->index, 0);
lpc17_putle16(ctrlreq->len, len);
ret = lpc17_ctrlin(drvr, ctrlreq, td);
ret = lpc17_ctrlin(drvr, ctrlreq, buffer);
if (ret != OK)
{
ulldbg("ERROR: lpc17_ctrlin returned %d\n", ret);
goto errout;
}
/* Parse the configuration descriptor and bind to the class instance for the
* device.
*/
ret = lpc17_classbind(priv, td, len);
if (ret != OK)
{
ulldbg("ERROR: MS_ParseConfiguration returned %d\n", ret);
goto errout;
}
/* Select device configuration 1 */
ctrlreq->type = USB_REQ_DIR_OUT|USB_REQ_RECIPIENT_DEVICE;
@ -1154,16 +1151,29 @@ static int lpc17_enumerate(FAR struct usbhost_driver_s *drvr)
ret = lpc17_ctrlout(drvr, ctrlreq, NULL);
if (ret != OK)
{
ulldbg("ERROR: lpc17_ctrlout returned %d\n", ret);
ulldbg("ERROR: uint16 returned %d\n", ret);
goto errout;
}
/* Some devices may require this delay */
/* Some devices may require this delay before initialization */
up_mdelay(100);
/* Parse the configuration descriptor and bind to the class instance for the
* device. This needs to be the last thing done because the class driver
* will begin configuring the device.
*/
ret = lpc17_classbind(priv, buffer, len);
if (ret != OK)
{
ulldbg("ERROR: MS_ParseConfiguration returned %d\n", ret);
}
errout:
lpc17_tdfree(priv, td);
lpc17_tdfree(priv, buffer);
errout_nobuffer:
lpc17_tdfree(priv, (uint8_t*)ctrlreq);
return ret;
}