63#pragma data_alignment=256
64static uint8_t g_ohci_hcca[256];
65#pragma data_alignment=4
74char _is_in_interrupt = 0;
78#define OHCI_CONTROL_INIT \
79 ((OHCI_CTRL_CBSR & 0x3) | OHCI_CTRL_IE | OHCI_CTRL_PLE)
83#define OHCI_UNLINK_TIMEOUT 20
89static void td_submit_urb(
URB_T * urb);
90static int rh_submit_urb(
URB_T *urb);
91static ED_T *ep_add_ed(
USB_DEV_T *usb_dev, uint32_t pipe,
int interval,
int load);
92static int ep_link(ED_T *edi);
93static void ep_rm_ed(
USB_DEV_T *usb_dev, ED_T *ed);
94static int ep_unlink(ED_T *ed);
95static int rh_unlink_urb(
URB_T *urb);
98static int cc_to_error[16] =
121static void TD_CompletionCode(uint8_t cc)
126 USB_debug(
"NO ERROR");
129 USB_debug(
"CRC ERROR");
131 case TD_CC_BITSTUFFING:
132 USB_debug(
"BIT STUFFING");
134 case TD_CC_DATATOGGLEM:
135 USB_debug(
"DATA TOGGLE MISMATCH");
141 USB_debug(
"DEVICE NOT RESPONDING");
143 case TD_PIDCHECKFAIL:
144 USB_debug(
"PID CHECK FAILURE");
146 case TD_UNEXPECTEDPID:
147 USB_debug(
"UNEXPECTED PID");
150 USB_debug(
"DATA OVERRUN");
152 case TD_DATAUNDERRUN:
153 USB_debug(
"DATA UNDERRUN");
155 case TD_BUFFEROVERRUN:
156 USB_debug(
"BUFFER OVERRUN");
158 case TD_BUFFERUNDERRUN:
159 USB_debug(
"BUFFER UNDERRUN");
162 USB_debug(
"NOT ACCESSED");
165 USB_debug(
", [0x%02x]\n", cc);
174static void urb_free_priv(URB_PRIV_T *urb_priv)
178 for(i = 0; i < urb_priv->length; i++)
190#ifdef USB_VERBOSE_DEBUG
191static void urb_print(
URB_T * urb,
char * str,
int small)
200 USB_debug(
"%s URB: no dev\n", str);
204 USB_debug(
"%s - ", str);
209 USB_debug(
"dev:%d, ", usb_pipedevice(pipe));
210 USB_debug(
"ep:%d<%c>, ", usb_pipeendpoint(pipe), usb_pipeout(pipe) ?
'O' :
'I');
222 if(usb_pipecontrol(pipe))
227 USB_debug(
"GET_STATUS");
230 USB_debug(
"CLEAR_FEATURE");
233 USB_debug(
"SET_FEATURE");
236 USB_debug(
"SET_ADDRESS");
239 USB_debug(
"GET_DESCRIPTOR");
242 USB_debug(
"SET_DESCRIPTOR");
245 USB_debug(
"GET_CONFIGURATION");
248 USB_debug(
"SET_CONFIGURATION");
251 USB_debug(
"GET_INTERFACE");
254 USB_debug(
"SET_INTERFACE");
257 USB_debug(
"SYNC_FRAME");
260 USB_debug(
"Command");
265 for(i = 0; i < 8 ; i++)
266 USB_debug(
" %02x", ((uint8_t *) urb->
setup_packet) [i]);
273 len = usb_pipeout(pipe) ?
275 for(i = 0; i < 16 && i < len; i++)
277 USB_debug(
"%s stat:%d\n", i < len ? "..." : "", urb->status);
288static void ep_print_int_eds()
294 for(i = 0; i < 32; i++)
297 ed_p = &(ohci.hcca->int_table[i]);
300 USB_debug(
"branch %d:", i);
301 while((*ed_p != 0) && (j--))
303 ed = (ED_T *)(*ed_p);
304 USB_debug(
" ed:%4x;", ed->hwINFO);
305 ed_p = &ed->hwNextED;
318static int sohci_return_urb(
URB_T * urb)
320 URB_PRIV_T *urb_priv;
331#ifdef USB_VERBOSE_DEBUG
332 urb_print(urb,
"RET", usb_pipeout(urb->
pipe));
335 switch(usb_pipetype(urb->
pipe))
342 if((urb_priv->state != URB_DEL) && (urb->
status == 0))
344 if(urb_priv->state != URB_DEL)
352 case PIPE_ISOCHRONOUS:
354 for(urbt = urb->
next; urbt && (urbt != urb); urbt = urbt->
next);
362 if(urb_priv->state != URB_DEL)
397static int sohci_submit_urb(
URB_T * urb)
399 URB_PRIV_T *urb_priv;
406 USB_info(
"[OHCI] Enter sohci_submit_urb() ...\n");
411 if(usb_endpoint_halted(urb->
dev, usb_pipeendpoint(pipe), usb_pipeout(pipe)))
414#ifdef USB_VERBOSE_DEBUG
415 urb_print(urb,
"SUB", usb_pipein(pipe));
419 if(usb_pipedevice(pipe) == ohci.rh.devnum)
420 return rh_submit_urb(urb);
433 switch(usb_pipetype(pipe))
439 case PIPE_ISOCHRONOUS:
466 memset(urb_priv, 0,
sizeof(URB_PRIV_T));
468 for(i = 0; i < size; i++)
473 urb_free_priv(urb_priv);
479 urb_priv->length = size;
482 if(ed->state == ED_NEW || (ed->state & ED_DEL))
484 urb_free_priv(urb_priv);
488 if(usb_pipetype(pipe) == PIPE_ISOCHRONOUS)
492 urb->
start_frame = ((ed->state == ED_OPER) ? (ed->last_iso + 1) : (ohci.hcca->frame_no)) & 0xffff;
499 if(pipe == PIPE_INTERRUPT)
500 USB_debug(
"submit: urb: %x, ed: %x\n", (
int)urb, (
int)ed);
503 if(ed->state != ED_OPER)
517static int sohci_unlink_urb(
URB_T * urb)
525#ifdef USB_VERBOSE_DEBUG
526 urb_print(urb,
"UNLINK", 1);
530 if(usb_pipedevice(urb->
pipe) == ohci.rh.devnum)
531 return rh_unlink_urb(urb);
537 URB_PRIV_T * urb_priv;
544 USB_error(
"bug in call to sohci_unlink_urb!!\n");
553 if(urb_priv->state == URB_DEL)
556 urb_priv->state = URB_DEL;
558 ep_rm_ed(urb->
dev, urb_priv->ed);
559 urb_priv->ed->state |= ED_URB_DEL;
568 USB_warning(
"unlink URB timeout\n");
600static int sohci_alloc_dev(
USB_DEV_T *usb_dev)
603 OHCI_DEVICE_T *ohcidev;
607 if(ohci_dev_alloc_mark[i] == 0)
609 ohci_dev_alloc_mark[i] = 1;
610 ohcidev = &g_ohci_dev_pool[i];
611 memset((
char *)ohcidev, 0,
sizeof(OHCI_DEVICE_T));
612 usb_dev->hcpriv = ohcidev;
616 USB_error(
"sohci_alloc_dev - no free memory!\n");
625static int sohci_free_dev(
USB_DEV_T * usb_dev)
631 dev = usb_to_ohci(usb_dev);
636 if(usb_dev->devnum >= 0)
642 for(i = 0; i < NUM_EDS; i++)
647 if(ed->state != ED_NEW)
649 if(ed->state == ED_OPER)
652 USB_warning(
"driver dev %d ed 0x%x unfreed URB\n", usb_dev->devnum, i);
655 ep_rm_ed(usb_dev, ed);
677 USB_warning(
"Warning! TD leak, %d\n", cnt);
679 else if(!_is_in_interrupt)
686 USB_error(
"Error! - free device %d timeout", usb_dev->devnum);
693 USB_error(
"Error! - devnum %d deletion in interrupt\nSystem Halt!!", usb_dev->devnum);
702 if(&g_ohci_dev_pool[i] == dev)
703 ohci_dev_alloc_mark[i] = 0;
711static int sohci_get_current_frame_number(
USB_DEV_T *usb_dev)
713 return ohci.hcca->frame_no;
718USB_OP_T sohci_device_operations =
722 sohci_get_current_frame_number,
735static int ep_int_ballance(
int interval,
int load)
740 for(i = 0; i < 32; i++)
741 if(ohci.ohci_int_load [branch] > ohci.ohci_int_load [i])
744 branch = branch % interval;
745 for(i = branch; i < 32; i += interval)
746 ohci.ohci_int_load [i] += load;
755static int ep_2_n_interval(
int inter)
759 for(i = 0; ((inter >> i) > 1) && (i < 5); i++);
769static int ep_rev(
int num_bits,
int word)
773 for(i = 0; i < num_bits; i++)
774 wout |= (((word >> i) & 1) << (num_bits - i - 1));
784static int ep_link(ED_T *edi)
800 if(ohci.ed_controltail ==
NULL)
801 USBH->HcControlHeadED = (uint32_t)ed;
803 ohci.ed_controltail->hwNextED = (uint32_t)ed;
804 ed->ed_prev = ohci.ed_controltail;
805 if(!ohci.ed_controltail && !ohci.ed_rm_list[0] && (!ohci.ed_rm_list[1]))
807 ohci.hc_control |= OHCI_CTRL_CLE;
808 USBH->HcControl = ohci.hc_control;
810 ohci.ed_controltail = edi;
815 if(ohci.ed_bulktail ==
NULL)
816 USBH->HcBulkHeadED = (uint32_t)ed;
818 ohci.ed_bulktail->hwNextED = (uint32_t)ed;
819 ed->ed_prev = ohci.ed_bulktail;
820 if(!ohci.ed_bulktail && !ohci.ed_rm_list[0] && (!ohci.ed_rm_list[1]))
822 ohci.hc_control |= OHCI_CTRL_BLE;
823 USBH->HcControl = ohci.hc_control;
825 ohci.ed_bulktail = edi;
830 interval = ep_2_n_interval(ed->int_period);
831 ed->int_interval = interval;
832 int_branch = ep_int_ballance(interval, load);
833 ed->int_branch = int_branch;
835 for(i = 0; i < ep_rev(6, interval); i += inter)
839 for(ed_p = &(ohci.hcca->int_table[ep_rev(5, i) + int_branch]);
840 (*ed_p != 0) && (((ED_T *)(*ed_p))->int_interval >= interval);
841 ed_p = &(((ED_T *)(*ed_p))->hwNextED))
842 inter = ep_rev(6, ((ED_T *)(*ed_p))->int_interval);
843 ed->hwNextED = *ed_p;
844 *ed_p = (uint32_t)ed;
848 case PIPE_ISOCHRONOUS:
850 ed->int_interval = 1;
851 if(ohci.ed_isotail !=
NULL)
853 ohci.ed_isotail->hwNextED = (uint32_t)ed;
854 ed->ed_prev = ohci.ed_isotail;
858 for(i = 0; i < 32; i += inter)
861 for(ed_p = &(ohci.hcca->int_table[ep_rev(5, i)]);
862 (*ed_p != 0) && ed_p; ed_p = &(((ED_T *)(*ed_p))->hwNextED))
863 inter = ep_rev(6, ((ED_T *)(*ed_p))->int_interval);
864 *ed_p = (uint32_t)ed;
868 ohci.ed_isotail = edi;
881static int ep_unlink(ED_T *ed)
886 ed->hwINFO |= OHCI_ED_SKIP;
890 if(ed->ed_prev ==
NULL)
894 ohci.hc_control &= ~OHCI_CTRL_CLE;
895 USBH->HcControl = ohci.hc_control;
897 USBH->HcControlHeadED = ed->hwNextED;
900 ed->ed_prev->hwNextED = ed->hwNextED;
902 if(ohci.ed_controltail == ed)
903 ohci.ed_controltail = ed->ed_prev;
905 ((ED_T *)(ed->hwNextED))->ed_prev = ed->ed_prev;
909 if(ed->ed_prev ==
NULL)
913 ohci.hc_control &= ~OHCI_CTRL_BLE;
914 USBH->HcControl = ohci.hc_control;
916 USBH->HcBulkHeadED = ed->hwNextED;
919 ed->ed_prev->hwNextED = ed->hwNextED;
921 if(ohci.ed_bulktail == ed)
922 ohci.ed_bulktail = ed->ed_prev;
924 ((ED_T *)(ed->hwNextED))->ed_prev = ed->ed_prev;
927 case PIPE_ISOCHRONOUS:
929 if(ohci.ed_isotail == ed)
930 ohci.ed_isotail = ed->ed_prev;
931 if(ed->hwNextED != 0)
932 ((ED_T *)ed->hwNextED)->ed_prev = ed->ed_prev;
934 if(ed->ed_prev !=
NULL)
936 ed->ed_prev->hwNextED = ed->hwNextED;
942 for(i = 0; i < 32; i++)
944 for(ed_ptr = (uint32_t *) & (ohci.hcca->int_table[i]);
945 (*ed_ptr != 0); ed_ptr = (uint32_t *) & (((ED_T *)(*ed_ptr))->hwNextED))
947 if(ed_ptr == (uint32_t *) & (((ED_T *)(*ed_ptr))->hwNextED))
950 if((ED_T *)*ed_ptr == ed)
952 *ed_ptr = (uint32_t)(((ED_T *)(*ed_ptr))->hwNextED);
960 ed->state = ED_UNLINK;
973static ED_T *ep_add_ed(
USB_DEV_T *usb_dev, uint32_t pipe,
int interval,
int load)
977 OHCI_DEVICE_T *ohci_dev;
981 ohci_dev = usb_to_ohci(usb_dev);
982 ep_num = (((pipe) >> 15) & 0xf);
986 if(ohci_dev->edp[ep_num] ==
NULL)
989 if(ohci_dev->edp[ep_num] ==
NULL)
994 ed = ed_ret = ohci_dev->edp[ep_num];
996 if((ed->state & ED_DEL) || (ed->state & ED_URB_DEL))
999 if(ed->state == ED_NEW)
1001 ed->hwINFO = OHCI_ED_SKIP;
1007 ed->hwTailP = (uint32_t)td;
1008 ed->hwHeadP = ed->hwTailP;
1009 ed->state = ED_UNLINK;
1010 ed->type = usb_pipetype(pipe);
1011 usb_to_ohci(usb_dev)->ed_cnt++;
1014 ohci.dev[usb_pipedevice(pipe)] = usb_dev;
1016 ed->hwINFO = (usb_pipedevice(pipe)
1017 | usb_pipeendpoint(pipe) << 7
1018 | (usb_pipeisoc(pipe) ? 0x8000 : 0)
1019 | (usb_pipecontrol(pipe) ? 0 : (usb_pipeout(pipe) ? 0x800 : 0x1000))
1020 | usb_pipeslow(pipe) << 13
1021 | usb_maxpacket(usb_dev, pipe, usb_pipeout(pipe)) << 16);
1023 if((ed->type == PIPE_INTERRUPT) && (ed->state == ED_UNLINK))
1025 ed->int_period = interval;
1026 ed->int_load = load;
1039static void ep_rm_ed(
USB_DEV_T *usb_dev, ED_T *ed)
1043 if((ed->state & ED_DEL) || (ed->state & ED_URB_DEL))
1046 ed->hwINFO |= OHCI_ED_SKIP;
1053 ohci.hc_control &= ~OHCI_CTRL_CLE;
1054 USBH->HcControl = ohci.hc_control;
1057 ohci.hc_control &= ~OHCI_CTRL_BLE;
1058 USBH->HcControl = ohci.hc_control;
1062 frame = ohci.hcca->frame_no & 0x1;
1063 ed->ed_rm_list = ohci.ed_rm_list[frame];
1064 ohci.ed_rm_list[frame] = ed;
1069 USBH->HcInterruptStatus = OHCI_INTR_SF;
1070 USBH->HcInterruptEnable = OHCI_INTR_SF;
1079static void iso_td_fill(uint32_t info,
void *data,
URB_T *urb,
int index)
1081 volatile TD_T *td, *td_pt;
1082 volatile URB_PRIV_T *urb_priv;
1084 uint32_t bufferStart;
1088 if(index >= urb_priv->length)
1090 USB_error(
"Error! - internal OHCI error: TD index > length\n");
1094 td_pt = urb_priv->td[index];
1097 td = urb_priv->td[index] = (TD_T *)((uint32_t)urb_priv->ed->hwTailP & 0xfffffff0);
1099 td->ed = urb_priv->ed;
1102 td->next_dl_td =
NULL;
1113 td->hwCBP = (uint32_t)((!bufferStart || !len) ? 0 : bufferStart) & 0xFFFFF000;
1114 td->hwBE = (uint32_t)((!bufferStart || !len) ? 0 : (bufferStart + len - 1));
1115 td->hwNextTD = (uint32_t)td_pt;
1116 td->is_iso_packet = 1;
1118#ifdef DELAY_INTERRUPT
1119 info = (info & 0xFF1FFFFF) | (3 << 21);
1127 td->hwPSW[i] |= 0xE000E000;
1130 USB_info(
"Frame:[%x], CBP:[%x], BE:[%x], PSW0:[%x], PSW1:[%x]\n",
1131 td->hwINFO & 0xffff, td->hwCBP, td->hwBE, td->hwPSW[0], td->hwPSW[1]);
1134 td_pt->hwNextTD = 0;
1135 td->ed->hwTailP = td->hwNextTD;
1140static void td_fill(uint32_t info,
void *data,
int len,
URB_T *urb,
int index)
1142 volatile TD_T *td, *td_pt;
1143 volatile URB_PRIV_T *urb_priv;
1147 if(index >= urb_priv->length)
1149 USB_error(
"Error! - internal OHCI error: TD index [%d] > length [%d]\n", index, urb_priv->length);
1153 td_pt = urb_priv->td[index];
1156 td = urb_priv->td[index] = (TD_T *)((uint32_t)urb_priv->ed->hwTailP & 0xfffffff0);
1157 td->ed = urb_priv->ed;
1158 td->next_dl_td =
NULL;
1163 td->hwCBP = (uint32_t)((!data || !len) ? 0 : data);
1164 td->hwBE = (uint32_t)((!data || !len) ? 0 : (uint32_t)data + len - 1);
1165 td->hwNextTD = (uint32_t)td_pt;
1166 td->is_iso_packet = 0;
1168#ifdef DELAY_INTERRUPT
1169 info = (info & 0xFF1FFFFF) | (3 << 21);
1172 td_pt->hwNextTD = 0;
1173 td->ed->hwTailP = td->hwNextTD;
1182static void td_submit_urb(
URB_T * urb)
1184 URB_PRIV_T *urb_priv;
1190 uint32_t toggle = 0;
1197 if(usb_gettoggle(urb->
dev, usb_pipeendpoint(urb->
pipe), usb_pipeout(urb->
pipe)))
1199 toggle = TD_T_TOGGLE;
1203 toggle = TD_T_DATA0;
1204 usb_settoggle(urb->
dev, usb_pipeendpoint(urb->
pipe), usb_pipeout(urb->
pipe), 1);
1207 urb_priv->td_cnt = 0;
1209 switch(usb_pipetype(urb->
pipe))
1212 info = usb_pipeout(urb->
pipe) ? (TD_CC | TD_DP_OUT) : (TD_CC | TD_DP_IN);
1213 while(data_len > 4096)
1215 td_fill(info | (cnt ? TD_T_TOGGLE : toggle), data, 4096, urb, cnt);
1216 data = (
void *)((uint32_t)data + 4096);
1220 info = usb_pipeout(urb->
pipe) ? (TD_CC | TD_DP_OUT) : (TD_CC | TD_R | TD_DP_IN);
1221 td_fill(info | (cnt ? TD_T_TOGGLE : toggle), data, data_len, urb, cnt);
1223 USBH->HcCommandStatus = OHCI_BLF;
1226 case PIPE_INTERRUPT:
1227 info = usb_pipeout(urb->
pipe) ? (TD_CC | TD_DP_OUT | toggle) : (TD_CC | TD_R | TD_DP_IN | toggle);
1228 td_fill(info, data, data_len, urb, cnt++);
1232 info = TD_CC | TD_DP_SETUP | TD_T_DATA0;
1233 td_fill(info, ctrl, 8, urb, cnt++);
1236 info = usb_pipeout(urb->
pipe) ? (TD_CC | TD_R | TD_DP_OUT | TD_T_DATA1) : (TD_CC | TD_R | TD_DP_IN | TD_T_DATA1);
1237 td_fill(info, data, data_len, urb, cnt++);
1239 info = usb_pipeout(urb->
pipe) ? (TD_CC | TD_DP_IN | TD_T_DATA1) : (TD_CC | TD_DP_OUT | TD_T_DATA1);
1240 td_fill(info,
NULL, 0, urb, cnt++);
1241 USBH->HcCommandStatus = OHCI_CLF;
1244 case PIPE_ISOCHRONOUS:
1248 (uint8_t *) data, urb, cnt);
1252 if(urb_priv->length != cnt)
1253 USB_error(
"Error! - TD LENGTH %d != CNT %d", urb_priv->length, cnt);
1263static void dl_transfer_length(TD_T * td)
1265 uint32_t tdBE, tdCBP;
1268 URB_PRIV_T *urb_priv;
1275 tdBE = (uint32_t)td->hwBE;
1276 tdCBP = (uint32_t)td->hwCBP;
1278 if(td->is_iso_packet)
1287 tdPSW = td->hwPSW[i / 2] >> 16;
1289 tdPSW = td->hwPSW[i / 2] & 0xffff;
1291 cc = (tdPSW >> 12) & 0xF;
1294 if(usb_pipeout(urb->
pipe))
1297 dlen = tdPSW & 0x3ff;
1301 if(!(urb->
transfer_flags & USB_DISABLE_SPD) && (cc == TD_DATAUNDERRUN))
1310 if(!(usb_pipetype(urb->
pipe) == PIPE_CONTROL &&
1311 ((td->index == 0) || (td->index == urb_priv->length - 1))))
1321 USB_info(
"td:%x urb->actual_length:%d\n", (
int)td, urb->
actual_length);
1328static void dl_del_urb(
URB_T * urb)
1348static TD_T *dl_reverse_done_list()
1350 uint32_t td_list_hc;
1351 TD_T *td_rev =
NULL;
1352 TD_T *td_list =
NULL;
1353 URB_PRIV_T *urb_priv;
1355 td_list_hc = (uint32_t)(ohci.hcca->done_head) & 0xfffffff0;
1356 ohci.hcca->done_head = 0;
1360 td_list = (TD_T *)td_list_hc;
1361 USB_info(
"TD done - 0x%08x, DEV:[%d], ED:[%d] PSW:[%x]\n", (uint32_t)td_list, td_list->urb->dev->devnum, (td_list->ed->hwINFO >> 7) & 0xf, td_list->hwPSW[0] >> 12);
1363#ifdef USB_VERBOSE_DEBUG
1364 if(td_list->ed->hwHeadP & 0x1)
1365 USB_error(
"!!Halted - DEV:[%d], ED:[%d] PSW0:[%x] PSW1:[%x]\n",
1366 td_list->urb->dev->devnum, (td_list->ed->hwINFO >> 7) & 0xf,
1367 (td_list->hwPSW[0] >> 12) & 0xf, (td_list->hwPSW[0] >> 28) & 0xf);
1370 if(TD_CC_GET((uint32_t)td_list->hwINFO))
1372 urb_priv = &(td_list->urb->urb_hcpriv);
1374 if(td_list->ed->type == PIPE_ISOCHRONOUS)
1376 if((td_list->hwINFO & 0xE0000000) == 0x80000000)
1382 USB_error(
"ISO! - CC:0x%x, PSW:0x%x 0x%x\n", td_list->hwINFO >> 28, td_list->hwPSW[0], td_list->hwPSW[1]);
1386 USB_error(
"CC Error!! - DEV[%d] ED[%d] - ", td_list->urb->dev->devnum, (td_list->ed->hwINFO >> 7) & 0xf);
1387 TD_CompletionCode(TD_CC_GET((uint32_t)(td_list->hwINFO)));
1390 if(td_list->ed->hwHeadP & 0x1)
1392 if(urb_priv && ((td_list->index + 1) < urb_priv->length))
1394 td_list->ed->hwHeadP = (urb_priv->td[urb_priv->length - 1]->hwNextTD & 0xfffffff0) |
1395 (td_list->ed->hwHeadP & 0x2);
1396 urb_priv->td_cnt += urb_priv->length - td_list->index - 1;
1399 td_list->ed->hwHeadP &= 0xfffffff2;
1403 td_list->next_dl_td = td_rev;
1405 td_list_hc = (uint32_t)(td_list->hwNextTD) & 0xfffffff0;
1416static void dl_del_list(uint32_t frame)
1421 TD_T *td =
NULL, *td_next =
NULL, *tdHeadP =
NULL, *tdTailP;
1423 int ctrl = 0, bulk = 0;
1425 for(ed = ohci.ed_rm_list[frame]; ed !=
NULL; ed = ed->ed_rm_list)
1427 tdTailP = (TD_T *)((uint32_t)(ed->hwTailP) & 0xfffffff0);
1428 tdHeadP = (TD_T *)((uint32_t)(ed->hwHeadP) & 0xfffffff0);
1429 edINFO = (uint32_t)ed->hwINFO;
1430 td_p = &ed->hwHeadP;
1432 for(td = tdHeadP; td != tdTailP; td = td_next)
1434 URB_T * urb = td->urb;
1435 URB_PRIV_T * urb_priv = &(td->urb->urb_hcpriv);
1437 td_next = (TD_T *)((uint32_t)(td->hwNextTD) & 0xfffffff0);
1438 if((urb_priv->state == URB_DEL) || (ed->state & ED_DEL))
1440 tdINFO = (uint32_t)td->hwINFO;
1441 if(TD_CC_GET(tdINFO) < 0xE)
1442 dl_transfer_length(td);
1443 *td_p = td->hwNextTD | (*td_p & 0x3);
1446 if(++(urb_priv->td_cnt) == urb_priv->length)
1451 td_p = &td->hwNextTD;
1455 if(ed->state & ED_DEL)
1458 OHCI_DEVICE_T * dev = usb_to_ohci(ohci.dev[edINFO & 0x7F]);
1460 ed->hwINFO = OHCI_ED_SKIP;
1467 ed->state &= ~ED_URB_DEL;
1468 tdHeadP = (TD_T *)((uint32_t)(ed->hwHeadP) & 0xfffffff0);
1469 if(tdHeadP == tdTailP)
1471 if(ed->state == ED_OPER)
1474 ed->hwINFO = OHCI_ED_SKIP;
1476 --(usb_to_ohci(ohci.dev[edINFO & 0x7F]))->ed_cnt;
1479 ed->hwINFO &= ~OHCI_ED_SKIP;
1497 USBH->HcControlCurrentED = 0;
1499 USBH->HcBulkCurrentED = 0;
1500 if(!ohci.ed_rm_list[!frame])
1502 if(ohci.ed_controltail)
1503 ohci.hc_control |= OHCI_CTRL_CLE;
1504 if(ohci.ed_bulktail)
1505 ohci.hc_control |= OHCI_CTRL_BLE;
1506 USBH->HcControl = ohci.hc_control;
1510 ohci.ed_rm_list[frame] =
NULL;
1518static void dl_done_list(TD_T *td_list)
1520 TD_T *td_list_next =
NULL;
1524 URB_PRIV_T *urb_priv;
1525 uint32_t tdINFO, edHeadP, edTailP;
1529 td_list_next = td_list->next_dl_td;
1533 tdINFO = (uint32_t)(td_list->hwINFO);
1537 dl_transfer_length(td_list);
1540 cc = TD_CC_GET(tdINFO);
1541 if(cc == TD_CC_STALL)
1542 usb_endpoint_halt(urb->
dev, usb_pipeendpoint(urb->
pipe), usb_pipeout(urb->
pipe));
1544 if(!(urb->
transfer_flags & USB_DISABLE_SPD) && (cc == TD_DATAUNDERRUN))
1547 if(++(urb_priv->td_cnt) == urb_priv->length)
1549 if((ed->state & (ED_OPER | ED_UNLINK)) && (urb_priv->state != URB_DEL))
1551 urb->
status = cc_to_error[cc];
1552 sohci_return_urb(urb);
1559 if(ed->state != ED_NEW)
1561 edHeadP = (uint32_t)(ed->hwHeadP) & 0xfffffff0;
1562 edTailP = (uint32_t)(ed->hwTailP);
1565 if((edHeadP == edTailP) && (ed->state == ED_OPER))
1570 td_list = td_list_next;
1580static uint8_t root_hub_dev_des[] =
1604static uint8_t root_hub_config_des[] =
1645static int rh_send_irq(
void *rh_data,
int rh_len)
1653 num_ports =
USBH->HcRhDescriptorA & RH_A_NDP;
1656 *(uint8_t *)data = (
USBH->HcRhStatus & (RH_HS_LPSC | RH_HS_OCIC)) ? 1 : 0;
1657 ret = *(uint8_t *)data;
1660 for(i = 0; i < num_ports; i++)
1662 *(uint8_t *)(data + (i + 1) / 8) |= ((
USBH->HcRhPortStatus[i] &
1663 (RH_PS_CSC | RH_PS_PESC | RH_PS_PSSC | RH_PS_OCIC | RH_PS_PRSC))
1664 ? 1 : 0) << ((i + 1) % 8);
1665 ret += *(uint8_t *)(data + (i + 1) / 8);
1671 memcpy(rh_data, data, min(len, min(rh_len,
sizeof(data))));
1678static URB_T *_OHCI_RH_IRQ;
1682void ohci_int_timer_do(
int ptr)
1685 URB_T *urb = _OHCI_RH_IRQ;
1693#ifdef USB_VERBOSE_DEBUG
1694 urb_print(urb,
"RET-t(rh)", usb_pipeout(urb->
pipe));
1705static int ascii2utf(
char *ascii, uint8_t *utf,
int utfmax)
1709 for(retval = 0; *ascii && utfmax > 1; utfmax -= 2, retval += 2)
1711 *utf++ = *ascii++ & 0x7f;
1723static int usbh_root_hub_string(
int id,
int serial,
char *type, uint8_t *data,
int len)
1739 sprintf(buf,
"%x", serial);
1744 sprintf(buf,
"USB %s Root Hub", type);
1751 data [0] = 2 + ascii2utf(buf, data + 2, len - 2);
1759#define RH_OK(x) len = (x); break
1760#define WR_RH_STAT(x) (USBH->HcRhStatus = (x))
1761#define WR_RH_PORTSTAT(x) (USBH->HcRhPortStatus[wIndex-1] = (x))
1762#define RD_RH_STAT (USBH->HcRhStatus)
1763#define RD_RH_PORTSTAT (USBH->HcRhPortStatus[wIndex-1])
1767static int rh_submit_urb(
URB_T *urb)
1774 int status = TD_CC_NOERROR;
1777 uint16_t bmRType_bReq;
1786 data_buf = (uint8_t *) datab;
1788 if(usb_pipeint(pipe))
1795 ohci_int_timer_do(0);
1801 bmRType_bReq = (cmd->requesttype << 8) | cmd->request;
1802 wValue = cmd->value;
1803 wIndex = cmd->index;
1804 wLength = cmd->length;
1805 USB_info(
"rh_submit_urb, req = 0x%x len=%d\n", bmRType_bReq, wLength);
1807#ifdef USB_VERBOSE_DEBUG
1808 USB_debug(
"Command - ");
1809 switch(bmRType_bReq & 0x80FF)
1812 USB_debug(
"GET_STATUS\n");
1815 case RH_CLEAR_FEATURE:
1816 USB_debug(
"CLEAR_FEATURE\n");
1819 case RH_SET_FEATURE:
1820 USB_debug(
"SET_FEATURE\n");
1823 case RH_SET_ADDRESS:
1824 USB_debug(
"SET_ADDRESS\n");
1827 case RH_GET_DESCRIPTOR:
1828 USB_debug(
"GET_DESCRIPTOR\n");
1831 case RH_SET_DESCRIPTOR:
1832 USB_debug(
"SET_DESCRIPTOR\n");
1835 case RH_GET_CONFIGURATION:
1836 USB_debug(
"GET_CONFIGURATION\n");
1839 case RH_SET_CONFIGURATION:
1840 USB_debug(
"RH_SET_CONFIGURATION\n");
1844 USB_debug(
"GET_STATE\n");
1847 case RH_GET_INTERFACE:
1848 USB_debug(
"GET_INTERFACE\n");
1851 case RH_SET_INTERFACE:
1852 USB_debug(
"SET_INTERFACE\n");
1856 USB_debug(
"SYNC_FRAME\n");
1860 USB_debug(
"SET_EP\n");
1865 switch(bmRType_bReq)
1876 *(uint16_t *) data_buf = USB_SWAP16(1);
1879 case RH_GET_STATUS | RH_INTERFACE:
1880 *(uint16_t *) data_buf = 0;
1883 case RH_GET_STATUS | RH_ENDPOINT:
1884 *(uint16_t *) data_buf = 0;
1887 case RH_GET_STATUS | RH_CLASS:
1889 data_buf[0] = RD_RH_STAT & 0xFF;
1890 data_buf[1] = (RD_RH_STAT >> 8) & 0xFF;
1891 data_buf[2] = (RD_RH_STAT >> 16) & 0xFF;
1892 data_buf[3] = (RD_RH_STAT >> 24) & 0xFF;
1893 *(uint32_t *) data_buf = RD_RH_STAT & ~(RH_HS_CRWE | RH_HS_DRWE);
1896 case RH_GET_STATUS | RH_OTHER | RH_CLASS:
1897 *(uint32_t *) data_buf = RD_RH_PORTSTAT;
1900 case RH_CLEAR_FEATURE | RH_ENDPOINT:
1903 case(RH_ENDPOINT_STALL):
1908 case RH_CLEAR_FEATURE | RH_CLASS:
1911 case RH_C_HUB_LOCAL_POWER:
1913 case(RH_C_HUB_OVER_CURRENT):
1914 WR_RH_STAT(RH_HS_OCIC);
1919 case RH_CLEAR_FEATURE | RH_OTHER | RH_CLASS:
1922 case(RH_PORT_ENABLE):
1923 WR_RH_PORTSTAT(RH_PS_CCS);
1925 case(RH_PORT_SUSPEND):
1926 WR_RH_PORTSTAT(RH_PS_POCI);
1928 case(RH_PORT_POWER):
1929 WR_RH_PORTSTAT(RH_PS_LSDA);
1931 case(RH_C_PORT_CONNECTION):
1932 WR_RH_PORTSTAT(RH_PS_CSC);
1934 case(RH_C_PORT_ENABLE):
1935 WR_RH_PORTSTAT(RH_PS_PESC);
1937 case(RH_C_PORT_SUSPEND):
1938 WR_RH_PORTSTAT(RH_PS_PSSC);
1940 case(RH_C_PORT_OVER_CURRENT):
1941 WR_RH_PORTSTAT(RH_PS_OCIC);
1943 case(RH_C_PORT_RESET):
1944 WR_RH_PORTSTAT(RH_PS_PRSC);
1949 case RH_SET_FEATURE | RH_OTHER | RH_CLASS:
1952 case(RH_PORT_SUSPEND):
1953 WR_RH_PORTSTAT(RH_PS_PSS);
1956 case(RH_PORT_RESET):
1957 if(RD_RH_PORTSTAT & RH_PS_CCS)
1958 WR_RH_PORTSTAT(RH_PS_PRS);
1961 case(RH_PORT_POWER):
1962 WR_RH_PORTSTAT(RH_PS_PPS);
1965 case(RH_PORT_ENABLE):
1966 if(RD_RH_PORTSTAT & RH_PS_CCS)
1967 WR_RH_PORTSTAT(RH_PS_PES);
1972 case RH_SET_ADDRESS:
1973 ohci.rh.devnum = wValue;
1976 case RH_GET_DESCRIPTOR:
1977 switch((wValue & 0xff00) >> 8)
1980 len = min(leni, min(
sizeof(root_hub_dev_des), wLength));
1981 data_buf = root_hub_dev_des;
1985 len = min(leni, min(
sizeof(root_hub_config_des), wLength));
1986 data_buf = root_hub_config_des;
1990 len = usbh_root_hub_string(wValue & 0xff, 0x0,
"OHCI", data, wLength);
1994 RH_OK(min(leni, len));
1998 status = TD_CC_STALL;
2002 case RH_GET_DESCRIPTOR | RH_CLASS:
2004 uint32_t temp =
USBH->HcRhDescriptorA;
2007 data_buf [1] = 0x29;
2008 data_buf [2] = temp & RH_A_NDP;
2011 data_buf [3] |= 0x1;
2012 if(temp & RH_A_NOCP)
2013 data_buf [3] |= 0x10;
2014 else if(temp & RH_A_OCPM)
2015 data_buf [3] |= 0x8;
2018 data_buf [5] = (temp & RH_A_POTPGT) >> 24;
2019 temp =
USBH->HcRhDescriptorB;
2020 data_buf [7] = temp & RH_B_DR;
2021 if(data_buf [2] < 7)
2023 data_buf [8] = 0xff;
2028 data_buf [8] = (temp & RH_B_DR) >> 8;
2029 data_buf [10] = data_buf [9] = 0xff;
2031 len = min(leni, min(data_buf [0], wLength));
2035 case RH_GET_CONFIGURATION:
2036 *(uint8_t *) data_buf = 0x01;
2039 case RH_SET_CONFIGURATION:
2040 WR_RH_STAT(0x10000);
2045 status = TD_CC_STALL;
2048 len = min(len, leni);
2049 if(data != data_buf)
2050 memcpy(data, data_buf, len);
2052 urb->
status = cc_to_error[status];
2063static int rh_unlink_urb(
URB_T *urb)
2065 if(ohci.rh.urb == urb)
2089static int ohci_reset()
2094 USBH->HcInterruptDisable = OHCI_INTR_MIE;
2097 USBH->HcControl = 0;
2100 USBH->HcCommandStatus = OHCI_HCR;
2102 while((
USBH->HcCommandStatus & OHCI_HCR) != 0)
2106 USB_error(
"Error! - USB HC reset timed out!\n");
2111 USBH->HcControl = (
USBH->HcControl & 0xffffff3f) | OHCI_USB_RESET;
2118void USBH_IRQHandler(
void)
2122 _is_in_interrupt = 1;
2124 ints =
USBH->HcInterruptStatus;
2128 if((ohci.hcca->done_head != 0) && !((uint32_t)(ohci.hcca->done_head) & 0x01))
2130 ints = OHCI_INTR_WDH;
2133 if(ints & OHCI_INTR_UE)
2136 USB_error(
"Error! - OHCI Unrecoverable Error, controller disabled\n");
2147 if(ints & OHCI_INTR_OC)
2149 USB_debug(
"Ownership change!!\n");
2152 if(ints & OHCI_INTR_WDH)
2154 dl_done_list(dl_reverse_done_list());
2155 USBH->HcInterruptStatus = OHCI_INTR_WDH;
2158 if(ints & OHCI_INTR_SO)
2163 USBH->HcInterruptDisable = OHCI_INTR_SO;
2164 USBH->HcInterruptStatus = OHCI_INTR_SO;
2167 if(ints & OHCI_INTR_SF)
2169 uint32_t frame = ohci.hcca->frame_no & 1;
2171 USBH->HcInterruptDisable = OHCI_INTR_SF;
2172 if(ohci.ed_rm_list[!frame] !=
NULL)
2174 dl_del_list(!frame);
2176 if(ohci.ed_rm_list[frame] !=
NULL)
2177 USBH->HcInterruptEnable = OHCI_INTR_SF;
2180 if(ints & OHCI_INTR_RHSC)
2182 USBH->HcInterruptDisable = OHCI_INTR_RHSC;
2183 USBH->HcInterruptStatus = OHCI_INTR_RHSC;
2186 if(ints & OHCI_INTR_RD)
2188 USBH->HcInterruptDisable = OHCI_INTR_RD;
2189 USBH->HcInterruptStatus = OHCI_INTR_RD;
2192 ints &= ~OHCI_INTR_WDH;
2193 USBH->HcInterruptEnable = OHCI_INTR_MIE;
2196 _is_in_interrupt = 0;
2206static int hc_start()
2209 uint32_t fminterval;
2216 for(i = 0; i < NUM_INTS; i++)
2217 ohci.ohci_int_load[i] = 0;
2218 for(i = 0; i < NUM_INTS; i++)
2219 ohci.hcca->int_table[i] = 0;
2222 ohci.ed_rm_list [0] =
NULL;
2223 ohci.ed_rm_list [1] =
NULL;
2226 ohci.ed_isotail =
NULL;
2227 ohci.ed_controltail =
NULL;
2228 ohci.ed_bulktail =
NULL;
2232 USBH->HcControlHeadED = 0;
2233 USBH->HcBulkHeadED = 0;
2235 USBH->HcHCCA = (uint32_t)ohci.hcca;
2237 fminterval = 0x2edf;
2240 USBH->HcPeriodicStart = (fminterval * 9) / 10;
2243 fminterval |= ((((fminterval - 210) * 6) / 7) << 16);
2244 USBH->HcFmInterval = fminterval;
2246 USBH->HcLSThreshold = 0x628;
2249 ohci.hc_control = OHCI_CONTROL_INIT | OHCI_USB_OPER;
2251 USBH->HcControl = ohci.hc_control;
2254 mask = OHCI_INTR_MIE | OHCI_INTR_UE | OHCI_INTR_WDH | OHCI_INTR_SO;
2255 USBH->HcInterruptEnable = mask;
2256 USBH->HcInterruptStatus = mask;
2259#ifndef AUTO_POWER_CONTROL
2261 USBH->HcRhDescriptorA |= RH_A_NOCP;
2265 USBH->HcRhDescriptorA =
USBH->HcRhDescriptorA & ~(RH_A_PSM | RH_A_OCPM);
2267 USBH->HcRhStatus = RH_HS_LPSC;
2281 ohci.bus->root_hub = usb_dev;
2282 usbh_connect_device(usb_dev);
2283 if(usbh_settle_new_device(usb_dev) != 0)
2294static void hc_restart()
2300 if(ohci.bus->root_hub)
2301 usbh_disconnect_device(&ohci.bus->root_hub);
2304 for(i = 0; i < NUM_INTS; i++)
2305 ohci.ohci_int_load[i] = 0;
2306 for(i = 0; i < NUM_INTS; i++)
2307 ohci.hcca->int_table[i] = 0;
2310 ohci.ed_rm_list [0] =
NULL;
2311 ohci.ed_rm_list [1] =
NULL;
2314 ohci.ed_isotail =
NULL;
2315 ohci.ed_controltail =
NULL;
2316 ohci.ed_bulktail =
NULL;
2318 if((temp = ohci_reset()) < 0 || (temp = hc_start()) < 0)
2319 USB_error(
"Error! - can't restart usb-%s, %d\n",
"ohci->ohci_dev->slot_name", temp);
2321 USB_error(
"Error! - restart usb-%s completed\n",
"ohci->ohci_dev->slot_name");
2331 if(
sizeof(ED_T) != 32)
2333 USB_error(
"Wrong ED_T size!!!\n");
2337 if(
sizeof(TD_T) != 64)
2339 USB_error(
"Wrong TD_T size!!!\n");
2343 memset((
char *)&ohci, 0,
sizeof(OHCI_T));
2344 ohci.hcca = (OHCI_HCCA_T *)g_ohci_hcca;
2345 memset((
char *)ohci.hcca, 0, 256);
2348 ohci_dev_alloc_mark[i] = 0;
2352 if(ohci_reset() < 0)
2355 ohci.hc_control = OHCI_USB_RESET;
2356 USBH->HcControl = ohci.hc_control;
2364 g_ohci_bus.op = &sohci_device_operations;
2365 g_ohci_bus.root_hub =
NULL;
2366 g_ohci_bus.hcpriv = &ohci;
2367 ohci.bus = &g_ohci_bus;
2371 USB_error(
"Error! - can't start OHCI!\n");
void *__dso_handle __attribute__((weak))
int transfer_buffer_length
ISO_PACKET_DESCRIPTOR_T iso_frame_desc[8]
void(* complete)(struct urb_t *)
#define MAX_TD_PER_OHCI_URB
USB Host core driver header file.
HIDDEN_SYMBOLS struct usb_device USB_DEV_T
#define CC_ERR_NORESPONSE
#define CC_ERR_DATAUNDERRUN
#define CC_ERR_DATA_TOGGLE
#define CC_ERR_NOT_DEFINED
#define USB_ERR_INPROGRESS
#define CC_ERR_BUFFERUNDERRUN
#define CC_ERR_NOT_ACCESS
#define CC_ERR_BUFFEROVERRUN
#define USB_ERR_CONNRESET
#define CC_ERR_DATAOVERRUN
#define CC_ERR_INVALID_PID
#define USB_ERR_URB_PENDING
void usbh_free_device(USB_DEV_T *dev)
void ohci_free_td(TD_T *td_p)
TD_T * ohci_alloc_td(USB_DEV_T *dev)
void ohci_free_ed(ED_T *ed_p)
USB_DEV_T * usbh_alloc_device(USB_DEV_T *parent, USB_BUS_T *bus)
void usbh_mdelay(uint32_t msec)
void ohci_free_dev_td(USB_DEV_T *dev)