USBH: improved debug output
This commit is contained in:
parent
c0cadbbe7b
commit
ca1882c01b
|
@ -60,13 +60,6 @@
|
|||
#include "usbh/list.h"
|
||||
#include "usbh/defs.h"
|
||||
|
||||
/* TODO:
|
||||
*
|
||||
* - Integrate VBUS power switching functionality to the API.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Derived constants and error checks. */
|
||||
/*===========================================================================*/
|
||||
|
@ -83,6 +76,7 @@ enum usbh_status {
|
|||
USBH_STATUS_SUSPENDED,
|
||||
};
|
||||
|
||||
/* These correspond to the USB spec */
|
||||
enum usbh_devstatus {
|
||||
USBH_DEVSTATUS_DISCONNECTED = 0,
|
||||
USBH_DEVSTATUS_ATTACHED,
|
||||
|
|
|
@ -18,4 +18,4 @@ Enhancements:
|
|||
- A way to automate matching (similar to linux)
|
||||
- Hooks to override driver loading and to inform the user of problems
|
||||
- for STM32 LLD: think of a way to prevent Bulk IN NAK interrupt flood.
|
||||
|
||||
- Integrate VBUS power switching functionality to the API.
|
||||
|
|
|
@ -342,19 +342,39 @@ unsigned_common:
|
|||
|
||||
}
|
||||
|
||||
static void _print_hdr(void)
|
||||
{
|
||||
static systime_t first, last;
|
||||
static bool ena;
|
||||
static uint32_t hdr[2];
|
||||
|
||||
static void _build_hdr(void) {
|
||||
uint32_t hfnum = USBH_DEBUG_USBHD.otg->HFNUM;
|
||||
uint16_t hfir = USBH_DEBUG_USBHD.otg->HFIR;
|
||||
last = osalOsGetSystemTimeX();
|
||||
if (ena) {
|
||||
first = last;
|
||||
}
|
||||
|
||||
_put(0xff);
|
||||
_put(0xff);
|
||||
_put(hfir & 0xff);
|
||||
_put(hfir >> 8);
|
||||
_put(hfnum & 0xff);
|
||||
_put((hfnum >> 8) & 0xff);
|
||||
_put((hfnum >> 16) & 0xff);
|
||||
_put((hfnum >> 24) & 0xff);
|
||||
if (((hfnum & 0x3fff) == 0x3fff) && (hfir == (hfnum >> 16))) {
|
||||
hdr[0] = 0xfeff;
|
||||
hdr[1] = last - first;
|
||||
ena = FALSE;
|
||||
} else {
|
||||
hdr[0] = 0xffff | (hfir << 16);
|
||||
hdr[1] = hfnum;
|
||||
ena = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
static void _print_hdr(void)
|
||||
{
|
||||
_put(hdr[0] & 0xff);
|
||||
_put((hdr[0] >> 8) & 0xff);
|
||||
_put((hdr[0] >> 16) & 0xff);
|
||||
_put((hdr[0] >> 24) & 0xff);
|
||||
_put(hdr[1] & 0xff);
|
||||
_put((hdr[1] >> 8) & 0xff);
|
||||
_put((hdr[1] >> 16) & 0xff);
|
||||
_put((hdr[1] >> 24) & 0xff);
|
||||
}
|
||||
|
||||
void usbDbgPrintf(const char *fmt, ...)
|
||||
|
@ -365,6 +385,7 @@ void usbDbgPrintf(const char *fmt, ...)
|
|||
input_queue_t *iqp = &USBH_DEBUG_USBHD.iq;
|
||||
int rem = sizeof(USBH_DEBUG_USBHD.dbg_buff) - iqp->q_counter;
|
||||
if (rem >= 9) {
|
||||
_build_hdr();
|
||||
_print_hdr();
|
||||
_dbg_printf(fmt, ap);
|
||||
iqp->q_counter++;
|
||||
|
@ -378,11 +399,8 @@ void usbDbgPrintf(const char *fmt, ...)
|
|||
|
||||
void usbDbgPuts(const char *s)
|
||||
{
|
||||
uint32_t buff[2] = {
|
||||
0xffff | (USBH_DEBUG_USBHD.otg->HFIR << 16),
|
||||
USBH_DEBUG_USBHD.otg->HFNUM
|
||||
};
|
||||
uint8_t *p = (uint8_t *)buff;
|
||||
_build_hdr();
|
||||
uint8_t *p = (uint8_t *)hdr;
|
||||
uint8_t *top = p + 8;
|
||||
|
||||
syssts_t sts = chSysGetStatusAndLockX();
|
||||
|
@ -488,8 +506,9 @@ static void usb_debug_thread(void *arg) {
|
|||
if (c == 0xff) state = 1;
|
||||
} else if (state == 1) {
|
||||
if (c == 0xff) state = 2;
|
||||
else if (c == 0xfe) state = 3;
|
||||
else (state = 0);
|
||||
} else {
|
||||
} else if (state == 2) {
|
||||
uint16_t hfir;
|
||||
uint32_t hfnum;
|
||||
|
||||
|
@ -508,10 +527,26 @@ static void usb_debug_thread(void *arg) {
|
|||
|
||||
uint32_t f = hfnum & 0xffff;
|
||||
uint32_t p = 1000 - ((hfnum >> 16) / (hfir / 1000));
|
||||
chprintf((BaseSequentialStream *)&USBH_DEBUG_SD, "%05d.%03d ", f, p);
|
||||
chprintf((BaseSequentialStream *)&USBH_DEBUG_SD, "%05d.%03d ", f, p);
|
||||
state = 4;
|
||||
} else if (state == 3) {
|
||||
uint32_t t;
|
||||
|
||||
c = iqGet(&host->iq); if (c < 0) goto reset;
|
||||
c = iqGet(&host->iq); if (c < 0) goto reset;
|
||||
|
||||
t = c;
|
||||
c = iqGet(&host->iq); if (c < 0) goto reset;
|
||||
t |= c << 8;
|
||||
c = iqGet(&host->iq); if (c < 0) goto reset;
|
||||
t |= c << 16;
|
||||
c = iqGet(&host->iq); if (c < 0) goto reset;
|
||||
t |= c << 24;
|
||||
|
||||
chprintf((BaseSequentialStream *)&USBH_DEBUG_SD, "+%08d ", t);
|
||||
state = 4;
|
||||
} else {
|
||||
while (true) {
|
||||
c = iqGet(&host->iq); if (c < 0) goto reset;
|
||||
if (!c) {
|
||||
sdPut(&USBH_DEBUG_SD, '\r');
|
||||
sdPut(&USBH_DEBUG_SD, '\n');
|
||||
|
@ -519,6 +554,7 @@ static void usb_debug_thread(void *arg) {
|
|||
break;
|
||||
}
|
||||
sdPut(&USBH_DEBUG_SD, (uint8_t)c);
|
||||
c = iqGet(&host->iq); if (c < 0) goto reset;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue