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 20:41:00 2015 +0000
Revision:
23:7e6294a61139
Parent:
22:eaefd60717c4
Child:
25:36cbb55f5627
Added more USB CDC Macros.

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 //Communications and CDC Control Class
fritz291 22:eaefd60717c4 23 #define CDCCONTROL 0x2
fritz291 22:eaefd60717c4 24 //CDC Data Class
fritz291 22:eaefd60717c4 25 #define CDCDATA 0xA
fritz291 23:7e6294a61139 26 //CDC Set Control Line State Request
fritz291 23:7e6294a61139 27 #define SET_CONTROL_LINE_STATE 0x22
fritz291 23:7e6294a61139 28 //CDC Request Type
fritz291 23:7e6294a61139 29 #define DTR_REQUEST_TYPE 0x21
fritz291 23:7e6294a61139 30 //Set Bits of SetControlLineState register to Enable DTR
fritz291 23:7e6294a61139 31 #define DTR 0x0003
fritz291 22:eaefd60717c4 32
fritz291 21:b4d53cc6d6ac 33
fritz291 21:b4d53cc6d6ac 34 USBHostSocketModem::USBHostSocketModem()
fritz291 21:b4d53cc6d6ac 35 {
fritz291 21:b4d53cc6d6ac 36 host = USBHost::getHostInst();
fritz291 21:b4d53cc6d6ac 37 init();
fritz291 21:b4d53cc6d6ac 38 }
fritz291 21:b4d53cc6d6ac 39
fritz291 21:b4d53cc6d6ac 40 void USBHostSocketModem::init()
fritz291 21:b4d53cc6d6ac 41 {
fritz291 21:b4d53cc6d6ac 42 dev_connected = false;
fritz291 21:b4d53cc6d6ac 43 dev = NULL;
fritz291 21:b4d53cc6d6ac 44 bulk_in = NULL;
fritz291 21:b4d53cc6d6ac 45 bulk_out = NULL;
fritz291 21:b4d53cc6d6ac 46 int_in = NULL;
fritz291 21:b4d53cc6d6ac 47 int_out = NULL;
fritz291 21:b4d53cc6d6ac 48 dev_connected = false;
fritz291 21:b4d53cc6d6ac 49 sm_intf = -1;
fritz291 21:b4d53cc6d6ac 50 sm_device_found = false;
fritz291 21:b4d53cc6d6ac 51 dev_connected = false;
fritz291 21:b4d53cc6d6ac 52 nb_ep = 0;
fritz291 21:b4d53cc6d6ac 53 }
fritz291 21:b4d53cc6d6ac 54
fritz291 21:b4d53cc6d6ac 55
fritz291 21:b4d53cc6d6ac 56 bool USBHostSocketModem::connected()
fritz291 21:b4d53cc6d6ac 57 {
fritz291 21:b4d53cc6d6ac 58 return dev_connected;
fritz291 21:b4d53cc6d6ac 59 }
fritz291 21:b4d53cc6d6ac 60
fritz291 21:b4d53cc6d6ac 61 bool USBHostSocketModem::connect()
fritz291 21:b4d53cc6d6ac 62 {
fritz291 21:b4d53cc6d6ac 63
fritz291 21:b4d53cc6d6ac 64 if (dev_connected) {
fritz291 21:b4d53cc6d6ac 65 return true;
fritz291 21:b4d53cc6d6ac 66 }
fritz291 21:b4d53cc6d6ac 67
fritz291 21:b4d53cc6d6ac 68 for (uint8_t i = 0; i < MAX_DEVICE_CONNECTED; i++) {
fritz291 21:b4d53cc6d6ac 69 if ((dev = host->getDevice(i)) != NULL) {
fritz291 21:b4d53cc6d6ac 70
fritz291 21:b4d53cc6d6ac 71 USB_DBG("Trying to connect SocketModem device\r\n");
fritz291 21:b4d53cc6d6ac 72 if(host->enumerate(dev, this)){
fritz291 21:b4d53cc6d6ac 73 printf("didn't fully enumerate\n");
fritz291 21:b4d53cc6d6ac 74 break;
fritz291 21:b4d53cc6d6ac 75 }
fritz291 21:b4d53cc6d6ac 76
fritz291 21:b4d53cc6d6ac 77 if (sm_device_found) {
fritz291 21:b4d53cc6d6ac 78 //Set DTR
fritz291 21:b4d53cc6d6ac 79 USBHostSocketModem::setDTR();
fritz291 21:b4d53cc6d6ac 80 int_out = dev->getEndpoint(int_intf, INTERRUPT_ENDPOINT, OUT);
fritz291 21:b4d53cc6d6ac 81 bulk_out = dev->getEndpoint(bulk_intf, BULK_ENDPOINT, OUT);
fritz291 21:b4d53cc6d6ac 82 if (bulk_in == NULL){
fritz291 21:b4d53cc6d6ac 83 printf("bulk_in == NULL\n");
fritz291 21:b4d53cc6d6ac 84 }
fritz291 21:b4d53cc6d6ac 85 bulk_in = dev->getEndpoint(bulk_intf, BULK_ENDPOINT, IN);
fritz291 21:b4d53cc6d6ac 86 printf("!SocketModem Found!\n");
fritz291 21:b4d53cc6d6ac 87
fritz291 21:b4d53cc6d6ac 88 if (!bulk_in || !bulk_out){
fritz291 21:b4d53cc6d6ac 89 continue;
fritz291 21:b4d53cc6d6ac 90 }
fritz291 21:b4d53cc6d6ac 91
fritz291 21:b4d53cc6d6ac 92 USB_INFO("New SocketModem device: VID:%04x PID:%04x [dev: %p - intf: %d]", dev->getVid(), dev->getPid(), dev, sm_intf);
fritz291 21:b4d53cc6d6ac 93 dev->setName("SocketModem", bulk_intf);
fritz291 21:b4d53cc6d6ac 94 host->registerDriver(dev, bulk_intf, this, &USBHostSocketModem::init);
fritz291 21:b4d53cc6d6ac 95
fritz291 21:b4d53cc6d6ac 96 dev_connected = true;
fritz291 21:b4d53cc6d6ac 97 return true;
fritz291 21:b4d53cc6d6ac 98 }
fritz291 21:b4d53cc6d6ac 99 } //if()
fritz291 21:b4d53cc6d6ac 100 } //for()
fritz291 21:b4d53cc6d6ac 101 init();
fritz291 21:b4d53cc6d6ac 102 return false;
fritz291 21:b4d53cc6d6ac 103 }
fritz291 21:b4d53cc6d6ac 104
fritz291 21:b4d53cc6d6ac 105 /*virtual*/ void USBHostSocketModem::setVidPid(uint16_t vid, uint16_t pid)
fritz291 21:b4d53cc6d6ac 106 {
fritz291 21:b4d53cc6d6ac 107 // we don't check VID/PID for MSD driver
fritz291 21:b4d53cc6d6ac 108 }
fritz291 21:b4d53cc6d6ac 109
fritz291 21:b4d53cc6d6ac 110 /*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 111 {
fritz291 21:b4d53cc6d6ac 112 printf("Parsing Interface\n");
fritz291 21:b4d53cc6d6ac 113 //printf("class = %i\n",intf_class);
fritz291 21:b4d53cc6d6ac 114 //printf("subclass = %i\n",intf_subclass);
fritz291 21:b4d53cc6d6ac 115 //printf("msd_intf = %i\n",msd_intf);
fritz291 21:b4d53cc6d6ac 116 printf("intf_class = %i\n",intf_class);
fritz291 22:eaefd60717c4 117 if ((sm_intf == -1) && (intf_class == CDCCONTROL))
fritz291 21:b4d53cc6d6ac 118 {
fritz291 21:b4d53cc6d6ac 119 sm_intf = intf_nb;
fritz291 21:b4d53cc6d6ac 120 int_intf = intf_nb;
fritz291 21:b4d53cc6d6ac 121 //printf("parse interface: sm_intf = %i\n", sm_intf);
fritz291 21:b4d53cc6d6ac 122 return true;
fritz291 21:b4d53cc6d6ac 123 }
fritz291 22:eaefd60717c4 124 else if ((sm_intf == 0) && (intf_class == CDCDATA))
fritz291 21:b4d53cc6d6ac 125 {
fritz291 21:b4d53cc6d6ac 126 sm_intf = intf_nb;
fritz291 21:b4d53cc6d6ac 127 bulk_intf = intf_nb;
fritz291 21:b4d53cc6d6ac 128 //printf("parse interface: sm_intf = %i\n", sm_intf);
fritz291 21:b4d53cc6d6ac 129 return true;
fritz291 21:b4d53cc6d6ac 130 }
fritz291 21:b4d53cc6d6ac 131 return false;
fritz291 21:b4d53cc6d6ac 132 }
fritz291 21:b4d53cc6d6ac 133
fritz291 21:b4d53cc6d6ac 134 /*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 135 {
fritz291 21:b4d53cc6d6ac 136 printf("Setting up Endpoint\n");
fritz291 21:b4d53cc6d6ac 137 if ((intf_nb == int_intf) || (intf_nb == bulk_intf)){
fritz291 21:b4d53cc6d6ac 138 /*if (type == INTERRUPT_ENDPOINT)*/
fritz291 21:b4d53cc6d6ac 139 if ((type == BULK_ENDPOINT) || (type == INTERRUPT_ENDPOINT)){
fritz291 21:b4d53cc6d6ac 140 printf("type == %s\n", type);
fritz291 21:b4d53cc6d6ac 141 nb_ep++;
fritz291 21:b4d53cc6d6ac 142 if (nb_ep == 2)
fritz291 21:b4d53cc6d6ac 143 printf("nb_ep == 2\n");
fritz291 21:b4d53cc6d6ac 144 sm_device_found = true;
fritz291 21:b4d53cc6d6ac 145 return true;
fritz291 21:b4d53cc6d6ac 146 }
fritz291 21:b4d53cc6d6ac 147 }
fritz291 21:b4d53cc6d6ac 148 return false;
fritz291 21:b4d53cc6d6ac 149 }
fritz291 21:b4d53cc6d6ac 150
fritz291 21:b4d53cc6d6ac 151 void USBHostSocketModem::setDTR()
fritz291 21:b4d53cc6d6ac 152 {
fritz291 21:b4d53cc6d6ac 153 //Set USB DTR to enable communication
fritz291 23:7e6294a61139 154 int res = host->controlWrite(dev, DTR_REQUEST_TYPE, SET_CONTROL_LINE_STATE, DTR, 0, NULL, 0);
fritz291 21:b4d53cc6d6ac 155 }
fritz291 21:b4d53cc6d6ac 156
fritz291 21:b4d53cc6d6ac 157
fritz291 21:b4d53cc6d6ac 158
fritz291 21:b4d53cc6d6ac 159
fritz291 21:b4d53cc6d6ac 160