00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
#include "config.h"
00023
#include "conf\conf_usb.h"
00024
#include "lib_mcu\usb\usb_drv.h"
00025
#include "modules\usb\usb_enum.h"
00026
#include "usb_user_configuration.h"
00027
#include "usb_user_enum.h"
00028
#include "usb_task.h"
00029
00030
00031
00032
00033
00034
00035
00036 static U8 hid_idle_duration;
00037 extern U8 send_free;
00038
00039 extern _MEM_TYPE_SLOW_ U8 *
pbuffer;
00040 extern _MEM_TYPE_SLOW_ U8 data_to_transfer;
00041
00042 extern S_hid_set_control SetControlBytes;
00043
extern void usb_get_descriptor(
void);
00044 extern bit
reset_to_bootloader;
00045 extern code
U8 hid_report[];
00046
00047
00048
00049
00064 Bool usb_user_read_request(U8 type, U8 request)
00065 {
00066
U8*
pointer;
00067
U8 c;
00068
00069 type = type;
00070
switch (request)
00071 {
00072
case HID_SET_REPORT:
00073
Usb_ack_receive_setup();
00074
while(!
Is_usb_receive_out() );
00075
SetControlBytes.
arrived=1;
00076
pointer = &(
SetControlBytes.
type);
00077
for (c=
HID_CONTROL_DATA_LENGTH; c!=0; c--)
00078 {
00079 *
pointer =
Usb_read_byte();
00080
pointer ++;
00081 }
00082
if (
SetControlBytes.
type == 0x55)
00083 {
00084
if (
SetControlBytes.
direction == 0xAA)
00085 {
00086
if (
SetControlBytes.
length == 0x55AA)
00087 {
00088
reset_to_bootloader =
TRUE;
00089 }
00090 }
00091 }
00092
Usb_ack_receive_out();
00093
Usb_send_control_in();
00094
while(!(
Is_usb_in_ready()));
00095
Usb_ack_in_ready();
00096
return TRUE;
00097
break;
00098
00099
case HID_SET_IDLE:
00100 ACC =
Usb_read_byte();
00101
hid_idle_duration =
Usb_read_byte();
00102
Usb_ack_receive_setup();
00103
00104
Usb_send_control_in();
00105
while(!(
Is_usb_in_ready()));
00106
Usb_ack_in_ready();
00107
return TRUE;
00108
break;
00109
00110
case HID_GET_IDLE:
00111
Usb_ack_receive_setup();
00112
Usb_set_DIR();
00113
Usb_write_byte(
hid_idle_duration);
00114
Usb_send_control_in();
00115
while(!(
Is_usb_in_ready()));
00116
Usb_ack_in_ready();
00117
00118
while (!(
Is_usb_receive_out()));
00119
Usb_ack_receive_out();
00120
return TRUE;
00121
break;
00122
case GET_DESCRIPTOR:
00123
if (type == 0x81) {
usb_get_descriptor(); }
00124
return TRUE;
00125
break;
00126
default:
00127
return FALSE;
00128
break;
00129 }
00130
return FALSE;
00131 }
00132
00133
00145 Bool usb_user_get_descriptor(U8 type, U8 string)
00146 {
00147
switch (type)
00148 {
00149
case STRING_DESCRIPTOR:
00150
if (string == 0)
00151 {
00152
data_to_transfer =
sizeof (
usb_user_language_id);
00153
pbuffer = &
usb_user_language_id.
bLength;
00154
return TRUE;
00155 }
00156
else
00157
if (string == 1)
00158 {
00159
data_to_transfer =
sizeof (
usb_user_manufacturer_string_descriptor);
00160
pbuffer = &
usb_user_manufacturer_string_descriptor.
bLength;
00161
return TRUE;
00162 }
00163
else
00164
if (string == 2)
00165 {
00166
data_to_transfer =
sizeof (
usb_user_product_string_descriptor);
00167
pbuffer = &
usb_user_product_string_descriptor.
bLength;
00168
return TRUE;
00169 }
00170
else
00171
if (string == 3)
00172 {
00173
data_to_transfer =
sizeof (
usb_user_serial_number);
00174
pbuffer = &
usb_user_serial_number.
bLength;
00175
return TRUE;
00176 }
00177
else
00178 {
00179
return FALSE;
00180 }
00181
break;
00182
case HID_REPORT_DESCRIPTOR:
00183
data_to_transfer =
SIZE_OF_REPORT;
00184
pbuffer =
hid_report;
00185
return TRUE;
00186
break;
00187
case HID_DESCRIPTOR:
00188
data_to_transfer =
sizeof(
usb_conf_desc_hid_fs.
hid);
00189
pbuffer = &(
usb_conf_desc_hid_fs.
hid.
bLength);
00190
return TRUE;
00191
break;
00192
default:
00193
return FALSE;
00194
break;
00195 }
00196 }
00197
00198
00209 void usb_user_endpoint_init(U8 conf_nb)
00210 {
00211
U8 ep_size;
00212
00213 conf_nb = conf_nb;
00214
00215
if(
Is_usb_high_speed()) {
ep_size =
SIZE_512; }
else {
ep_size =
SIZE_64; }
00216
00217
usb_configure_endpoint(
EP_HID_IN, \
00218
TYPE_INTERRUPT,\
00219
DIRECTION_IN, \
00220
ep_size, \
00221
TWO_BANKS, \
00222
NYET_ENABLED);
00223
usb_configure_endpoint(
EP_HID_OUT, \
00224
TYPE_INTERRUPT,\
00225
DIRECTION_OUT, \
00226
ep_size, \
00227
TWO_BANKS, \
00228
NYET_ENABLED);
00229
send_free = 1;
00230 }