USB Host Driver with Socket Modem support. Works with revision 323 of mbed-src but broken with any later version.

Dependencies:   FATFileSystem

Fork of F401RE-USBHost by Norimasa Okamoto

Committer:
fritz291
Date:
Mon Jun 22 19:57:32 2015 +0000
Revision:
22:eaefd60717c4
Parent:
21:b4d53cc6d6ac
Child:
23:7e6294a61139
Created USB Class Macros and removed commented code.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
fritz291 21:b4d53cc6d6ac 1 /* mbed USBHost Library
fritz291 21:b4d53cc6d6ac 2 * Copyright (c) 2006-2013 ARM Limited
fritz291 21:b4d53cc6d6ac 3 *
fritz291 21:b4d53cc6d6ac 4 * Licensed under the Apache License, Version 2.0 (the "License");
fritz291 21:b4d53cc6d6ac 5 * you may not use this file except in compliance with the License.
fritz291 21:b4d53cc6d6ac 6 * You may obtain a copy of the License at
fritz291 21:b4d53cc6d6ac 7 *
fritz291 21:b4d53cc6d6ac 8 * http://www.apache.org/licenses/LICENSE-2.0
fritz291 21:b4d53cc6d6ac 9 *
fritz291 21:b4d53cc6d6ac 10 * Unless required by applicable law or agreed to in writing, software
fritz291 21:b4d53cc6d6ac 11 * distributed under the License is distributed on an "AS IS" BASIS,
fritz291 21:b4d53cc6d6ac 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
fritz291 21:b4d53cc6d6ac 13 * See the License for the specific language governing permissions and
fritz291 21:b4d53cc6d6ac 14 * limitations under the License.
fritz291 21:b4d53cc6d6ac 15 */
fritz291 21:b4d53cc6d6ac 16
fritz291 21:b4d53cc6d6ac 17 #include "USBHostSocketModem.h"
fritz291 21:b4d53cc6d6ac 18 #include "dbg.h"
fritz291 21:b4d53cc6d6ac 19
fritz291 21:b4d53cc6d6ac 20 #define DEVICE_TO_HOST 0x80
fritz291 21:b4d53cc6d6ac 21 #define HOST_TO_DEVICE 0x00
fritz291 22:eaefd60717c4 22 #define DTR 0x0003
fritz291 22:eaefd60717c4 23 //Communications and CDC Control Class
fritz291 22:eaefd60717c4 24 #define CDCCONTROL 0x2
fritz291 22:eaefd60717c4 25 //CDC Data Class
fritz291 22:eaefd60717c4 26 #define CDCDATA 0xA
fritz291 22:eaefd60717c4 27
fritz291 21:b4d53cc6d6ac 28
fritz291 21:b4d53cc6d6ac 29 USBHostSocketModem::USBHostSocketModem()
fritz291 21:b4d53cc6d6ac 30 {
fritz291 21:b4d53cc6d6ac 31 host = USBHost::getHostInst();
fritz291 21:b4d53cc6d6ac 32 init();
fritz291 21:b4d53cc6d6ac 33 }
fritz291 21:b4d53cc6d6ac 34
fritz291 21:b4d53cc6d6ac 35 void USBHostSocketModem::init()
fritz291 21:b4d53cc6d6ac 36 {
fritz291 21:b4d53cc6d6ac 37 dev_connected = false;
fritz291 21:b4d53cc6d6ac 38 dev = NULL;
fritz291 21:b4d53cc6d6ac 39 bulk_in = NULL;
fritz291 21:b4d53cc6d6ac 40 bulk_out = NULL;
fritz291 21:b4d53cc6d6ac 41 int_in = NULL;
fritz291 21:b4d53cc6d6ac 42 int_out = NULL;
fritz291 21:b4d53cc6d6ac 43 dev_connected = false;
fritz291 21:b4d53cc6d6ac 44 sm_intf = -1;
fritz291 21:b4d53cc6d6ac 45 sm_device_found = false;
fritz291 21:b4d53cc6d6ac 46 dev_connected = false;
fritz291 21:b4d53cc6d6ac 47 nb_ep = 0;
fritz291 21:b4d53cc6d6ac 48 }
fritz291 21:b4d53cc6d6ac 49
fritz291 21:b4d53cc6d6ac 50
fritz291 21:b4d53cc6d6ac 51 bool USBHostSocketModem::connected()
fritz291 21:b4d53cc6d6ac 52 {
fritz291 21:b4d53cc6d6ac 53 return dev_connected;
fritz291 21:b4d53cc6d6ac 54 }
fritz291 21:b4d53cc6d6ac 55
fritz291 21:b4d53cc6d6ac 56 bool USBHostSocketModem::connect()
fritz291 21:b4d53cc6d6ac 57 {
fritz291 21:b4d53cc6d6ac 58
fritz291 21:b4d53cc6d6ac 59 if (dev_connected) {
fritz291 21:b4d53cc6d6ac 60 return true;
fritz291 21:b4d53cc6d6ac 61 }
fritz291 21:b4d53cc6d6ac 62
fritz291 21:b4d53cc6d6ac 63 for (uint8_t i = 0; i < MAX_DEVICE_CONNECTED; i++) {
fritz291 21:b4d53cc6d6ac 64 if ((dev = host->getDevice(i)) != NULL) {
fritz291 21:b4d53cc6d6ac 65
fritz291 21:b4d53cc6d6ac 66 USB_DBG("Trying to connect SocketModem device\r\n");
fritz291 21:b4d53cc6d6ac 67 if(host->enumerate(dev, this)){
fritz291 21:b4d53cc6d6ac 68 printf("didn't fully enumerate\n");
fritz291 21:b4d53cc6d6ac 69 break;
fritz291 21:b4d53cc6d6ac 70 }
fritz291 21:b4d53cc6d6ac 71
fritz291 21:b4d53cc6d6ac 72 if (sm_device_found) {
fritz291 21:b4d53cc6d6ac 73 //Set DTR
fritz291 21:b4d53cc6d6ac 74 USBHostSocketModem::setDTR();
fritz291 21:b4d53cc6d6ac 75 int_out = dev->getEndpoint(int_intf, INTERRUPT_ENDPOINT, OUT);
fritz291 21:b4d53cc6d6ac 76 bulk_out = dev->getEndpoint(bulk_intf, BULK_ENDPOINT, OUT);
fritz291 21:b4d53cc6d6ac 77 if (bulk_in == NULL){
fritz291 21:b4d53cc6d6ac 78 printf("bulk_in == NULL\n");
fritz291 21:b4d53cc6d6ac 79 }
fritz291 21:b4d53cc6d6ac 80 bulk_in = dev->getEndpoint(bulk_intf, BULK_ENDPOINT, IN);
fritz291 21:b4d53cc6d6ac 81 printf("!SocketModem Found!\n");
fritz291 21:b4d53cc6d6ac 82
fritz291 21:b4d53cc6d6ac 83 if (!bulk_in || !bulk_out){
fritz291 21:b4d53cc6d6ac 84 continue;
fritz291 21:b4d53cc6d6ac 85 }
fritz291 21:b4d53cc6d6ac 86
fritz291 21:b4d53cc6d6ac 87 USB_INFO("New SocketModem device: VID:%04x PID:%04x [dev: %p - intf: %d]", dev->getVid(), dev->getPid(), dev, sm_intf);
fritz291 21:b4d53cc6d6ac 88 dev->setName("SocketModem", bulk_intf);
fritz291 21:b4d53cc6d6ac 89 host->registerDriver(dev, bulk_intf, this, &USBHostSocketModem::init);
fritz291 21:b4d53cc6d6ac 90
fritz291 21:b4d53cc6d6ac 91 dev_connected = true;
fritz291 21:b4d53cc6d6ac 92 return true;
fritz291 21:b4d53cc6d6ac 93 }
fritz291 21:b4d53cc6d6ac 94 } //if()
fritz291 21:b4d53cc6d6ac 95 } //for()
fritz291 21:b4d53cc6d6ac 96 init();
fritz291 21:b4d53cc6d6ac 97 return false;
fritz291 21:b4d53cc6d6ac 98 }
fritz291 21:b4d53cc6d6ac 99
fritz291 21:b4d53cc6d6ac 100 /*virtual*/ void USBHostSocketModem::setVidPid(uint16_t vid, uint16_t pid)
fritz291 21:b4d53cc6d6ac 101 {
fritz291 21:b4d53cc6d6ac 102 // we don't check VID/PID for MSD driver
fritz291 21:b4d53cc6d6ac 103 }
fritz291 21:b4d53cc6d6ac 104
fritz291 21:b4d53cc6d6ac 105 /*virtual*/ bool USBHostSocketModem::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
fritz291 21:b4d53cc6d6ac 106 {
fritz291 21:b4d53cc6d6ac 107 printf("Parsing Interface\n");
fritz291 21:b4d53cc6d6ac 108 //printf("class = %i\n",intf_class);
fritz291 21:b4d53cc6d6ac 109 //printf("subclass = %i\n",intf_subclass);
fritz291 21:b4d53cc6d6ac 110 //printf("msd_intf = %i\n",msd_intf);
fritz291 21:b4d53cc6d6ac 111 printf("intf_class = %i\n",intf_class);
fritz291 22:eaefd60717c4 112 if ((sm_intf == -1) && (intf_class == CDCCONTROL))
fritz291 21:b4d53cc6d6ac 113 {
fritz291 21:b4d53cc6d6ac 114 sm_intf = intf_nb;
fritz291 21:b4d53cc6d6ac 115 int_intf = intf_nb;
fritz291 21:b4d53cc6d6ac 116 //printf("parse interface: sm_intf = %i\n", sm_intf);
fritz291 21:b4d53cc6d6ac 117 return true;
fritz291 21:b4d53cc6d6ac 118 }
fritz291 22:eaefd60717c4 119 else if ((sm_intf == 0) && (intf_class == CDCDATA))
fritz291 21:b4d53cc6d6ac 120 {
fritz291 21:b4d53cc6d6ac 121 sm_intf = intf_nb;
fritz291 21:b4d53cc6d6ac 122 bulk_intf = intf_nb;
fritz291 21:b4d53cc6d6ac 123 //printf("parse interface: sm_intf = %i\n", sm_intf);
fritz291 21:b4d53cc6d6ac 124 return true;
fritz291 21:b4d53cc6d6ac 125 }
fritz291 21:b4d53cc6d6ac 126 return false;
fritz291 21:b4d53cc6d6ac 127 }
fritz291 21:b4d53cc6d6ac 128
fritz291 21:b4d53cc6d6ac 129 /*virtual*/ bool USBHostSocketModem::useEndpoint(uint8_t intf_nb, ENDPOINT_TYPE type, ENDPOINT_DIRECTION dir) //Must return true if the endpoint will be used
fritz291 21:b4d53cc6d6ac 130 {
fritz291 21:b4d53cc6d6ac 131 printf("Setting up Endpoint\n");
fritz291 21:b4d53cc6d6ac 132 if ((intf_nb == int_intf) || (intf_nb == bulk_intf)){
fritz291 21:b4d53cc6d6ac 133 /*if (type == INTERRUPT_ENDPOINT)*/
fritz291 21:b4d53cc6d6ac 134 if ((type == BULK_ENDPOINT) || (type == INTERRUPT_ENDPOINT)){
fritz291 21:b4d53cc6d6ac 135 printf("type == %s\n", type);
fritz291 21:b4d53cc6d6ac 136 nb_ep++;
fritz291 21:b4d53cc6d6ac 137 if (nb_ep == 2)
fritz291 21:b4d53cc6d6ac 138 printf("nb_ep == 2\n");
fritz291 21:b4d53cc6d6ac 139 sm_device_found = true;
fritz291 21:b4d53cc6d6ac 140 return true;
fritz291 21:b4d53cc6d6ac 141 }
fritz291 21:b4d53cc6d6ac 142 }
fritz291 21:b4d53cc6d6ac 143 return false;
fritz291 21:b4d53cc6d6ac 144 }
fritz291 21:b4d53cc6d6ac 145
fritz291 21:b4d53cc6d6ac 146 void USBHostSocketModem::setDTR()
fritz291 21:b4d53cc6d6ac 147 {
fritz291 21:b4d53cc6d6ac 148 //Set USB DTR to enable communication
fritz291 22:eaefd60717c4 149 int res = host->controlWrite(dev, 0x21, 0x22, DTR, 0, NULL, 0);
fritz291 21:b4d53cc6d6ac 150 }
fritz291 21:b4d53cc6d6ac 151
fritz291 21:b4d53cc6d6ac 152
fritz291 21:b4d53cc6d6ac 153
fritz291 21:b4d53cc6d6ac 154
fritz291 21:b4d53cc6d6ac 155