summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAmaury Pouly <pamaury@rockbox.org>2010-03-12 10:59:34 +0000
committerAmaury Pouly <pamaury@rockbox.org>2010-03-12 10:59:34 +0000
commitc7517f5662eda9af236e6206af6f8b02e77bf118 (patch)
tree23ebc53fa6965d398315c154c988f1ddd1413c93
parent263e4d5cbfc32eda780f8f9f35930e1ac2b5dada (diff)
downloadrockbox-c7517f5662eda9af236e6206af6f8b02e77bf118.tar.gz
rockbox-c7517f5662eda9af236e6206af6f8b02e77bf118.zip
Add experimental support for isochronous transfers in the usb ARC driver. There are several details to tweaks however.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@25130 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--firmware/export/config.h4
-rw-r--r--firmware/target/arm/usb-drv-arc.c30
2 files changed, 27 insertions, 7 deletions
diff --git a/firmware/export/config.h b/firmware/export/config.h
index 5af75f51f0..e678590b44 100644
--- a/firmware/export/config.h
+++ b/firmware/export/config.h
@@ -882,6 +882,10 @@ Lyre prototype 1 */
882//#define USB_HAS_INTERRUPT -- seems to be broken 882//#define USB_HAS_INTERRUPT -- seems to be broken
883#endif /* CONFIG_USBOTG */ 883#endif /* CONFIG_USBOTG */
884 884
885#if CONFIG_USBOTG == USBOTG_ARC
886#define USB_HAS_ISOCHRONOUS
887#endif
888
885/* define the class drivers to enable */ 889/* define the class drivers to enable */
886#ifdef BOOTLOADER 890#ifdef BOOTLOADER
887 891
diff --git a/firmware/target/arm/usb-drv-arc.c b/firmware/target/arm/usb-drv-arc.c
index a96b8a67e8..94dc9b7b5e 100644
--- a/firmware/target/arm/usb-drv-arc.c
+++ b/firmware/target/arm/usb-drv-arc.c
@@ -368,7 +368,7 @@ static void prepare_td(struct transfer_descriptor* td,
368 struct transfer_descriptor* previous_td, void *ptr, int len,int pipe); 368 struct transfer_descriptor* previous_td, void *ptr, int len,int pipe);
369static void bus_reset(void); 369static void bus_reset(void);
370static void init_control_queue_heads(void); 370static void init_control_queue_heads(void);
371static void init_bulk_queue_heads(void); 371static void init_queue_heads(void);
372static void init_endpoints(void); 372static void init_endpoints(void);
373/*-------------------------------------------------------------------------*/ 373/*-------------------------------------------------------------------------*/
374static void usb_drv_stop(void) 374static void usb_drv_stop(void)
@@ -645,7 +645,7 @@ bool usb_drv_powered(void)
645void usb_drv_set_address(int address) 645void usb_drv_set_address(int address)
646{ 646{
647 REG_DEVICEADDR = address << USBDEVICEADDRESS_BIT_POS; 647 REG_DEVICEADDR = address << USBDEVICEADDRESS_BIT_POS;
648 init_bulk_queue_heads(); 648 init_queue_heads();
649 init_endpoints(); 649 init_endpoints();
650} 650}
651 651
@@ -862,6 +862,7 @@ static void prepare_td(struct transfer_descriptor* td,
862 void *ptr, int len,int pipe) 862 void *ptr, int len,int pipe)
863{ 863{
864 //logf("adding a td : %d",len); 864 //logf("adding a td : %d",len);
865 /* FIXME td allow iso packets per frame override but we don't use it here */
865 memset(td, 0, sizeof(struct transfer_descriptor)); 866 memset(td, 0, sizeof(struct transfer_descriptor));
866 td->next_td_ptr = DTD_NEXT_TERMINATE; 867 td->next_td_ptr = DTD_NEXT_TERMINATE;
867 td->size_ioc_sts = (len<< DTD_LENGTH_BIT_POS) | 868 td->size_ioc_sts = (len<< DTD_LENGTH_BIT_POS) |
@@ -979,18 +980,33 @@ static void init_control_queue_heads(void)
979 qh_array[EP_CONTROL+1].dtd.next_td_ptr = QH_NEXT_TERMINATE; 980 qh_array[EP_CONTROL+1].dtd.next_td_ptr = QH_NEXT_TERMINATE;
980} 981}
981/* manual: 32.14.4.1 Queue Head Initialization */ 982/* manual: 32.14.4.1 Queue Head Initialization */
982static void init_bulk_queue_heads(void) 983static void init_queue_heads(void)
983{ 984{
985 /* FIXME the packetsize for isochronous transfers is 1023 : 1024 but
986 * the current code only support one type of packet size so we restrict
987 * isochronous packet size for now also */
984 int packetsize = (usb_drv_port_speed() ? 512 : 64); 988 int packetsize = (usb_drv_port_speed() ? 512 : 64);
985 int i; 989 int i;
986 990
987 /* TODO: this should take ep_allocation into account */ 991 /* TODO: this should take ep_allocation into account */
988 for (i=1;i<USB_NUM_ENDPOINTS;i++) { 992 for (i=1;i<USB_NUM_ENDPOINTS;i++) {
989 qh_array[i*2].max_pkt_length = packetsize << QH_MAX_PKT_LEN_POS | 993
990 QH_ZLT_SEL; 994 /* OUT */
995 if(endpoints[i].type[DIR_OUT] == USB_ENDPOINT_XFER_ISOC)
996 /* FIXME: we can adjust the number of packets per frame, currently use one */
997 qh_array[i*2].max_pkt_length = packetsize << QH_MAX_PKT_LEN_POS | QH_ZLT_SEL | 1 << QH_MULT_POS;
998 else
999 qh_array[i*2].max_pkt_length = packetsize << QH_MAX_PKT_LEN_POS | QH_ZLT_SEL;
1000
991 qh_array[i*2].dtd.next_td_ptr = QH_NEXT_TERMINATE; 1001 qh_array[i*2].dtd.next_td_ptr = QH_NEXT_TERMINATE;
992 qh_array[i*2+1].max_pkt_length = packetsize << QH_MAX_PKT_LEN_POS | 1002
993 QH_ZLT_SEL; 1003 /* IN */
1004 if(endpoints[i].type[DIR_IN] == USB_ENDPOINT_XFER_ISOC)
1005 /* FIXME: we can adjust the number of packets per frame, currently use one */
1006 qh_array[i*2+1].max_pkt_length = packetsize << QH_MAX_PKT_LEN_POS | QH_ZLT_SEL | 1 << QH_MULT_POS;
1007 else
1008 qh_array[i*2+1].max_pkt_length = packetsize << QH_MAX_PKT_LEN_POS | QH_ZLT_SEL;
1009
994 qh_array[i*2+1].dtd.next_td_ptr = QH_NEXT_TERMINATE; 1010 qh_array[i*2+1].dtd.next_td_ptr = QH_NEXT_TERMINATE;
995 } 1011 }
996} 1012}