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
USBHostSocketModem/USBHostSocketModem.cpp@21:b4d53cc6d6ac, 2015-06-22 (annotated)
- 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?
User | Revision | Line number | New 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 |