00001
00015 #include "pic_usb.h"
00016 #include "pic_serial.h"
00017 #include "memory.h"
00018
00019
00020
00021 usb_state_type usb_state;
00022
00023 buffer_descriptor bd0out@0x400;
00024 buffer_descriptor bd0in @0x404;
00025 buffer_descriptor bd1out@0x408;
00026 buffer_descriptor bd1in @0x40C;
00027 buffer_descriptor bd2out@0x410;
00028 buffer_descriptor bd2in @0x414;
00029 buffer_descriptor bd3out@0x418;
00030 buffer_descriptor bd3in @0x41c;
00031 buffer_descriptor bd4out@0x420;
00032 buffer_descriptor bd4in @0x424;
00033 buffer_descriptor bd5out@0x428;
00034 buffer_descriptor bd5in @0x42C;
00035 buffer_descriptor bd6out@0x430;
00036 buffer_descriptor bd6in @0x434;
00037 buffer_descriptor bd7out@0x438;
00038 buffer_descriptor bd7in @0x43C;
00039
00040 uns8 usb_address;
00041 delivery_mode_type delivery_mode;
00042 uns16 delivery_bytes_to_send,
00043 delivery_bytes_sent;
00044
00045 void usb_handle_get_descriptor(uns8 descriptor_type, uns8 descriptor_num) {
00046 }
00047
00048 void usb_handle_standard_request(setup_data_packet sdp) {
00049
00050 switch (sdp.bRequest) {
00051 case req_Get_Descriptor:
00052 delivery_mode = dm_SEND_DESCRIPTOR;
00053 delivery_bytes_to_send = sdp.wLength;
00054 delivery_bytes_sent = 0;
00055 uns8 descriptor_type = sdp.wValue >> 8;
00056 uns8 descriptor_num = sdp.wValue & 0xff;
00057 serial_print_str("desc: ");
00058 serial_print_int(descriptor_type);
00059 serial_print_str(" num ");
00060 serial_print_int(descriptor_num);
00061 usb_handle_get_descriptor(descriptor_type, descriptor_num);
00062 break;
00063 }
00064 }
00065
00066
00067 void usb_handle_transaction() {
00068
00069 uns8 end_point, pid;
00070
00071 end_point = ustat >> 3;
00072
00073 serial_print_str("U:Tran ");
00074
00075 if (test_bit(ustat, DIR)) {
00076 serial_print_str("IN ");
00077 } else {
00078 serial_print_str("OUT ");
00079 }
00080 serial_print_str(" EP: ");
00081 serial_print_int(end_point);
00082
00083 if (end_point == 0) {
00084 pid = (bd0out.stat >> 2) & 0x0f;
00085 serial_print_str(" pid: 0x");
00086 serial_print_int_hex(pid);
00087 serial_print_str(" bytes: ");
00088 serial_print_int(bd0out.count);
00089 return;
00090 if (pid == pid_SETUP) {
00091 setup_data_packet *sdp = (setup_data_packet*) 0x0500;
00092 setup_data_packet my_sdp;
00093 memcpy( (void*)&my_sdp, (void *)sdp, 8);
00094
00095 if (!test_bit(my_sdp.bmRequestType, REQUEST_TYPE1) &&
00096 !test_bit(my_sdp.bmRequestType, REQUEST_TYPE0)) {
00097 serial_print_str("Std req ");
00098 if ((my_sdp.bmRequestType & 0b00011111) == 0b00000) {
00099 serial_print_str(" 2dev ");
00100 } else if ((my_sdp.bmRequestType & 0b00011111) == 0b00001) {
00101 serial_print_str(" 2int ");
00102 } else if ((my_sdp.bmRequestType & 0b00011111) == 0b00011) {
00103 serial_print_str(" 2oth ");
00104 }
00105 serial_print_str(" req no ");
00106 serial_print_int(my_sdp.bRequest);
00107 usb_handle_standard_request(my_sdp);
00108 }
00109 }
00110 }
00111 }
00112
00113 void usb_handle_reset() {
00114 usb_address = 0;
00115 uaddr = 0;
00116
00117
00118 clear_bit(uir, TRNIF);
00119 clear_bit(uir, TRNIF);
00120 clear_bit(uir, TRNIF);
00121 clear_bit(uir, TRNIF);
00122
00123
00124
00125
00126 bd0out.count = 8;
00127 bd0out.addr_l = 0x00;
00128 bd0out.addr_h = 0x05;
00129
00130 clear_bit(bd0out.stat, DTS);
00131 clear_bit(bd0out.stat, KEN);
00132 clear_bit(bd0out.stat, INCDIS);
00133 set_bit (bd0out.stat, DTSEN);
00134 clear_bit(bd0out.stat, BSTALL);
00135 clear_bit(bd0out.stat, BC9);
00136 clear_bit(bd0out.stat, BC8);
00137
00138 set_bit (bd0out.stat, UOWN);
00139
00140
00141
00142 bd0in.count = 8;
00143 bd0in.addr_h = 0x05;
00144 bd0in.addr_l = 0x08;
00145 clear_bit(bd0in.stat, DTS);
00146 clear_bit(bd0in.stat, KEN);
00147 clear_bit(bd0in.stat, INCDIS);
00148 clear_bit(bd0in.stat, BSTALL);
00149 clear_bit(bd0in.stat, BC9);
00150 clear_bit(bd0in.stat, BC8);
00151
00152 clear_bit(bd0in.stat, UOWN);
00153
00154 serial_print_str("U:Reset ");
00155 serial_print_int_hex(uir);
00156
00157 }
00158
00159 void usb_handle_stall() {
00160 serial_print_str("U:Stall ");
00161 }
00162
00163
00164
00165 void usb_handle_isr() {
00166
00167 if (test_bit(pir2, USBIF)) {
00168 clear_bit(pir2, USBIF);
00169
00170 if (test_bit(uir, TRNIF)) {
00171 usb_handle_transaction();
00172 clear_bit(uir, TRNIF);
00173 }
00174
00175 if (test_bit(uir, URSTIF)) {
00176 usb_handle_reset();
00177
00178 uir = 0;
00179 }
00180
00181 if (test_bit(uir, STALLIF)) {
00182 usb_handle_stall();
00183 clear_bit(uir, STALLIF);
00184 }
00185 }
00186 }
00187
00188
00189 void usb_init() {
00190
00191 usb_state = stPOWERED;
00192
00193
00194 clear_bit(ucfg, UTRDIS);
00195 set_bit(ucfg, FSEN);
00196 set_bit (ucfg, UPUEN);
00197
00198 clear_bit(ucfg, PPB1);
00199 clear_bit(ucfg, PPB0);
00200
00201
00202
00203
00204
00205
00206
00207
00208 set_bit(uep0, EPHSHK);
00209 set_bit(uep0, EPOUTEN);
00210 set_bit(uep0, EPINEN);
00211 clear_bit(uep0, EPCONDIS);
00212
00213
00214
00215 set_bit(uie, STALLIE);
00216 set_bit(uie, TRNIE);
00217 set_bit(uie, URSTIE);
00218 set_bit(pie2, USBIE);
00219
00220
00221 }
00222
00223 void usb_enable_module() {
00224
00225
00226 set_bit(ucon, USBEN);
00227 }