1*4f2df630SAndroid Build Coastguard Worker /* 2*4f2df630SAndroid Build Coastguard Worker * Copyright 2018 The ChromiumOS Authors 3*4f2df630SAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 4*4f2df630SAndroid Build Coastguard Worker * found in the LICENSE file. 5*4f2df630SAndroid Build Coastguard Worker */ 6*4f2df630SAndroid Build Coastguard Worker 7*4f2df630SAndroid Build Coastguard Worker #ifndef __EC_EXTRA_USB_UPDATER_USB_IF_H 8*4f2df630SAndroid Build Coastguard Worker #define __EC_EXTRA_USB_UPDATER_USB_IF_H 9*4f2df630SAndroid Build Coastguard Worker 10*4f2df630SAndroid Build Coastguard Worker #include <libusb.h> 11*4f2df630SAndroid Build Coastguard Worker 12*4f2df630SAndroid Build Coastguard Worker /* This describes USB endpoint used to communicate with Cr50. */ 13*4f2df630SAndroid Build Coastguard Worker struct usb_endpoint { 14*4f2df630SAndroid Build Coastguard Worker struct libusb_device_handle *devh; 15*4f2df630SAndroid Build Coastguard Worker uint8_t ep_num; 16*4f2df630SAndroid Build Coastguard Worker int chunk_len; 17*4f2df630SAndroid Build Coastguard Worker }; 18*4f2df630SAndroid Build Coastguard Worker 19*4f2df630SAndroid Build Coastguard Worker /* 20*4f2df630SAndroid Build Coastguard Worker * Find the requested USB endpoint. This finds the device using the device 21*4f2df630SAndroid Build Coastguard Worker * serial number, vendor id, and product id. The subclass and protocol are used 22*4f2df630SAndroid Build Coastguard Worker * to find the correct endpoint. If a matching endpoint is found, fill up the 23*4f2df630SAndroid Build Coastguard Worker * uep structure. If succeeded, usb_shut_down() must be invoked before program 24*4f2df630SAndroid Build Coastguard Worker * exits. 25*4f2df630SAndroid Build Coastguard Worker * 26*4f2df630SAndroid Build Coastguard Worker * Return 0 on success, -1 on failure. 27*4f2df630SAndroid Build Coastguard Worker */ 28*4f2df630SAndroid Build Coastguard Worker int usb_findit(const char *serialno, uint16_t vid, uint16_t *pid, int pid_count, 29*4f2df630SAndroid Build Coastguard Worker uint16_t subclass, uint16_t protocol, struct usb_endpoint *uep); 30*4f2df630SAndroid Build Coastguard Worker 31*4f2df630SAndroid Build Coastguard Worker /* 32*4f2df630SAndroid Build Coastguard Worker * Actual USB transfer function, the 'allow_less' flag indicates that the 33*4f2df630SAndroid Build Coastguard Worker * valid response could be shorter than allotted memory, the 'rxed_count' 34*4f2df630SAndroid Build Coastguard Worker * pointer, if provided along with 'allow_less', lets the caller know how many 35*4f2df630SAndroid Build Coastguard Worker * bytes were received. 36*4f2df630SAndroid Build Coastguard Worker */ 37*4f2df630SAndroid Build Coastguard Worker int usb_trx(struct usb_endpoint *uep, void *outbuf, int outlen, void *inbuf, 38*4f2df630SAndroid Build Coastguard Worker int inlen, int allow_less, size_t *rxed_count); 39*4f2df630SAndroid Build Coastguard Worker 40*4f2df630SAndroid Build Coastguard Worker /* 41*4f2df630SAndroid Build Coastguard Worker * This function should be called for graceful tear down of the USB interface 42*4f2df630SAndroid Build Coastguard Worker * when the program exits, either normally or due to error. This is required 43*4f2df630SAndroid Build Coastguard Worker * only after USB connection was established, i.e. after successful invocation 44*4f2df630SAndroid Build Coastguard Worker * of usb_findit(). 45*4f2df630SAndroid Build Coastguard Worker */ 46*4f2df630SAndroid Build Coastguard Worker void usb_shut_down(struct usb_endpoint *uep); 47*4f2df630SAndroid Build Coastguard Worker 48*4f2df630SAndroid Build Coastguard Worker #define USB_ERROR(m, r) \ 49*4f2df630SAndroid Build Coastguard Worker fprintf(stderr, "%s:%d, %s returned %d (%s)\n", __FILE__, __LINE__, m, \ 50*4f2df630SAndroid Build Coastguard Worker r, libusb_strerror(r)) 51*4f2df630SAndroid Build Coastguard Worker 52*4f2df630SAndroid Build Coastguard Worker #endif /* ! __EC_EXTRA_USB_UPDATER_USB_IF_H */ 53