1/* 2 Driver for USB Ethernet Control Model devices 3 Copyright (C) 2008 Michael Lotz <mmlr@mlotz.ch> 4 Distributed under the terms of the MIT license. 5*/ 6#ifndef _USB_ECM_DRIVER_H_ 7#define _USB_ECM_DRIVER_H_ 8 9#include <device_manager.h> 10#include <Drivers.h> 11#include <KernelExport.h> 12#include <OS.h> 13#include <USB3.h> 14 15#include <util/kernel_cpp.h> 16 17#define DRIVER_NAME "usb_ecm" 18#define MAX_DEVICES 8 19 20/* class and subclass codes */ 21#define USB_INTERFACE_CLASS_CDC 0x02 22#define USB_INTERFACE_SUBCLASS_ECM 0x06 23#define USB_INTERFACE_CLASS_CDC_DATA 0x0a 24#define USB_INTERFACE_SUBCLASS_DATA 0x00 25 26/* communication device descriptor subtypes */ 27#define FUNCTIONAL_SUBTYPE_UNION 0x06 28#define FUNCTIONAL_SUBTYPE_ETHERNET 0x0f 29 30typedef struct ethernet_functional_descriptor_s { 31 uint8 functional_descriptor_subtype; 32 uint8 mac_address_index; 33 uint32 ethernet_statistics; 34 uint16 max_segment_size; 35 uint16 num_multi_cast_filters; 36 uint8 num_wakeup_pattern_filters; 37} _PACKED ethernet_functional_descriptor; 38 39/* notification definitions */ 40#define CDC_NOTIFY_NETWORK_CONNECTION 0x00 41#define CDC_NOTIFY_CONNECTION_SPEED_CHANGE 0x2a 42 43typedef struct cdc_notification_s { 44 uint8 request_type; 45 uint8 notification_code; 46 uint16 value; 47 uint16 index; 48 uint16 data_length; 49 uint8 data[0]; 50} _PACKED cdc_notification; 51 52typedef struct cdc_connection_speed_s { 53 uint32 upstream_speed; /* in bits/s */ 54 uint32 downstream_speed; /* in bits/s */ 55} _PACKED cdc_connection_speed; 56 57extern usb_module_info *gUSBModule; 58extern device_manager_info *gDeviceManager; 59 60class ECMDevice; 61 62// bus manager device interface for peripheral driver 63typedef struct { 64 driver_module_info info; 65 66} usb_device_interface; 67 68 69typedef struct { 70 device_node* node; 71 ::usb_device usb_device; 72 usb_device_interface* usb; 73 ECMDevice * device; 74} usb_ecm_driver_info; 75 76 77#ifdef TRACE_ECM 78#define TRACE(x...) dprintf(DRIVER_NAME ": " x) 79#define CALLED() TRACE("CALLED %s\n", __PRETTY_FUNCTION__) 80#else 81#define TRACE(x...) 82#define CALLED() 83#endif 84#define TRACE_ALWAYS(x...) dprintf(DRIVER_NAME ": " x) 85 86 87#endif //_USB_ECM_DRIVER_H_ 88