1*4d7e907cSAndroid Build Coastguard Worker/* 2*4d7e907cSAndroid Build Coastguard Worker * Copyright (C) 2019 The Android Open Source Project 3*4d7e907cSAndroid Build Coastguard Worker * 4*4d7e907cSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*4d7e907cSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*4d7e907cSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*4d7e907cSAndroid Build Coastguard Worker * 8*4d7e907cSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*4d7e907cSAndroid Build Coastguard Worker * 10*4d7e907cSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*4d7e907cSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*4d7e907cSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*4d7e907cSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*4d7e907cSAndroid Build Coastguard Worker * limitations under the License. 15*4d7e907cSAndroid Build Coastguard Worker */ 16*4d7e907cSAndroid Build Coastguard Workerpackage [email protected]; 17*4d7e907cSAndroid Build Coastguard Worker 18*4d7e907cSAndroid Build Coastguard Worker/** 19*4d7e907cSAndroid Build Coastguard Worker * Represents a CAN controller that's capable of configuring CAN bus interfaces. 20*4d7e907cSAndroid Build Coastguard Worker * 21*4d7e907cSAndroid Build Coastguard Worker * The goal of this service is to configure CAN interfaces and bring up HIDL 22*4d7e907cSAndroid Build Coastguard Worker * server instances of ICanBus for each one that's up. 23*4d7e907cSAndroid Build Coastguard Worker * 24*4d7e907cSAndroid Build Coastguard Worker * Providing an ICanController interface to configure CAN buses is optional. 25*4d7e907cSAndroid Build Coastguard Worker * A system can elect to publish only ICanBus if the hardware is hardcoded 26*4d7e907cSAndroid Build Coastguard Worker * for a specific application. 27*4d7e907cSAndroid Build Coastguard Worker */ 28*4d7e907cSAndroid Build Coastguard Workerinterface ICanController { 29*4d7e907cSAndroid Build Coastguard Worker /** 30*4d7e907cSAndroid Build Coastguard Worker * Type of an interface, an equivalent to BusConfig::InterfaceId 31*4d7e907cSAndroid Build Coastguard Worker * union discriminator. Defines a number of specific standard hardware 32*4d7e907cSAndroid Build Coastguard Worker * families and a generic catch-all type of {@see INDEXED}. 33*4d7e907cSAndroid Build Coastguard Worker */ 34*4d7e907cSAndroid Build Coastguard Worker enum InterfaceType : uint8_t { 35*4d7e907cSAndroid Build Coastguard Worker /** Virtual SocketCAN interface. */ 36*4d7e907cSAndroid Build Coastguard Worker VIRTUAL, 37*4d7e907cSAndroid Build Coastguard Worker 38*4d7e907cSAndroid Build Coastguard Worker /** Native SocketCAN interface. */ 39*4d7e907cSAndroid Build Coastguard Worker SOCKETCAN, 40*4d7e907cSAndroid Build Coastguard Worker 41*4d7e907cSAndroid Build Coastguard Worker /** Serial line CAN interface. */ 42*4d7e907cSAndroid Build Coastguard Worker SLCAN, 43*4d7e907cSAndroid Build Coastguard Worker 44*4d7e907cSAndroid Build Coastguard Worker /** Proprietary, device-specific interface. */ 45*4d7e907cSAndroid Build Coastguard Worker INDEXED, 46*4d7e907cSAndroid Build Coastguard Worker }; 47*4d7e907cSAndroid Build Coastguard Worker 48*4d7e907cSAndroid Build Coastguard Worker enum Result : uint8_t { 49*4d7e907cSAndroid Build Coastguard Worker OK, 50*4d7e907cSAndroid Build Coastguard Worker 51*4d7e907cSAndroid Build Coastguard Worker /** 52*4d7e907cSAndroid Build Coastguard Worker * General error class, if others are not applicable. 53*4d7e907cSAndroid Build Coastguard Worker */ 54*4d7e907cSAndroid Build Coastguard Worker UNKNOWN_ERROR, 55*4d7e907cSAndroid Build Coastguard Worker 56*4d7e907cSAndroid Build Coastguard Worker /** 57*4d7e907cSAndroid Build Coastguard Worker * Up request was called out of order (i.e. trying to up the 58*4d7e907cSAndroid Build Coastguard Worker * interface twice). 59*4d7e907cSAndroid Build Coastguard Worker */ 60*4d7e907cSAndroid Build Coastguard Worker INVALID_STATE, 61*4d7e907cSAndroid Build Coastguard Worker 62*4d7e907cSAndroid Build Coastguard Worker /** Interface type is not supported. */ 63*4d7e907cSAndroid Build Coastguard Worker NOT_SUPPORTED, 64*4d7e907cSAndroid Build Coastguard Worker 65*4d7e907cSAndroid Build Coastguard Worker /** 66*4d7e907cSAndroid Build Coastguard Worker * Provided interface ID (index, name, device path) doesn't exist or 67*4d7e907cSAndroid Build Coastguard Worker * there is no device with a given serial number. 68*4d7e907cSAndroid Build Coastguard Worker */ 69*4d7e907cSAndroid Build Coastguard Worker BAD_INTERFACE_ID, 70*4d7e907cSAndroid Build Coastguard Worker 71*4d7e907cSAndroid Build Coastguard Worker /** Provided bit rate is not supported by the hardware. */ 72*4d7e907cSAndroid Build Coastguard Worker BAD_BITRATE, 73*4d7e907cSAndroid Build Coastguard Worker 74*4d7e907cSAndroid Build Coastguard Worker /** 75*4d7e907cSAndroid Build Coastguard Worker * Provided service name ({@see BusConfig#name}) either has invalid 76*4d7e907cSAndroid Build Coastguard Worker * format or is not listed in device manifest file. 77*4d7e907cSAndroid Build Coastguard Worker */ 78*4d7e907cSAndroid Build Coastguard Worker BAD_SERVICE_NAME, 79*4d7e907cSAndroid Build Coastguard Worker }; 80*4d7e907cSAndroid Build Coastguard Worker 81*4d7e907cSAndroid Build Coastguard Worker /** 82*4d7e907cSAndroid Build Coastguard Worker * Configuration of the (physical or virtual) CAN bus. 83*4d7e907cSAndroid Build Coastguard Worker * 84*4d7e907cSAndroid Build Coastguard Worker * ISO TP and CAN FD are currently not supported. 85*4d7e907cSAndroid Build Coastguard Worker */ 86*4d7e907cSAndroid Build Coastguard Worker struct BusConfig { 87*4d7e907cSAndroid Build Coastguard Worker /** 88*4d7e907cSAndroid Build Coastguard Worker * Name under which ICanBus HIDL service should be published. 89*4d7e907cSAndroid Build Coastguard Worker * 90*4d7e907cSAndroid Build Coastguard Worker * It must consist of only alphanumeric characters and underscore 91*4d7e907cSAndroid Build Coastguard Worker * (a-z, A-Z, 0-9, '_'), at least 1 and at most 32 characters long. 92*4d7e907cSAndroid Build Coastguard Worker * 93*4d7e907cSAndroid Build Coastguard Worker * This field is *not* meant to distinguish between hardware interfaces 94*4d7e907cSAndroid Build Coastguard Worker * nor preselect parameters like bitrate. The only intended side-effect 95*4d7e907cSAndroid Build Coastguard Worker * of changing it should be a different ICanBus HIDL service name and 96*4d7e907cSAndroid Build Coastguard Worker * the HIDL service should make no assumptions on its contents. 97*4d7e907cSAndroid Build Coastguard Worker */ 98*4d7e907cSAndroid Build Coastguard Worker string name; 99*4d7e907cSAndroid Build Coastguard Worker 100*4d7e907cSAndroid Build Coastguard Worker /** 101*4d7e907cSAndroid Build Coastguard Worker * Hardware interface configuration. 102*4d7e907cSAndroid Build Coastguard Worker * 103*4d7e907cSAndroid Build Coastguard Worker * This union's discriminator has an equivalent enum 104*4d7e907cSAndroid Build Coastguard Worker * {@see InterfaceType} to express compatibility via 105*4d7e907cSAndroid Build Coastguard Worker * getSupportedInterfaceTypes(). 106*4d7e907cSAndroid Build Coastguard Worker */ 107*4d7e907cSAndroid Build Coastguard Worker safe_union InterfaceId { 108*4d7e907cSAndroid Build Coastguard Worker /** Virtual SocketCAN interface. */ 109*4d7e907cSAndroid Build Coastguard Worker struct Virtual { 110*4d7e907cSAndroid Build Coastguard Worker /** Interface name, such as vcan0. If the interface doesn't 111*4d7e907cSAndroid Build Coastguard Worker * exist, HAL server must create it. 112*4d7e907cSAndroid Build Coastguard Worker */ 113*4d7e907cSAndroid Build Coastguard Worker string ifname; 114*4d7e907cSAndroid Build Coastguard Worker } virtualif; 115*4d7e907cSAndroid Build Coastguard Worker 116*4d7e907cSAndroid Build Coastguard Worker /** Native SocketCAN interface. */ 117*4d7e907cSAndroid Build Coastguard Worker safe_union Socketcan { 118*4d7e907cSAndroid Build Coastguard Worker /** Interface name, such as can0. */ 119*4d7e907cSAndroid Build Coastguard Worker string ifname; 120*4d7e907cSAndroid Build Coastguard Worker /** 121*4d7e907cSAndroid Build Coastguard Worker * Alternatively to providing {@see ifname}, one may provide a 122*4d7e907cSAndroid Build Coastguard Worker * list of interface serial number suffixes. If there happens to 123*4d7e907cSAndroid Build Coastguard Worker * be a device (like USB2CAN) with a matching serial number 124*4d7e907cSAndroid Build Coastguard Worker * suffix, the HAL service will have to select it. 125*4d7e907cSAndroid Build Coastguard Worker * 126*4d7e907cSAndroid Build Coastguard Worker * Client may utilize this in two ways: by matching against the 127*4d7e907cSAndroid Build Coastguard Worker * entire serial number, or the last few characters (usually 128*4d7e907cSAndroid Build Coastguard Worker * one). The former is better for small-scale test deployments 129*4d7e907cSAndroid Build Coastguard Worker * (with just a handful of vehicles), the latter is good for 130*4d7e907cSAndroid Build Coastguard Worker * larger scale (where a small suffix list may support large 131*4d7e907cSAndroid Build Coastguard Worker * test fleet). 132*4d7e907cSAndroid Build Coastguard Worker */ 133*4d7e907cSAndroid Build Coastguard Worker vec<string> serialno; 134*4d7e907cSAndroid Build Coastguard Worker } socketcan; 135*4d7e907cSAndroid Build Coastguard Worker 136*4d7e907cSAndroid Build Coastguard Worker /** Serial line CAN interface. */ 137*4d7e907cSAndroid Build Coastguard Worker safe_union Slcan { 138*4d7e907cSAndroid Build Coastguard Worker /** Path to a device, such as /dev/ttyUSB0. */ 139*4d7e907cSAndroid Build Coastguard Worker string ttyname; 140*4d7e907cSAndroid Build Coastguard Worker /** 141*4d7e907cSAndroid Build Coastguard Worker * List of interface serial number suffixes. 142*4d7e907cSAndroid Build Coastguard Worker * {@see Socketcan::serialno} 143*4d7e907cSAndroid Build Coastguard Worker */ 144*4d7e907cSAndroid Build Coastguard Worker vec<string> serialno; 145*4d7e907cSAndroid Build Coastguard Worker } slcan; 146*4d7e907cSAndroid Build Coastguard Worker 147*4d7e907cSAndroid Build Coastguard Worker /** 148*4d7e907cSAndroid Build Coastguard Worker * Proprietary, device-specific interface. 149*4d7e907cSAndroid Build Coastguard Worker * 150*4d7e907cSAndroid Build Coastguard Worker * Non-SocketCAN interfaces should use this variant. 151*4d7e907cSAndroid Build Coastguard Worker */ 152*4d7e907cSAndroid Build Coastguard Worker struct Indexed { 153*4d7e907cSAndroid Build Coastguard Worker /** Interface number, 0-based. */ 154*4d7e907cSAndroid Build Coastguard Worker uint8_t index; 155*4d7e907cSAndroid Build Coastguard Worker } indexed; 156*4d7e907cSAndroid Build Coastguard Worker } interfaceId; 157*4d7e907cSAndroid Build Coastguard Worker 158*4d7e907cSAndroid Build Coastguard Worker /** 159*4d7e907cSAndroid Build Coastguard Worker * Bit rate for CAN communication. 160*4d7e907cSAndroid Build Coastguard Worker * 161*4d7e907cSAndroid Build Coastguard Worker * Typical bit rates are: 100000, 125000, 250000, 500000. 162*4d7e907cSAndroid Build Coastguard Worker * 163*4d7e907cSAndroid Build Coastguard Worker * For {@see interfaceId#virtual} and pre-configured 164*4d7e907cSAndroid Build Coastguard Worker * {@see interfaceId#indexed} interfaces this value is ignored. 165*4d7e907cSAndroid Build Coastguard Worker */ 166*4d7e907cSAndroid Build Coastguard Worker uint32_t bitrate; 167*4d7e907cSAndroid Build Coastguard Worker }; 168*4d7e907cSAndroid Build Coastguard Worker 169*4d7e907cSAndroid Build Coastguard Worker /** 170*4d7e907cSAndroid Build Coastguard Worker * Fetches the list of interface types supported by this HAL server. 171*4d7e907cSAndroid Build Coastguard Worker * 172*4d7e907cSAndroid Build Coastguard Worker * @return iftypes The list of supported interface types. 173*4d7e907cSAndroid Build Coastguard Worker */ 174*4d7e907cSAndroid Build Coastguard Worker getSupportedInterfaceTypes() generates (vec<InterfaceType> iftypes); 175*4d7e907cSAndroid Build Coastguard Worker 176*4d7e907cSAndroid Build Coastguard Worker /** 177*4d7e907cSAndroid Build Coastguard Worker * Bring up the CAN interface and publish ICanBus server instance. 178*4d7e907cSAndroid Build Coastguard Worker * 179*4d7e907cSAndroid Build Coastguard Worker * @param config Configuration of the CAN interface. 180*4d7e907cSAndroid Build Coastguard Worker * @return result OK if the operation succeeded; error code otherwise. 181*4d7e907cSAndroid Build Coastguard Worker */ 182*4d7e907cSAndroid Build Coastguard Worker upInterface(BusConfig config) generates (Result result); 183*4d7e907cSAndroid Build Coastguard Worker 184*4d7e907cSAndroid Build Coastguard Worker /** 185*4d7e907cSAndroid Build Coastguard Worker * Unpublish ICanBus server instance and bring down the CAN interface. 186*4d7e907cSAndroid Build Coastguard Worker * 187*4d7e907cSAndroid Build Coastguard Worker * In case of failure, at least the ICanBus server instance must be 188*4d7e907cSAndroid Build Coastguard Worker * unpublished and resources freed on best-effort basis. 189*4d7e907cSAndroid Build Coastguard Worker * 190*4d7e907cSAndroid Build Coastguard Worker * @param name Name of the interface (@see BusConfig#name} to 191*4d7e907cSAndroid Build Coastguard Worker * bring down. 192*4d7e907cSAndroid Build Coastguard Worker * @return success true in case of success, false otherwise. 193*4d7e907cSAndroid Build Coastguard Worker */ 194*4d7e907cSAndroid Build Coastguard Worker downInterface(string name) generates (bool success); 195*4d7e907cSAndroid Build Coastguard Worker}; 196