usb.h
author darius@Inchoate
Mon, 19 Jan 2009 22:54:19 +1030
changeset 71 553c061fda7c
parent 31 4e417d84365e
permissions -rw-r--r--
Keep the newer GCC happy.
     1 /*
     2  * Copyright (c) 2003 Bernd Walter
     3  * All rights reserved.
     4  */
     5 
     6 /*  Example Source Code for USB Enumeration using a PDIUSBD11 connected to a PIC16F87x
     7  *  Copyright 2001 Craig Peacock, Craig.Peacock@beyondlogic.org
     8  *  31th December 2001 http://www.beyondlogic.org            				      
     9  */
    10 
    11 typedef struct {
    12     uint8_t bmRequestType;
    13     uint8_t bRequest;
    14     uint16_t wValue;
    15     uint16_t wIndex;
    16     uint16_t wLength;
    17 }  __attribute__ ((packed)) USB_SETUP_REQUEST;
    18 
    19 typedef struct {
    20     uint8_t bLength;
    21     uint8_t bDescriptorType;
    22     uint16_t bcdUSB;
    23     uint8_t bDeviceClass;
    24     uint8_t bDeviceSubClass;
    25     uint8_t bDeviceProtocol;
    26     uint8_t bMaxPacketSize0;
    27     uint16_t idVendor;
    28     uint16_t idProduct;
    29     uint16_t bcdDevice;
    30     uint8_t iManufacturer;
    31     uint8_t iProduct;
    32     uint8_t iSerialNumber;
    33     uint8_t bNumConfigurations;
    34 } __attribute__ ((packed))  USB_DEVICE_DESCRIPTOR;
    35 
    36 typedef struct {
    37     uint8_t bLength;
    38     uint8_t bDescriptorType;
    39     uint8_t bEndpointAddress;
    40     uint8_t bmAttributes;
    41     uint16_t wMaxPacketSize;
    42     uint8_t bInterval;
    43 } __attribute__ ((packed))  USB_ENDPOINT_DESCRIPTOR;
    44 
    45 typedef struct {
    46     uint8_t bLength;
    47     uint8_t bDescriptorType;
    48     uint16_t wTotalLength;
    49     uint8_t bNumInterfaces;
    50     uint8_t bConfigurationValue;
    51     uint8_t iConfiguration;
    52     uint8_t bmAttributes;
    53     uint8_t MaxPower;
    54 } __attribute__ ((packed))  USB_CONFIGURATION_DESCRIPTOR;
    55 
    56 typedef struct {
    57     uint8_t bLength;
    58     uint8_t bDescriptorType;
    59     uint8_t bInterfaceNumber;
    60     uint8_t bAlternateSetting;
    61     uint8_t bNumEndpoints;
    62     uint8_t bInterfaceClass;
    63     uint8_t bInterfaceSubClass;
    64     uint8_t bInterfaceProtocol;
    65     uint8_t iInterface;
    66 } __attribute__ ((packed))  USB_INTERFACE_DESCRIPTOR;
    67 
    68 typedef struct {
    69     uint8_t bLength;
    70     uint8_t bDescriptorType;
    71     uint16_t wHIDClassSpecComp;
    72     uint8_t bCountry;
    73     uint8_t bNumDescriptors;
    74     uint8_t b1stDescType;
    75     uint16_t w1stDescLength;
    76 } __attribute__ ((packed))  USB_HID_DESCRIPTOR;
    77 
    78 typedef struct {
    79     USB_CONFIGURATION_DESCRIPTOR ConfigDescriptor;
    80     USB_INTERFACE_DESCRIPTOR InterfaceDescriptor0;
    81     USB_ENDPOINT_DESCRIPTOR EndpointDescriptor00;
    82     USB_ENDPOINT_DESCRIPTOR EndpointDescriptor01;
    83     USB_INTERFACE_DESCRIPTOR InterfaceDescriptor1;
    84     USB_ENDPOINT_DESCRIPTOR EndpointDescriptor10;
    85     USB_ENDPOINT_DESCRIPTOR EndpointDescriptor11;
    86 } __attribute__ ((packed))  USB_CONFIG_DATA;
    87 
    88 typedef struct {
    89     uint8_t bLength;
    90     uint8_t bDescriptorType;
    91     char     bString[];
    92 } __attribute__ ((packed))  STRING_DESCRIPTOR;
    93 
    94 typedef struct {
    95     uint8_t bLength;
    96     uint8_t bDescriptorType;
    97     uint16_t wLANGID0;
    98 } __attribute__ ((packed))  LANGID_DESCRIPTOR;
    99 
   100 #define D12_SET_ADDRESS_ENABLE		0xd0
   101 #define D12_SET_ENDPOINT_ENABLE  	0xd8
   102 #define D12_SET_MODE			0xf3
   103 #define D12_SET_DMA			0xfb
   104 #define D12_READ_INTERRUPT_REGISTER 	0xf4
   105 #define D12_READ_BUFFER			0xf0
   106 #define D12_WRITE_BUFFER		0xf0
   107 #define D12_ACK_SETUP			0xf2
   108 #define D12_CLEAR_BUFFER		0xf2
   109 #define D12_VALIDATE_BUFFER		0xfa
   110 #define D12_READ_LAST_TRANSACTION	0x40
   111 #define D12_SET_ENDPOINT_STATUS		0x40
   112 #define D12_READ_ENDPOINT_STATUS	0x80
   113 #define D12_READ_CHIP_ID		0xfd
   114 
   115 #define D12_ENDPOINT_EP0_OUT 		0x00
   116 #define D12_ENDPOINT_EP0_IN 		0x01
   117 #define D12_ENDPOINT_EP1_OUT 		0x02
   118 #define D12_ENDPOINT_EP1_IN 		0x03
   119 #define D12_ENDPOINT_EP2_OUT 		0x04
   120 #define D12_ENDPOINT_EP2_IN 		0x05
   121 
   122 #define D12_INT_EP0_OUT			0x01
   123 #define D12_INT_EP0_IN			0x02
   124 #define D12_INT_EP1_OUT			0x04
   125 #define D12_INT_EP1_IN			0x08
   126 #define D12_INT_EP2_OUT			0x10
   127 #define D12_INT_EP2_IN			0x20
   128 #define D12_INT_BUS_RESET		0x40
   129 #define D12_INT_SUSPEND			0x80
   130 
   131 #define D12_LAST_TRAN_OK		0x01
   132 #define D12_LAST_TRAN_ERRMSK		0x1e
   133 #define D12_LAST_TRAN_SETUP		0x20
   134 #define D12_LAST_TRAN_DATA		0x40
   135 #define D12_LAST_TRAN_OFLOW		0x80
   136 
   137 #define STANDARD_DEVICE_REQUEST		0x00
   138 #define STANDARD_INTERFACE_REQUEST	0x01
   139 #define STANDARD_ENDPOINT_REQUEST	0x02
   140 #define VENDOR_DEVICE_REQUEST		0x40
   141 #define VENDOR_INTERFACE_REQUEST	0x41
   142 #define VENDOR_ENDPOINT_REQUEST		0x42
   143 
   144 #define GET_STATUS  			0
   145 #define CLEAR_FEATURE     		1
   146 #define SET_FEATURE                 	3
   147 #define SET_ADDRESS                 	5
   148 #define GET_DESCRIPTOR              	6
   149 #define SET_DESCRIPTOR              	7
   150 #define GET_CONFIGURATION           	8
   151 #define SET_CONFIGURATION           	9
   152 #define GET_INTERFACE               	10
   153 #define SET_INTERFACE               	11
   154 #define SYNCH_FRAME                 	12
   155 
   156 #define VENDOR_DOTEMP			125
   157 #define VENDOR_UPDATE			126
   158 #define VENDOR_RESET			127
   159 
   160 #define	ENDPOINT_HALT			0
   161 
   162 #define TYPE_DEVICE_DESCRIPTOR          1
   163 #define TYPE_CONFIGURATION_DESCRIPTOR   2
   164 #define TYPE_STRING_DESCRIPTOR          3
   165 #define TYPE_INTERFACE_DESCRIPTOR       4
   166 #define TYPE_ENDPOINT_DESCRIPTOR        5
   167 #define TYPE_HID_DESCRIPTOR		0x21
   168 
   169 #define USB_ENDPOINT_TYPE_CONTROL	0x00
   170 #define USB_ENDPOINT_TYPE_ISOCHRONOUS	0x01
   171 #define USB_ENDPOINT_TYPE_BULK		0x02
   172 #define USB_ENDPOINT_TYPE_INTERRUPT	0x03
   173 
   174 /* Function prototypes */
   175 uint8_t		d12_get_data(void);
   176 void		d12_set_data(uint8_t data);
   177 void		d12_set_cmd(uint8_t cmd);
   178 void		d12_write_cmd(uint8_t command, const uint8_t *buffer, uint8_t count);
   179 void		d12_read_cmd(uint8_t command, uint8_t *buffer, uint8_t count);
   180 uint8_t		d12_read_endpt(uint8_t endpt, uint8_t *buffer);
   181 
   182 void		d12_ep0_irq(void);
   183 void		d12_handle_setup(void);
   184 void		d12_getdescriptor(USB_SETUP_REQUEST *setuppkt);
   185 void		d12_stallendpt(uint8_t ep);
   186 uint8_t		d12_read_endpt(uint8_t endpt, uint8_t *buffer);
   187 void		d12_write_endpt(uint8_t endpt, const uint8_t *buffer, uint8_t bytes);
   188 void		d12_send_data_ep0(void);
   189 void		d12_receive_data_ep1(void);
   190 void		d12_send_data_ep2(void);
   191 void		d12_receive_data_ep2(void);
   192 
   193 void 		reset(void);
   194 
   195 void		usb_init(void);
   196 void		usb_intr(void);
   197 void		usb_gendata(void);
   198 
   199 /*
   200  * The PDIUSBD12 is wired up like so
   201  *
   202  *  PDI		     AVR	
   203  * ======================
   204  * D7:0     <=>     PA7:0	   
   205  * RD_N     <=      PB0
   206  * INT_N     =>     PB1
   207  * WR_N     <=      PB2
   208  * A0       <=      PB3 (0 = data, 1 = cmd)
   209  * SUSPEND  <=>     PB4
   210  */
   211 
   212 #define PDIPORT	PORTA
   213 #define PDIDDR	PORTA
   214 #define PDICTL	PORTB
   215 #define PDIRD	PB0
   216 #define PDIINT	PB1
   217 #define PDIWR	PB2
   218 #define PDIA0	PB3
   219 #define PDISUSP	PB4
   220