aboutsummaryrefslogtreecommitdiffstats
path: root/os
diff options
context:
space:
mode:
Diffstat (limited to 'os')
-rw-r--r--os/hal/include/hal_usbh.h15
-rw-r--r--os/hal/src/hal_usbh.c8
-rw-r--r--os/hal/src/usbh/hal_usbh_aoa.c31
-rw-r--r--os/hal/src/usbh/hal_usbh_debug.c23
-rw-r--r--os/hal/src/usbh/hal_usbh_ftdi.c1
-rw-r--r--os/various/fatfs_bindings/fatfs.mk2
-rw-r--r--os/various/fatfs_bindings/fatfs_devices.h41
-rw-r--r--os/various/fatfs_bindings/fatfs_diskio.c72
8 files changed, 131 insertions, 62 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/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 1447bdb..4e1d65d 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);
@@ -535,14 +546,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/hal/src/usbh/hal_usbh_ftdi.c b/os/hal/src/usbh/hal_usbh_ftdi.c
index 7bd8f2d..b262256 100644
--- a/os/hal/src/usbh/hal_usbh_ftdi.c
+++ b/os/hal/src/usbh/hal_usbh_ftdi.c
@@ -150,6 +150,7 @@ alloc_ok:
case 0x900: //232H;
uinfo("FTDI: Type H chip");
ftdip->type = USBHFTDI_TYPE_H;
+ break;
default:
uerr("FTDI: Unrecognized chip type");
return NULL;
diff --git a/os/various/fatfs_bindings/fatfs.mk b/os/various/fatfs_bindings/fatfs.mk
index 2a3b4d6..7548acf 100644
--- a/os/various/fatfs_bindings/fatfs.mk
+++ b/os/various/fatfs_bindings/fatfs.mk
@@ -4,7 +4,7 @@ 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
# Shared variables
ALLCSRC += $(FATFSSRC)
diff --git a/os/various/fatfs_bindings/fatfs_devices.h b/os/various/fatfs_bindings/fatfs_devices.h
new file mode 100644
index 0000000..fe28383
--- /dev/null
+++ b/os/various/fatfs_bindings/fatfs_devices.h
@@ -0,0 +1,41 @@
+/*
+ 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"
+
+/*-----------------------------------------------------------------------*/
+/* Correspondence between physical drive number and physical drive. */
+#if HAL_USE_MMC_SPI || HAL_USE_SDC
+#define FATFSDEV_MMC 0
+#define FATFSDEV_MMC_DRIVE "0:"
+#endif
+
+
+#if HAL_USBH_USE_MSD
+#if defined(FATFSDEV_MMC)
+#define FATFSDEV_MSD 1
+#define FATFSDEV_MSD_DRIVE "1:"
+#else
+#define FATFSDEV_MSD 0
+#define FATFSDEV_MSD_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 7f510a0..e3cfd53 100644
--- a/os/various/fatfs_bindings/fatfs_diskio.c
+++ b/os/various/fatfs_bindings/fatfs_diskio.c
@@ -7,17 +7,19 @@
#include "hal.h"
#include "ffconf.h"
+#include "ff.h"
#include "diskio.h"
#include "usbh/dev/msd.h"
+#include "fatfs_devices.h"
#if HAL_USE_MMC_SPI && HAL_USE_SDC
-#error "cannot specify both MMC_SPI and SDC drivers"
+#error "cannot specify both MMC_SPI and FATFSDEV_MMC drivers"
#endif
// sanity check for no FAT option selected
// why is the FAT sources being pulled into the build?
#if !HAL_USE_MMC_SPI && !HAL_USE_SDC & !HAL_USBH_USE_MSD
-#error "MMC_SPI, SDC or USBH_MSD driver must be specified. None was."
+#error "MMC_SPI, FATFSDEV_MMC or USBH_MSD driver must be specified. None was."
#endif
#if !defined(FATFS_HAL_DEVICE)
@@ -41,24 +43,6 @@ extern SDCDriver FATFS_HAL_DEVICE;
extern RTCDriver RTCD1;
#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
-
/*-----------------------------------------------------------------------*/
/* Inidialize a Drive */
@@ -71,7 +55,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(&FATFS_HAL_DEVICE) != BLK_READY)
@@ -80,7 +64,7 @@ DSTATUS disk_initialize (
stat |= STA_PROTECT;
return stat;
#elif HAL_USE_SDC
- case SDC:
+ case FATFSDEV_MMC:
stat = 0;
/* It is initialized externally, just reads the status.*/
if (blkGetDriverState(&FATFS_HAL_DEVICE) != BLK_READY)
@@ -90,7 +74,7 @@ DSTATUS disk_initialize (
return stat;
#endif
#if HAL_USBH_USE_MSD
- case MSDLUN0:
+ case FATFSDEV_MSD:
stat = 0;
/* It is initialized externally, just reads the status.*/
if (blkGetDriverState(&MSBLKD[0]) != BLK_READY)
@@ -114,7 +98,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(&FATFS_HAL_DEVICE) != BLK_READY)
@@ -123,7 +107,7 @@ DSTATUS disk_status (
stat |= STA_PROTECT;
return stat;
#elif HAL_USE_SDC
- case SDC:
+ case FATFSDEV_MMC:
stat = 0;
/* It is initialized externally, just reads the status.*/
if (blkGetDriverState(&FATFS_HAL_DEVICE) != BLK_READY)
@@ -133,7 +117,7 @@ DSTATUS disk_status (
return stat;
#endif
#if HAL_USBH_USE_MSD
- case MSDLUN0:
+ case FATFSDEV_MSD:
stat = 0;
/* It is initialized externally, just reads the status.*/
if (blkGetDriverState(&MSBLKD[0]) != BLK_READY)
@@ -158,7 +142,7 @@ DRESULT disk_read (
{
switch (pdrv) {
#if HAL_USE_MMC_SPI
- case MMC:
+ case FATFSDEV_MMC:
if (blkGetDriverState(&FATFS_HAL_DEVICE) != BLK_READY)
return RES_NOTRDY;
if (mmcStartSequentialRead(&FATFS_HAL_DEVICE, sector))
@@ -173,7 +157,7 @@ DRESULT disk_read (
return RES_ERROR;
return RES_OK;
#elif HAL_USE_SDC
- case SDC:
+ case FATFSDEV_MMC:
if (blkGetDriverState(&FATFS_HAL_DEVICE) != BLK_READY)
return RES_NOTRDY;
if (sdcRead(&FATFS_HAL_DEVICE, sector, buff, count))
@@ -181,7 +165,7 @@ DRESULT disk_read (
return RES_OK;
#endif
#if HAL_USBH_USE_MSD
- case MSDLUN0:
+ case FATFSDEV_MSD:
/* It is initialized externally, just reads the status.*/
if (blkGetDriverState(&MSBLKD[0]) != BLK_READY)
return RES_NOTRDY;
@@ -209,7 +193,7 @@ DRESULT disk_write (
switch (pdrv) {
#if HAL_USE_MMC_SPI
- case MMC:
+ case FATFSDEV_MMC:
if (blkGetDriverState(&FATFS_HAL_DEVICE) != BLK_READY)
return RES_NOTRDY;
if (mmcIsWriteProtected(&FATFS_HAL_DEVICE))
@@ -218,19 +202,19 @@ DRESULT disk_write (
return RES_ERROR;
while (count > 0) {
- // invalidate cache on buffer
- cacheBufferFlush(buff, MMCSD_BLOCK_SIZE);
+ // invalidate cache on buffer
+ cacheBufferFlush(buff, MMCSD_BLOCK_SIZE);
- if (mmcSequentialWrite(&FATFS_HAL_DEVICE, buff))
- return RES_ERROR;
- buff += MMCSD_BLOCK_SIZE;
- count--;
+ if (mmcSequentialWrite(&FATFS_HAL_DEVICE, buff))
+ return RES_ERROR;
+ buff += MMCSD_BLOCK_SIZE;
+ count--;
}
if (mmcStopSequentialWrite(&FATFS_HAL_DEVICE))
return RES_ERROR;
return RES_OK;
#elif HAL_USE_SDC
- case SDC:
+ case FATFSDEV_MMC:
if (blkGetDriverState(&FATFS_HAL_DEVICE) != BLK_READY)
return RES_NOTRDY;
@@ -238,18 +222,18 @@ DRESULT disk_write (
cacheBufferFlush(buff, count * MMCSD_BLOCK_SIZE);
if (sdcWrite(&FATFS_HAL_DEVICE, sector, buff, count))
- return RES_ERROR;
+ return RES_ERROR;
return RES_OK;
#endif
#if HAL_USBH_USE_MSD
- case MSDLUN0:
+ case FATFSDEV_MSD:
/* It is initialized externally, just reads the status.*/
if (blkGetDriverState(&MSBLKD[0]) != BLK_READY)
return RES_NOTRDY;
- // invalidate cache on buffer
- cacheBufferFlush(buff, count * MSBLKD[0].info.blk_size);
+ // invalidate cache on buffer
+ cacheBufferFlush(buff, count * MSBLKD[0].info.blk_size);
if (usbhmsdLUNWrite(&MSBLKD[0], sector, buff, count))
return RES_ERROR;
@@ -275,7 +259,7 @@ DRESULT disk_ioctl (
switch (pdrv) {
#if HAL_USE_MMC_SPI
- case MMC:
+ case FATFSDEV_MMC:
switch (cmd) {
case CTRL_SYNC:
return RES_OK;
@@ -293,7 +277,7 @@ DRESULT disk_ioctl (
return RES_PARERR;
}
#elif HAL_USE_SDC
- case SDC:
+ case FATFSDEV_MMC:
switch (cmd) {
case CTRL_SYNC:
return RES_OK;
@@ -318,7 +302,7 @@ DRESULT disk_ioctl (
}
#endif
#if HAL_USBH_USE_MSD
- case MSDLUN0:
+ case FATFSDEV_MSD:
switch (cmd) {
case CTRL_SYNC:
return RES_OK;