2018.07.26
Dependencies: FATFileSystem2 mbed-rtos
Fork of USBHost by
Revision 32:e6717a485577, committed 2015-06-02
- Comitter:
- sayzyas
- Date:
- Tue Jun 02 05:57:44 2015 +0000
- Parent:
- 31:220cd93c9a5f
- Child:
- 33:86c22c0c8aae
- Commit message:
- 20150602
Changed in this revision
--- a/USBHost/USBHost.cpp Mon Jun 01 11:01:25 2015 +0100 +++ b/USBHost/USBHost.cpp Tue Jun 02 05:57:44 2015 +0000 @@ -146,13 +146,15 @@ res = getDeviceDescriptor(&devices[i], buf, 8); if (res == USB_TYPE_OK) { + break; } Thread::wait(100); } - USB_INFO("New device connected: %p [hub: %d - port: %d]", &devices[i], usb_msg->hub, usb_msg->port); + USB_INFO("新しいデバイスが接続されました。"); + USB_INFO("%p [hub: %d - port: %d]", &devices[i], usb_msg->hub, usb_msg->port); #if MAX_HUB_NB if (buf[4] == HUB_CLASS) { @@ -162,11 +164,14 @@ if (hubs[k].connect(&devices[i])) { devices[i].hub = &hubs[k]; hub_in_use[k] = true; + USB_INFO("XX1"); break; } } - if (hub_in_use[k] == true) - break; + if (hub_in_use[k] == true){ + USB_INFO("XX2"); + break; + } } } @@ -175,15 +180,26 @@ too_many_hub = true; } } + else{ + USB_INFO("XX3"); + } - if (usb_msg->hub_parent) + if (usb_msg->hub_parent){ + USB_INFO("XX31"); ((USBHostHub *)(usb_msg->hub_parent))->deviceConnected(&devices[i]); + } + else{ + USB_INFO("XX4"); + } #endif if ((i < MAX_DEVICE_CONNECTED) && !too_many_hub) { deviceInUse[i] = true; + USB_INFO("XX5"); } - + else{ + deviceInUse[i] = true; + } } while(0); break;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBHostHID/USBHostGamepad.cpp Tue Jun 02 05:57:44 2015 +0000 @@ -0,0 +1,196 @@ +/* mbed USBHost Gamepad driver sample + * Copyright (c) 2014 Yuuichi Akagawa + * + * modified from mbed USBHostMouse + * + * mbed USBHost Library + * Copyright (c) 2006-2013 ARM Limited + * + * 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. + * Refer to following URL: + * https://developer.mbed.org/users/YuuichiAkagawa/code/USBHostGamepad/file/7345e2afa41e/USBHostGamepad.cpp + */ +#include "USBHostGamepad.h" +//#if USBHOST_GAMEPAD + +USBHostGamepad::USBHostGamepad() { + host = USBHost::getHostInst(); + init(); +} + +void USBHostGamepad::init() { + dev = NULL; + int_in = NULL; + onUpdate = NULL; + report_id = 0; + dev_connected = false; + gamepad_device_found = false; + gamepad_intf = -1; + + btnX = 0; + btnY = 0; + btnABCD = 0; + btnSpecial = 0; +} + +bool USBHostGamepad::connected() { + return dev_connected; +} + +bool USBHostGamepad::connect() { + int len_listen; + + if (dev_connected) { + return true; + } + + for (uint8_t i = 0; i < MAX_DEVICE_CONNECTED; i++) { + if ((dev = host->getDevice(i)) != NULL) { + + if(host->enumerate(dev, this)) + break; + + if (gamepad_device_found) { + + int_in = dev->getEndpoint(gamepad_intf, INTERRUPT_ENDPOINT, IN); + if (!int_in) + break; + + USB_INFO("New Gamepad/Joystick device: VID:%04x PID:%04x [dev: %p - intf: %d]", dev->getVid(), dev->getPid(), dev, gamepad_intf); +#if DEBUG > 3 + //Parse HID Report Descriptor + parseHidDescr(); +#endif + dev->setName("Gamepad", gamepad_intf); + host->registerDriver(dev, gamepad_intf, this, &USBHostGamepad::init); + + int_in->attach(this, &USBHostGamepad::rxHandler); + len_listen = int_in->getSize(); + if (len_listen > sizeof(report)) { + len_listen = sizeof(report); + } + host->interruptRead(dev, int_in, report, len_listen, false); + + dev_connected = true; + return true; + } + } + } + init(); + return false; +} + +void USBHostGamepad::rxHandler() { + int len_listen = int_in->getSize(); +#if DEBUG > 3 + USB_DBG("USBHostGamepad::rxHandler() len_listen=%d\r\n", len_listen); + for (int i = 0; i < len_listen; i++) + printf("%02X ", report[i]); + printf("\r\n\r\n"); +#endif + if (onUpdate) { + (*onUpdate)(report[0], report[1], report[5], report[6]); + } + + // update gamepad state + btnX = report[0]; + btnY = report[1]; + btnABCD = report[5]; + btnSpecial = report[6]; + + if (len_listen > sizeof(report)) { + len_listen = sizeof(report); + } + + if (dev) + host->interruptRead(dev, int_in, report, len_listen, false); +} + +/*virtual*/ void USBHostGamepad::setVidPid(uint16_t vid, uint16_t pid) +{ + // we don't check VID/PID for gamepad driver +} + +/*virtual*/ bool USBHostGamepad::parseInterface(uint8_t intf_nb, uint8_t intf_class, uint8_t intf_subclass, uint8_t intf_protocol) //Must return true if the interface should be parsed +{ + if ((gamepad_intf == -1) && + (intf_class == HID_CLASS) && + (intf_subclass == 0x00) && + (intf_protocol == 0x00)) { + gamepad_intf = intf_nb; + return true; + } + return false; +} + +/*virtual*/ bool USBHostGamepad::useEndpoint(uint8_t intf_nb, ENDPOINT_TYPE type, ENDPOINT_DIRECTION dir) //Must return true if the endpoint will be used +{ + if (intf_nb == gamepad_intf) { + if (type == INTERRUPT_ENDPOINT && dir == IN) { + gamepad_device_found = true; + return true; + } + } + return false; +} + +USB_TYPE USBHostGamepad::getReportDescriptor(USBDeviceConnected * dev, uint8_t * buf, uint16_t max_len_buf, uint16_t * len_rep_descr) +{ + USB_TYPE t = host->controlRead( dev, + USB_DEVICE_TO_HOST | USB_RECIPIENT_INTERFACE | USB_REQUEST_TYPE_STANDARD, + HID_GET_DESCRIPTOR, + 0x2200, + 0, buf, max_len_buf); + if (len_rep_descr) + *len_rep_descr = max_len_buf; + + return t; +} + +/* + * HID Report Descriptor parser + */ +bool USBHostGamepad::parseHidDescr() +{ + bool ret = true; + uint8_t *buf; + uint16_t desclen = host->getLengthReportDescr(); + + //allocate report descriptor's buffer + buf = (uint8_t *)malloc(desclen); + if(buf == NULL){ + return false; + } + getReportDescriptor(dev, buf, desclen); + #if (DEBUG > 3) + USB_DBG("HID REPORT DESCRIPTOR:\r\n"); + for (int i = 0; i < desclen; i++) + printf("%02X ", buf[i]); + printf("\r\n\r\n"); + #endif + if( buf[0] == 0x05 //Usage page + && buf[1] == 0x01 //Generic Desktop + && buf[2] == 0x09 //Usage + ){ + if( buf[3] == 0x04 ){ + USB_DBG("GAMEPAD"); + }else if( buf[3] == 0x05){ + USB_DBG("JOYSTICK"); + }else{ + ret = false; + } + } + free(buf); + return ret; +} +//#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBHostHID/USBHostGamepad.h Tue Jun 02 05:57:44 2015 +0000 @@ -0,0 +1,116 @@ +/* mbed USBHost Gamepad driver sample + * Copyright (c) 2014 Yuuichi Akagawa + * + * modified from mbed USBHostMouse + * + * Copyright (c) 2014 mbed.org, MIT License + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software + * and associated documentation files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or + * substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef USBHOSTGAMEPAD_H +#define USBHOSTGAMEPAD_H + +#include "USBHostConf.h" + +//#if USBHOST_GAMEPAD + +#include "USBHost.h" +//HID Class Request +#define HID_GET_REPORT 0x01 +#define HID_GET_IDLE 0x02 +#define HID_GET_PROTOCOL 0x03 +#define HID_GET_DESCRIPTOR 0x06 +#define HID_SET_REPORT 0x09 +#define HID_SET_IDLE 0x0a +#define HID_SET_PROTOCOL 0x0b + +/** + * A class to communicate a USB MIDI device + */ +class USBHostGamepad : public IUSBEnumerator { +public: + /** + * Constructor + */ + USBHostGamepad(); + + /** + * Try to connect a gamepad device + * + * @return true if connection was successful + */ + bool connect(); + + /** + * Check if a gamepad is connected + * + * @returns true if a gamepad is connected + */ + bool connected(); + + /** + * Attach a callback called when a gamepad event is received + * + * @param ptr function pointer + */ + inline void attachEvent(void (*ptr)(uint8_t btnX, uint8_t btnY, uint8_t btnABCD, uint8_t btnSpecial)) { + if (ptr != NULL) { + onUpdate = ptr; + } + } + + /** + * Request the HID report descriptor + * + * @param dev request the device descriptor on this device + * @param buf buffer to store the device descriptor + * @param max_len_buf maximum size of buf + * @param len_dev_descr pointer to store the length of the packet transferred + */ + USB_TYPE getReportDescriptor(USBDeviceConnected * dev, uint8_t * buf, uint16_t max_len_buf, uint16_t * len_rep_descr = NULL); + +protected: + //From IUSBEnumerator + virtual void setVidPid(uint16_t vid, uint16_t pid); + virtual bool parseInterface(uint8_t intf_nb, uint8_t intf_class, uint8_t intf_subclass, uint8_t intf_protocol); //Must return true if the interface should be parsed + virtual bool useEndpoint(uint8_t intf_nb, ENDPOINT_TYPE type, ENDPOINT_DIRECTION dir); //Must return true if the endpoint will be used + +private: + USBHost * host; + USBDeviceConnected * dev; + USBEndpoint * int_in; + uint8_t report[8]; + + bool dev_connected; + bool gamepad_device_found; + int gamepad_intf; + + uint8_t btnX; + uint8_t btnY; + uint8_t btnABCD; + uint8_t btnSpecial; + + void rxHandler(); + void (*onUpdate)(uint8_t btnX, uint8_t btnY, uint8_t btnABCD, uint8_t btnSpecial); + int report_id; + void init(); + bool parseHidDescr(); +}; + +//#endif + +#endif
--- a/USBHostHID/USBHostMouse.cpp Mon Jun 01 11:01:25 2015 +0100 +++ b/USBHostHID/USBHostMouse.cpp Tue Jun 02 05:57:44 2015 +0000 @@ -48,22 +48,22 @@ bool USBHostMouse::connect() { int len_listen; - + if (dev_connected) { return true; } for (uint8_t i = 0; i < MAX_DEVICE_CONNECTED; i++) { if ((dev = host->getDevice(i)) != NULL) { - - if(host->enumerate(dev, this)) + if(host->enumerate(dev, this)){ break; - + } if (mouse_device_found) { - int_in = dev->getEndpoint(mouse_intf, INTERRUPT_ENDPOINT, IN); - if (!int_in) + if (!int_in){ + USB_INFO("b"); break; + } USB_INFO("New Mouse device: VID:%04x PID:%04x [dev: %p - intf: %d]", dev->getVid(), dev->getPid(), dev, mouse_intf); dev->setName("Mouse", mouse_intf); @@ -86,6 +86,7 @@ } void USBHostMouse::rxHandler() { + // このハンドラーでマウスイベントを取得している。 int len_listen = int_in->getSize(); if (onUpdate) {
--- a/mbed-rtos.lib Mon Jun 01 11:01:25 2015 +0100 +++ b/mbed-rtos.lib Tue Jun 02 05:57:44 2015 +0000 @@ -1,1 +1,1 @@ -http://mbed.org/users/mbed_official/code/mbed-rtos/#2db19f47c2ba +http://mbed.org/users/mbed_official/code/mbed-rtos/#2dab120a94c2