Re: u-boot debug, was: Re: U-boot on RPI3, sees disk but won't boot it
- Reply: bob prohaska : "Re: u-boot debug, was: Re: U-boot on RPI3, sees disk but won't boot it"
- Reply: Mark Millard : "Re: u-boot debug, was: Re: U-boot on RPI3, sees disk but won't boot it"
- In reply to: bob prohaska : "Re: u-boot debug, was: Re: U-boot on RPI3, sees disk but won't boot it"
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Thu, 29 Sep 2022 01:03:23 UTC
On 2022-Sep-28, at 17:21, bob prohaska <fbsd@www.zefox.net> wrote:
> With the correct patches finally in place there is some
> extra output from u-boot:
>
> U-Boot 2022.04 (Sep 28 2022 - 16:45:12 -0700)
> . . .
> starting USB...
> . . .
> usb_new_device: Cannot read configuration, skipping device 152d:0583
The above is reporting U-Boot having a problem dealing with
your bridge/drive combination as seen via bridge access,
presuming that I recognize the 152d:0583 correctly.
Interestingly, that message is not from the routine usb_new_device
but is from:
int usb_select_config(struct usb_device *dev)
{
. . .
/*
* Kingston DT Ultimate 32GB USB 3.0 seems to be extremely sensitive
* about this first Get Descriptor request. If there are any other
* requests in the first microframe, the stick crashes. Wait about
* one microframe duration here (1mS for USB 1.x , 125uS for USB 2.0).
*/
mdelay(1);
/* only support for one config for now */
err = usb_get_configuration_len(dev, 0);
if (err >= 0) {
tmpbuf = (unsigned char *)malloc_cache_aligned(err);
if (!tmpbuf)
err = -ENOMEM;
else
err = usb_get_configuration_no(dev, 0, tmpbuf, err);
}
if (err < 0) {
printf("usb_new_device: Cannot read configuration, " \
"skipping device %04x:%04x\n",
dev->descriptor.idVendor, dev->descriptor.idProduct);
free(tmpbuf);
return err;
}
. . .
where:
/**********************************************************************
* gets len of configuration cfgno
*/
int usb_get_configuration_len(struct usb_device *dev, int cfgno)
{
int result;
ALLOC_CACHE_ALIGN_BUFFER(unsigned char, buffer, 9);
struct usb_config_descriptor *config;
config = (struct usb_config_descriptor *)&buffer[0];
result = usb_get_descriptor(dev, USB_DT_CONFIG, cfgno, buffer, 9);
if (result < 9) {
if (result < 0)
printf("unable to get descriptor, error %lX\n",
dev->status);
else
printf("config descriptor too short " \
"(expected %i, got %i)\n", 9, result);
return -EIO;
}
return le16_to_cpu(config->wTotalLength);
}
and:
/**********************************************************************
* gets configuration cfgno and store it in the buffer
*/
int usb_get_configuration_no(struct usb_device *dev, int cfgno,
unsigned char *buffer, int length)
{
int result;
struct usb_config_descriptor *config;
config = (struct usb_config_descriptor *)&buffer[0];
result = usb_get_descriptor(dev, USB_DT_CONFIG, cfgno, buffer, length);
debug("get_conf_no %d Result %d, wLength %d\n", cfgno, result,
le16_to_cpu(config->wTotalLength));
config->wTotalLength = result; /* validated, with CPU byte order */
return result;
}
(I'll skip more nested routine usage.)
We apparently do not have enough output enabled to see the debug
routine's output. We are seeing the printf output.
There might be a way to set the output message levels while at a
U-Boot prompt, up to the maximum compiled in. But it may also be
that we would need, say,
CONFIG_LOG_MAX_LEVEL=8
instead of the 7 we are now using.
===
Mark Millard
marklmi at yahoo.com