diff options
-rw-r--r-- | os/hal/include/hal_usbh.h | 15 | ||||
-rw-r--r-- | os/hal/ports/STM32/LLD/USBHv1/hal_usbh_lld.c | 14 | ||||
-rw-r--r-- | os/hal/src/hal_usbh.c | 8 | ||||
-rw-r--r-- | os/hal/src/usbh/hal_usbh_aoa.c | 31 | ||||
-rw-r--r-- | os/hal/src/usbh/hal_usbh_debug.c | 23 | ||||
-rw-r--r-- | os/various/fatfs_bindings/fatfs.mk | 2 | ||||
-rw-r--r-- | os/various/fatfs_bindings/fatfs_devices.h | 59 | ||||
-rw-r--r-- | os/various/fatfs_bindings/fatfs_diskio.c | 64 | ||||
-rw-r--r-- | testhal/STM32/STM32F4xx/USB_HOST/.project | 4 | ||||
-rw-r--r-- | testhal/STM32/STM32F4xx/USB_HOST/main.c | 11 |
10 files changed, 156 insertions, 75 deletions
diff --git a/os/hal/include/hal_usbh.h b/os/hal/include/hal_usbh.h index 1ed6416..8d9a85b 100644 --- a/os/hal/include/hal_usbh.h +++ b/os/hal/include/hal_usbh.h @@ -52,7 +52,9 @@ #define HAL_USBH_USE_ADDITIONAL_CLASS_DRIVERS FALSE #endif +#ifndef HAL_USBH_USE_IAD #define HAL_USBH_USE_IAD HAL_USBH_USE_UVC +#endif #if (HAL_USE_USBH == TRUE) || defined(__DOXYGEN__) @@ -299,11 +301,22 @@ extern "C" { } /* Synchronous API */ - usbh_urbstatus_t usbhBulkTransfer(usbh_ep_t *ep, + usbh_urbstatus_t usbhSynchronousTransfer(usbh_ep_t *ep, void *data, uint32_t len, uint32_t *actual_len, systime_t timeout); + + static inline usbh_urbstatus_t usbhBulkTransfer(usbh_ep_t *ep, + void *data, + uint32_t len, + uint32_t *actual_len, + systime_t timeout) { + osalDbgAssert(ep->type == USBH_EPTYPE_BULK, "wrong ep"); + + return usbhSynchronousTransfer(ep, data, len, actual_len, timeout); + } + usbh_urbstatus_t usbhControlRequest(usbh_device_t *dev, uint8_t bmRequestType, uint8_t bRequest, diff --git a/os/hal/ports/STM32/LLD/USBHv1/hal_usbh_lld.c b/os/hal/ports/STM32/LLD/USBHv1/hal_usbh_lld.c index 2894907..226f1bb 100644 --- a/os/hal/ports/STM32/LLD/USBHv1/hal_usbh_lld.c +++ b/os/hal/ports/STM32/LLD/USBHv1/hal_usbh_lld.c @@ -1172,9 +1172,17 @@ static inline void _nptxfe_int(USBHDriver *host) { } static inline void _ptxfe_int(USBHDriver *host) { - //TODO: implement - (void)host; - uinfo("PTXFE"); + uint32_t rem; + stm32_otg_t *const otg = host->otg; + + rem = _write_packet(&host->ep_active_lists[USBH_EPTYPE_ISO], + otg->HPTXSTS & HPTXSTS_PTXFSAVL_MASK); + + rem += _write_packet(&host->ep_active_lists[USBH_EPTYPE_INT], + otg->HPTXSTS & HPTXSTS_PTXFSAVL_MASK); + + if (!rem) + otg->GINTMSK &= ~GINTMSK_PTXFEM; } static void _disable(USBHDriver *host) { diff --git a/os/hal/src/hal_usbh.c b/os/hal/src/hal_usbh.c index 7dff98a..78ac837 100644 --- a/os/hal/src/hal_usbh.c +++ b/os/hal/src/hal_usbh.c @@ -302,6 +302,7 @@ msg_t usbhURBSubmitAndWaitS(usbh_urb_t *urb, systime_t timeout) { _check_urb(urb); usbhURBSubmitI(urb); + osalOsRescheduleS(); /* This call is necessary because usbhURBSubmitI may require a reschedule */ ret = usbhURBWaitTimeoutS(urb, timeout); if (ret == MSG_TIMEOUT) _usbh_urb_abort_and_waitS(urb, USBH_URBSTATUS_TIMEOUT); @@ -330,7 +331,7 @@ void _usbh_urb_completeI(usbh_urb_t *urb, usbh_urbstatus_t status) { /* Synchronous API. */ /*===========================================================================*/ -usbh_urbstatus_t usbhBulkTransfer(usbh_ep_t *ep, +usbh_urbstatus_t usbhSynchronousTransfer(usbh_ep_t *ep, void *data, uint32_t len, uint32_t *actual_len, @@ -338,7 +339,6 @@ usbh_urbstatus_t usbhBulkTransfer(usbh_ep_t *ep, osalDbgCheck(ep != NULL); osalDbgCheck((data != NULL) || (len == 0)); - osalDbgAssert(ep->type == USBH_EPTYPE_BULK, "wrong ep"); usbh_urb_t urb; usbhURBObjectInit(&urb, ep, 0, 0, data, len); @@ -860,9 +860,7 @@ static void _port_process_status_change(usbh_port_t *port) { usbhhubClearFeaturePort(port, USBH_PORT_FEAT_C_CONNECTION); if (port->device.status != USBH_DEVSTATUS_DISCONNECTED) { - if (!(port->status & USBH_PORTSTATUS_CONNECTION)) { - _usbh_port_disconnected(port); - } + _usbh_port_disconnected(port); } } diff --git a/os/hal/src/usbh/hal_usbh_aoa.c b/os/hal/src/usbh/hal_usbh_aoa.c index d565595..a10ff2f 100644 --- a/os/hal/src/usbh/hal_usbh_aoa.c +++ b/os/hal/src/usbh/hal_usbh_aoa.c @@ -161,6 +161,11 @@ static usbh_baseclassdriver_t *_aoa_load(usbh_device_t *dev, const uint8_t *desc } }; + if (descriptor[1] != USBH_DT_DEVICE) { + uinfo("AOA: Won't try to detect Android device at interface level"); + return NULL; + } + uinfo("AOA: Unrecognized VID"); #if defined(HAL_USBHAOA_FILTER_CALLBACK) @@ -171,6 +176,7 @@ static usbh_baseclassdriver_t *_aoa_load(usbh_device_t *dev, const uint8_t *desc uinfo("AOA: Try if it's an Android device"); if (_get_protocol(dev, &protocol) != HAL_SUCCESS) { + uinfo("AOA: not an Android device"); return NULL; } uinfof("AOA: Possible Android device found (protocol=%d)", protocol); @@ -196,6 +202,8 @@ static usbh_baseclassdriver_t *_aoa_load(usbh_device_t *dev, const uint8_t *desc if (_accessory_start(dev) != HAL_SUCCESS) { uerr("AOA: Can't start accessory; abort channel start"); + } else { + uinfo("AOA: Accessory started"); } return NULL; @@ -320,7 +328,7 @@ static void _out_cb(usbh_urb_t *urb) { return; case USBH_URBSTATUS_DISCONNECTED: uwarn("AOA: URB OUT disconnected"); - chThdDequeueNextI(&aoacp->oq_waiting, Q_RESET); + chThdDequeueAllI(&aoacp->oq_waiting, Q_RESET); chnAddFlagsI(aoacp, CHN_OUTPUT_EMPTY); return; default: @@ -419,7 +427,10 @@ static void _in_cb(usbh_urb_t *urb) { break; case USBH_URBSTATUS_DISCONNECTED: uwarn("AOA: URB IN disconnected"); - chThdDequeueNextI(&aoacp->iq_waiting, Q_RESET); + chThdDequeueAllI(&aoacp->iq_waiting, Q_RESET); + chnAddFlagsI(aoacp, CHN_DISCONNECTED); + aoacp->state = USBHAOA_CHANNEL_STATE_ACTIVE; + container_of(aoacp, USBHAOADriver, channel)->state = USBHAOA_STATE_ACTIVE; break; default: uerrf("AOA: URB IN status unexpected = %d", urb->status); @@ -526,14 +537,16 @@ static void _stop_channelS(USBHAOAChannel *aoacp) { static void _vt(void *p) { USBHAOAChannel *const aoacp = (USBHAOAChannel *)p; osalSysLockFromISR(); - uint32_t len = aoacp->oq_ptr - aoacp->oq_buff; - if (len && !usbhURBIsBusy(&aoacp->oq_urb)) { - _submitOutI(aoacp, len); - } - if ((aoacp->iq_counter == 0) && !usbhURBIsBusy(&aoacp->iq_urb)) { - _submitInI(aoacp); + if (aoacp->state == USBHAOA_CHANNEL_STATE_READY) { + uint32_t len = aoacp->oq_ptr - aoacp->oq_buff; + if (len && !usbhURBIsBusy(&aoacp->oq_urb)) { + _submitOutI(aoacp, len); + } + if ((aoacp->iq_counter == 0) && !usbhURBIsBusy(&aoacp->iq_urb)) { + _submitInI(aoacp); + } + chVTSetI(&aoacp->vt, OSAL_MS2I(16), _vt, aoacp); } - chVTSetI(&aoacp->vt, OSAL_MS2I(16), _vt, aoacp); osalSysUnlockFromISR(); } diff --git a/os/hal/src/usbh/hal_usbh_debug.c b/os/hal/src/usbh/hal_usbh_debug.c index d32f1c6..85c6640 100644 --- a/os/hal/src/usbh/hal_usbh_debug.c +++ b/os/hal/src/usbh/hal_usbh_debug.c @@ -22,7 +22,13 @@ #include "ch.h" #include "usbh/debug.h" #include <stdarg.h> +#if 0 +#include "debug.h" +#else #include "chprintf.h" +#define dbg_lock() +#define dbg_unlock() +#endif #define MAX_FILLER 11 #define FLOAT_PRECISION 9 @@ -393,6 +399,9 @@ void usbDbgPrintf(const char *fmt, ...) chThdDequeueNextI(&USBH_DEBUG_USBHD.iq.q_waiting, Q_OK); } chSysRestoreStatusX(sts); + if (!port_is_isr_context() && chSchIsPreemptionRequired()) { + chSchRescheduleS(); + } va_end(ap); } @@ -422,6 +431,9 @@ void usbDbgPuts(const char *s) chThdDequeueNextI(&USBH_DEBUG_USBHD.iq.q_waiting, Q_OK); } chSysRestoreStatusX(sts); + if (!port_is_isr_context() && chSchIsPreemptionRequired()) { + chSchRescheduleS(); + } } void usbDbgReset(void) { @@ -435,6 +447,9 @@ void usbDbgReset(void) { USBH_DEBUG_SD.oqueue.q_counter--; } chSysRestoreStatusX(sts); + if (!port_is_isr_context() && chSchIsPreemptionRequired()) { + chSchRescheduleS(); + } } static int _get(void) { @@ -527,6 +542,7 @@ static void usb_debug_thread(void *arg) { uint32_t f = hfnum & 0xffff; uint32_t p = 1000 - ((hfnum >> 16) / (hfir / 1000)); + dbg_lock(); chprintf((BaseSequentialStream *)&USBH_DEBUG_SD, "%05d.%03d ", f, p); state = 4; } else if (state == 3) { @@ -543,6 +559,7 @@ static void usb_debug_thread(void *arg) { c = iqGet(&host->iq); if (c < 0) goto reset; t |= c << 24; + dbg_lock(); chprintf((BaseSequentialStream *)&USBH_DEBUG_SD, "+%08d ", t); state = 4; } else { @@ -550,8 +567,7 @@ static void usb_debug_thread(void *arg) { if (!c) { sdPut(&USBH_DEBUG_SD, '\r'); sdPut(&USBH_DEBUG_SD, '\n'); - state = 0; - break; + goto reset; } sdPut(&USBH_DEBUG_SD, (uint8_t)c); c = iqGet(&host->iq); if (c < 0) goto reset; @@ -560,6 +576,9 @@ static void usb_debug_thread(void *arg) { continue; reset: + if (state == 4) { + dbg_unlock(); + } state = 0; } } diff --git a/os/various/fatfs_bindings/fatfs.mk b/os/various/fatfs_bindings/fatfs.mk index f2feeb5..02ebed5 100644 --- a/os/various/fatfs_bindings/fatfs.mk +++ b/os/various/fatfs_bindings/fatfs.mk @@ -4,4 +4,4 @@ FATFSSRC = ${CHIBIOS_CONTRIB}/os/various/fatfs_bindings/fatfs_diskio.c \ ${CHIBIOS}/ext/fatfs/src/ff.c \ $(CHIBIOS)/ext/fatfs/src/ffunicode.c -FATFSINC = ${CHIBIOS}/ext/fatfs/src +FATFSINC = ${CHIBIOS}/ext/fatfs/src ${CHIBIOS_CONTRIB}/os/various/fatfs_bindings diff --git a/os/various/fatfs_bindings/fatfs_devices.h b/os/various/fatfs_bindings/fatfs_devices.h new file mode 100644 index 0000000..5ec05ca --- /dev/null +++ b/os/various/fatfs_bindings/fatfs_devices.h @@ -0,0 +1,59 @@ +/* + ChibiOS - Copyright (C) 2006..2017 Giovanni Di Sirio + Copyright (C) 2015..2017 Diego Ismirlian, (dismirlian (at) google's mail) + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +#ifndef FATFS_DEVICES_H_ +#define FATFS_DEVICES_H_ + +#include "hal.h" + +#if HAL_USE_MMC_SPI && HAL_USE_SDC +#error "cannot specify both MMC_SPI and SDC drivers" +#endif + +#if HAL_USE_MMC_SPI +extern MMCDriver MMCD1; +#elif HAL_USE_SDC +extern SDCDriver SDCD1; +#elif HAL_USBH_USE_MSD + +#else +#error "MMC_SPI, SDC or USBH_MSD driver must be specified" +#endif + +/*-----------------------------------------------------------------------*/ +/* Correspondence between physical drive number and physical drive. */ +#if HAL_USE_MMC_SPI +#define FATFSDEV_MMC 0 +#define FATFSDEV_MMC_DRIVE "0:" +#endif + +#if HAL_USE_SDC +#define FATFSDEV_SDC 0 +#define FATFSDEV_SDC_DRIVE "0:" +#endif + +#if HAL_USBH_USE_MSD +#if defined(FATFSDEV_MMC) || defined(FATFSDEV_SDC) +#define FATFSDEV_MSDLUN0 1 +#define FATFSDEV_MSDLUN0_DRIVE "1:" +#else +#define FATFSDEV_MSDLUN0 0 +#define FATFSDEV_MSDLUN0_DRIVE "0:" +#endif +#endif + +#endif /* FATFS_DEVICES_H_ */ diff --git a/os/various/fatfs_bindings/fatfs_diskio.c b/os/various/fatfs_bindings/fatfs_diskio.c index 80d1502..3d068f3 100644 --- a/os/various/fatfs_bindings/fatfs_diskio.c +++ b/os/various/fatfs_bindings/fatfs_diskio.c @@ -9,38 +9,7 @@ #include "ffconf.h" #include "diskio.h" #include "usbh/dev/msd.h" - -#if HAL_USE_MMC_SPI && HAL_USE_SDC -#error "cannot specify both MMC_SPI and SDC drivers" -#endif - -#if HAL_USE_MMC_SPI -extern MMCDriver MMCD1; -#elif HAL_USE_SDC -extern SDCDriver SDCD1; -#elif HAL_USBH_USE_MSD - -#else -#error "MMC_SPI, SDC or USBH_MSD driver must be specified" -#endif - -/*-----------------------------------------------------------------------*/ -/* Correspondence between physical drive number and physical drive. */ -#if HAL_USE_MMC_SPI -#define MMC 0 -#endif - -#if HAL_USE_SDC -#define SDC 0 -#endif - -#if HAL_USBH_USE_MSD -#if defined(MMC) || defined(SDC) -#define MSDLUN0 1 -#else -#define MSDLUN0 0 -#endif -#endif +#include "fatfs_devices.h" /*-----------------------------------------------------------------------*/ /* Inidialize a Drive */ @@ -53,7 +22,7 @@ DSTATUS disk_initialize ( switch (pdrv) { #if HAL_USE_MMC_SPI - case MMC: + case FATFSDEV_MMC: stat = 0; /* It is initialized externally, just reads the status.*/ if (blkGetDriverState(&MMCD1) != BLK_READY) @@ -62,7 +31,7 @@ DSTATUS disk_initialize ( stat |= STA_PROTECT; return stat; #elif HAL_USE_SDC - case SDC: + case FATFSDEV_SDC: stat = 0; /* It is initialized externally, just reads the status.*/ if (blkGetDriverState(&SDCD1) != BLK_READY) @@ -72,7 +41,7 @@ DSTATUS disk_initialize ( return stat; #endif #if HAL_USBH_USE_MSD - case MSDLUN0: + case FATFSDEV_MSDLUN0: stat = 0; /* It is initialized externally, just reads the status.*/ if (blkGetDriverState(&MSBLKD[0]) != BLK_READY) @@ -96,7 +65,7 @@ DSTATUS disk_status ( switch (pdrv) { #if HAL_USE_MMC_SPI - case MMC: + case FATFSDEV_MMC: stat = 0; /* It is initialized externally, just reads the status.*/ if (blkGetDriverState(&MMCD1) != BLK_READY) @@ -105,7 +74,7 @@ DSTATUS disk_status ( stat |= STA_PROTECT; return stat; #elif HAL_USE_SDC - case SDC: + case FATFSDEV_SDC: stat = 0; /* It is initialized externally, just reads the status.*/ if (blkGetDriverState(&SDCD1) != BLK_READY) @@ -115,7 +84,7 @@ DSTATUS disk_status ( return stat; #endif #if HAL_USBH_USE_MSD - case MSDLUN0: + case FATFSDEV_MSDLUN0: stat = 0; /* It is initialized externally, just reads the status.*/ if (blkGetDriverState(&MSBLKD[0]) != BLK_READY) @@ -140,7 +109,7 @@ DRESULT disk_read ( { switch (pdrv) { #if HAL_USE_MMC_SPI - case MMC: + case FATFSDEV_MMC: if (blkGetDriverState(&MMCD1) != BLK_READY) return RES_NOTRDY; if (mmcStartSequentialRead(&MMCD1, sector)) @@ -155,7 +124,7 @@ DRESULT disk_read ( return RES_ERROR; return RES_OK; #elif HAL_USE_SDC - case SDC: + case FATFSDEV_SDC: if (blkGetDriverState(&SDCD1) != BLK_READY) return RES_NOTRDY; if (sdcRead(&SDCD1, sector, buff, count)) @@ -163,7 +132,7 @@ DRESULT disk_read ( return RES_OK; #endif #if HAL_USBH_USE_MSD - case MSDLUN0: + case FATFSDEV_MSDLUN0: /* It is initialized externally, just reads the status.*/ if (blkGetDriverState(&MSBLKD[0]) != BLK_READY) return RES_NOTRDY; @@ -189,7 +158,7 @@ DRESULT disk_write ( { switch (pdrv) { #if HAL_USE_MMC_SPI - case MMC: + case FATFSDEV_MMC: if (blkGetDriverState(&MMCD1) != BLK_READY) return RES_NOTRDY; if (mmcIsWriteProtected(&MMCD1)) @@ -206,7 +175,7 @@ DRESULT disk_write ( return RES_ERROR; return RES_OK; #elif HAL_USE_SDC - case SDC: + case FATFSDEV_SDC: if (blkGetDriverState(&SDCD1) != BLK_READY) return RES_NOTRDY; if (sdcWrite(&SDCD1, sector, buff, count)) @@ -214,7 +183,7 @@ DRESULT disk_write ( return RES_OK; #endif #if HAL_USBH_USE_MSD - case MSDLUN0: + case FATFSDEV_MSDLUN0: /* It is initialized externally, just reads the status.*/ if (blkGetDriverState(&MSBLKD[0]) != BLK_READY) return RES_NOTRDY; @@ -237,9 +206,10 @@ DRESULT disk_ioctl ( void *buff /* Buffer to send/receive control data */ ) { + (void)buff; switch (pdrv) { #if HAL_USE_MMC_SPI - case MMC: + case FATFSDEV_MMC: switch (cmd) { case CTRL_SYNC: return RES_OK; @@ -257,7 +227,7 @@ DRESULT disk_ioctl ( return RES_PARERR; } #elif HAL_USE_SDC - case SDC: + case FATFSDEV_SDC: switch (cmd) { case CTRL_SYNC: return RES_OK; @@ -282,7 +252,7 @@ DRESULT disk_ioctl ( } #endif #if HAL_USBH_USE_MSD - case MSDLUN0: + case FATFSDEV_MSDLUN0: switch (cmd) { case CTRL_SYNC: return RES_OK; diff --git a/testhal/STM32/STM32F4xx/USB_HOST/.project b/testhal/STM32/STM32F4xx/USB_HOST/.project index 066a4d6..e2dd63e 100644 --- a/testhal/STM32/STM32F4xx/USB_HOST/.project +++ b/testhal/STM32/STM32F4xx/USB_HOST/.project @@ -31,9 +31,9 @@ <locationURI>$%7BPARENT-5-PROJECT_LOC%7D/ChibiOS-contrib/os</locationURI> </link> <link> - <name>ChibiOS-RT-os</name> + <name>ChibiOS-RT</name> <type>2</type> - <locationURI>$%7BPARENT-5-PROJECT_LOC%7D/ChibiOS-RT/os</locationURI> + <locationURI>$%7BPARENT-5-PROJECT_LOC%7D/ChibiOS-RT</locationURI> </link> </linkedResources> </projectDescription> diff --git a/testhal/STM32/STM32F4xx/USB_HOST/main.c b/testhal/STM32/STM32F4xx/USB_HOST/main.c index c540233..6bc859e 100644 --- a/testhal/STM32/STM32F4xx/USB_HOST/main.c +++ b/testhal/STM32/STM32F4xx/USB_HOST/main.c @@ -297,6 +297,7 @@ start: #if HAL_USBH_USE_MSD
#include "usbh/dev/msd.h"
#include "ff.h"
+#include "fatfs_devices.h"
static FATFS MSDLUN0FS;
@@ -388,14 +389,14 @@ start: usbDbgPuts("FS: Block driver ready, try mount...");
- res = f_mount(&MSDLUN0FS, "0:", 1);
+ res = f_mount(&MSDLUN0FS, FATFSDEV_MSDLUN0_DRIVE, 1);
if (res != FR_OK) {
usbDbgPuts("FS: Can't mount. Check file system.");
continue;
}
usbDbgPuts("FS: Mounted.");
- res = f_getfree("0:", &clusters, &fsp);
+ res = f_getfree(FATFSDEV_MSDLUN0_DRIVE, &clusters, &fsp);
if (res != FR_OK) {
usbDbgPuts("FS: f_getfree() failed");
continue;
@@ -419,7 +420,7 @@ start: //write test
if (1) {
usbDbgPuts("FS: Write test (create file /test.dat, 1MB)");
- f_open(&file, "/test.dat", FA_CREATE_ALWAYS | FA_WRITE);
+ f_open(&file, FATFSDEV_MSDLUN0_DRIVE "/test.dat", FA_CREATE_ALWAYS | FA_WRITE);
src = start;
st = chVTGetSystemTime();
for (j = 0; j < 2048; j++) {
@@ -439,7 +440,7 @@ start: //read test
if (1) {
usbDbgPuts("FS: Read test (read file /test.dat, 1MB, compare)");
- f_open(&file, "/test.dat", FA_READ);
+ f_open(&file, FATFSDEV_MSDLUN0_DRIVE "/test.dat", FA_READ);
src = start;
st = chVTGetSystemTime();
for (j = 0; j < 2048; j++) {
@@ -463,7 +464,7 @@ start: //scan files test
if (1) {
usbDbgPuts("FS: Scan files test");
- fbuff[0] = 0;
+ strcpy((char *)fbuff, FATFSDEV_MSDLUN0_DRIVE);
scan_files(chp, (char *)fbuff);
}
}
|