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 18:49:28 2015 +0000
Revision:
21:b4d53cc6d6ac
Child:
22:eaefd60717c4
USB Host Driver with Socket Modem support

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