aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDiego Ismirlian <dismirlian (at) google's mail.com>2017-11-19 21:20:57 -0300
committerDiego Ismirlian <dismirlian (at) google's mail.com>2017-11-19 21:20:57 -0300
commitdbaa1b87001d7c0c1e7970b66304011e7538c457 (patch)
treeb6bfd82b0a362e7c38faab3fc699effea0ba34e1
parent61dfc26804aba33384ff57876f76b3f9031eb7c2 (diff)
downloadChibiOS-Contrib-dbaa1b87001d7c0c1e7970b66304011e7538c457.tar.gz
ChibiOS-Contrib-dbaa1b87001d7c0c1e7970b66304011e7538c457.tar.bz2
ChibiOS-Contrib-dbaa1b87001d7c0c1e7970b66304011e7538c457.zip
USBH: AOA: Various improvements
-rw-r--r--os/hal/src/usbh/hal_usbh_aoa.c31
1 files changed, 22 insertions, 9 deletions
diff --git a/os/hal/src/usbh/hal_usbh_aoa.c b/os/hal/src/usbh/hal_usbh_aoa.c
index 85c3130..cb3fd18 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, MS2ST(16), _vt, aoacp);
}
- chVTSetI(&aoacp->vt, MS2ST(16), _vt, aoacp);
osalSysUnlockFromISR();
}