00001
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047 #include "config.h"
00048 #include "conf_usb.h"
00049 #include "usb_host_hub.h"
00050 #include "modules/usb/host_chap9/usb_host_task.h"
00051 #include "modules/usb/host_chap9/usb_host_enum.h"
00052 #include "modules/usb/host_chap9/usb_host_hub.h"
00053 #include "lib_mcu/usb/usb_drv.h"
00054
00055
00056 #if (USB_HUB_SUPPORT == ENABLE)
00057
00058 #ifndef HUB_MAX_NB_PORT
00059 #warning Using default value for HUB_MAX_NB_PORT
00060 #define HUB_MAX_NB_PORT 4
00061 #endif
00062
00063
00064
00065
00066
00067
00068
00069
00071 U8 hub_port_state[USB_MAX_HUB_NUMBER][HUB_MAX_NB_PORT];
00072
00074 U8 hub_device_address[USB_MAX_HUB_NUMBER];
00075
00077 U8 f_hub_port_disconnect=FALSE;
00078
00080 U8 nb_hub_present;
00081
00082
00091 void hub_init(U8 hub_number)
00092 {
00093 U8 i;
00094
00095 for(i=0;i<HUB_MAX_NB_PORT;i++)
00096 {
00097 hub_port_state[hub_number][i]=HUB_DEVICE_POWERED;
00098 }
00099 }
00100
00101
00102
00111 U32 get_port_status(U8 port_number)
00112 {
00113 U32 to_return;
00114
00115 Get_port_status(port_number);
00116 LSB3(to_return)=data_stage[3];
00117 LSB2(to_return)=data_stage[2];
00118 LSB1(to_return)=data_stage[1];
00119 LSB0(to_return)=data_stage[0];
00120 return to_return;
00121 }
00122
00123
00124
00137 void hub_manage_port_change_status(U8 port_change_status, U8 hub_number)
00138 {
00139 U8 i,c;
00140 U32 port_status;
00141 U8 port_addr_0_in_use=0;
00142
00143
00144
00145
00146 for(i=0;i<USB_MAX_HUB_NUMBER;i++)
00147 {
00148 for(c=1;c<=HUB_MAX_NB_PORT;c++)
00149 {
00150 if((hub_port_state[i][c-1] != HUB_DEVICE_POWERED) && (hub_port_state[i][c-1] != HUB_DEVICE_READY))
00151 {
00152
00153
00154 if(i!=(hub_number-1))
00155 { return; }
00156
00157 port_addr_0_in_use=c;
00158 break;
00159 }
00160 }
00161 }
00162
00163
00164 for(c=1;c<=HUB_MAX_NB_PORT;c++)
00165 {
00166
00167
00168 if((port_addr_0_in_use!=0) && (c!=port_addr_0_in_use) )
00169 {
00170 continue;
00171 }
00172
00173
00174 if(port_change_status & (1<<c))
00175 {
00176
00177 port_status=get_port_status(c);
00178
00179
00180 if( port_status & ((U32)1<<C_PORT_CONNECTION))
00181 {
00182 Clear_port_feature(C_PORT_CONNECTION,c);
00183 if(port_status&((U32)1<<PORT_CONNECTION))
00184 {
00185
00186 if(port_status&((U32)1<<PORT_LOW_SPEED))
00187 {
00188
00189 }
00190 else
00191 {
00192 enumerate_hub_port_device(c,HUB_PORT_CONNECTION,hub_number);
00193 }
00194 }
00195 else
00196 {
00197
00198 enumerate_hub_port_device(c,HUB_PORT_DISCONNECT,hub_number);
00199 }
00200 }
00201 else if( port_status & ((U32)1<<C_PORT_SUSPEND))
00202 {
00203
00204 Clear_port_feature(C_PORT_SUSPEND,c);
00205 }
00206 else if( port_status & ((U32)1<<C_PORT_RESET))
00207 {
00208
00209 Clear_port_feature(C_PORT_RESET,c);
00210 enumerate_hub_port_device(c,HUB_PORT_RESET,hub_number);
00211 }
00212 }
00213
00214
00215
00216 if((hub_port_state[hub_number-1][c-1] != HUB_DEVICE_POWERED) && (hub_port_state[hub_number-1][c-1] != HUB_DEVICE_READY))
00217 {
00218 break;
00219 }
00220 }
00221 }
00222
00232 void enumerate_hub_port_device(U8 hub_port, U8 port_ev, U8 hub_number)
00233 {
00234 U8 device_index=0;
00235 U8 hub_device_index=0;
00236 U8 nb_port,c;
00237
00238
00239 for(c=0;c<MAX_DEVICE_IN_USB_TREE;c++)
00240 {
00241 if(usb_tree.device[c].device_address==hub_device_address[hub_number-1])
00242 {
00243 hub_device_index=c;
00244 }
00245 }
00246
00247
00248
00249 for(c=0;c<MAX_DEVICE_IN_USB_TREE;c++)
00250 {
00251 if((usb_tree.device[c].hub_port_nb == hub_port) && (usb_tree.device[c].parent_hub_number==hub_number))
00252 {
00253 device_index=c;
00254 break;
00255 }
00256 }
00257
00258
00259
00260 if(port_ev==HUB_PORT_DISCONNECT)
00261 {
00262 remove_device_entry(device_index);
00263 usb_tree.nb_device--;
00264 hub_port_state[hub_number-1][hub_port-1]=HUB_DEVICE_POWERED;
00265 f_hub_port_disconnect = TRUE;
00266 return;
00267 }
00268
00269
00270 switch(hub_port_state[hub_number-1][hub_port-1])
00271 {
00272
00273
00274 case HUB_DEVICE_POWERED:
00275 if(port_ev==HUB_PORT_CONNECTION)
00276 {
00277 device_index=usb_tree.nb_device++;
00278 usb_tree.device[device_index].hub_port_nb=hub_port;
00279 usb_tree.device[device_index].parent_hub_number=hub_number;
00280 Host_select_device(hub_device_index);
00281 Set_port_reset(hub_port);
00282 hub_port_state[hub_number-1][hub_port-1]=HUB_DEVICE_WAIT_RST_1;
00283 }
00284 break;
00285
00286
00287
00288
00289 case HUB_DEVICE_WAIT_RST_1:
00290 if(port_ev==HUB_PORT_RESET)
00291 {
00292 c = 0;
00293 while (c<250)
00294 {
00295 if (Is_usb_event(EVT_HOST_SOF)) { Usb_ack_event(EVT_HOST_SOF); c++; }
00296 if (Is_host_emergency_exit() || Is_usb_bconnection_error_interrupt())
00297 {hub_port_state[hub_number-1][hub_port-1]=HUB_DEVICE_POWERED; return;}
00298 }
00299 Host_select_device(device_index);
00300
00301 usb_tree.device[device_index].ep_ctrl_size=8;
00302
00303 if( CONTROL_GOOD == host_get_device_descriptor_uncomplete())
00304 {
00305 Host_select_device(hub_device_index);
00306 usb_tree.device[device_index].ep_ctrl_size=data_stage[OFFSET_FIELD_MAXPACKETSIZE];
00307 Set_port_reset(hub_port);
00308 hub_port_state[hub_number-1][hub_port-1]=HUB_DEVICE_WAIT_RST_2;
00309 }
00310 }
00311 break;
00312
00313
00314
00315 case HUB_DEVICE_WAIT_RST_2:
00316 if(port_ev==HUB_PORT_RESET)
00317 {
00318 c = 0;
00319 while (c<250)
00320 {
00321 if (Is_usb_event(EVT_HOST_SOF)) { Usb_ack_event(EVT_HOST_SOF); c++; }
00322 if (Is_host_emergency_exit() || Is_usb_bconnection_error_interrupt())
00323 {hub_port_state[hub_number-1][hub_port-1]=HUB_DEVICE_POWERED; return;}
00324 }
00325
00326 Host_select_device(device_index);
00327
00328
00329 host_set_address(DEVICE_BASE_ADDRESS+device_index);
00330 usb_tree.device[+device_index].device_address=DEVICE_BASE_ADDRESS+device_index;
00331
00332
00333 Host_select_device(device_index);
00334
00335
00336 if (CONTROL_GOOD == host_get_device_descriptor())
00337 {
00338
00339 if (HOST_TRUE == host_check_VID_PID())
00340 {
00341 Host_set_device_supported();
00342 Host_device_supported_action();
00343 }
00344 else
00345 {
00346 #if (HOST_STRICT_VID_PID_TABLE==ENABLE)
00347 Host_device_not_supported_action();
00348 return
00349 #endif
00350 }
00351
00352 if (CONTROL_GOOD == host_get_configuration_descriptor())
00353 {
00354 if (HOST_FALSE != host_check_class())
00355 {
00356 #if (HOST_AUTO_CFG_ENDPOINT==ENABLE)
00357 if (host_auto_configure_endpoint())
00358 #else
00359 if(User_configure_endpoint())
00360 #endif
00361 {
00362 if (CONTROL_GOOD == host_set_configuration(1))
00363 {
00364 hub_port_state[hub_number-1][hub_port-1] = HUB_DEVICE_READY;
00365
00366 if(Get_class(0)==HUB_CLASS )
00367 {
00368
00369 if( Get_hub_descriptor()==CONTROL_GOOD)
00370 {
00371
00372 nb_port=data_stage[NB_PORT_OFFSET];
00373 for(c=1;c<=nb_port;c++)
00374 {
00375 Set_port_feature(PORT_POWER,c);
00376 }
00377 nb_hub_present++;
00378 hub_init(nb_hub_present-1);
00379 hub_device_address[nb_hub_present-1]=usb_tree.device[device_index].device_address;
00380 }
00381 }
00382 else
00383 {
00384 new_device_connected=TRUE;
00385 }
00386 }
00387 }
00388 }
00389 }
00390 }
00391 }
00392 break;
00393
00394 case HUB_DEVICE_READY:
00395 break;
00396 default:
00397 break;
00398 }
00399 }
00400
00401
00402 #endif