All of lore.kernel.org
 help / color / mirror / Atom feed
* [review] OMAP2 USB device DMA support
@ 2006-11-10  5:18 박경민
  0 siblings, 0 replies; only message in thread
From: 박경민 @ 2006-11-10  5:18 UTC (permalink / raw)
  To: linux-omap-open-source

[-- Attachment #1: Type: text/plain, Size: 7595 bytes --]

Hi,

I need to help with USB device DMA.

After some work, I can use DMA with minor problem.

After loading g_file_stroage, I got messages below.
It only displays once, after detection it works well.

So I think we have a problem with protocol with windows.
In fact, I don't know file storage protocol with windows.

Do you have any idea?

Any comments are welcome.

Thank you,
Kyungmin Park

P.S., I also attached the usb dma patch.

/ # insmod /usb/g_file_storage.ko-2.6.19 file=/dev/stl6
Using /usb/g_file_storage.ko-2.6.19
g_file_storage gadget: File-backed Storage Gadget, version: 28 November 2005
g_file_storage gadget: Number of LUNs=1
g_file_storage gadget-lun0: ro=0, file: /dev/stl6
/ # udc: USB reset done, gadget g_file_storage
udc: USB reset done, gadget g_file_storage
g_file_storage gadget: full speed config #1
g_file_storage gadget: error in submission: ep2out-bulk --> -90
udc: USB reset done, gadget g_file_storage
udc: USB reset done, gadget g_file_storage
g_file_storage gadget: full speed config #1
g_file_storage gadget: error in submission: ep2out-bulk --> -90
udc: USB reset done, gadget g_file_storage
udc: USB reset done, gadget g_file_storage
g_file_storage gadget: full speed config #1
g_file_storage gadget: error in submission: ep2out-bulk --> -90
udc: USB reset done, gadget g_file_storage
udc: USB reset done, gadget g_file_storage
g_file_storage gadget: full speed config #1
g_file_storage gadget: error in submission: ep2out-bulk --> -90
udc: USB reset done, gadget g_file_storage
udc: USB reset done, gadget g_file_storage
g_file_storage gadget: full speed config #1
g_file_storage gadget: error in submission: ep2out-bulk --> -90
udc: USB reset done, gadget g_file_storage
udc: USB reset done, gadget g_file_storage
g_file_storage gadget: full speed config #1
g_file_storage gadget: error in submission: ep2out-bulk --> -90
udc: USB reset done, gadget g_file_storage
udc: USB reset done, gadget g_file_storage
g_file_storage gadget: full speed config #1
g_file_storage gadget: error in submission: ep2out-bulk --> -90
udc: USB reset done, gadget g_file_storage
udc: USB reset done, gadget g_file_storage
g_file_storage gadget: full speed config #1
g_file_storage gadget: error in submission: ep2out-bulk --> -90
udc: USB reset done, gadget g_file_storage
udc: USB reset done, gadget g_file_storage
g_file_storage gadget: full speed config #1
g_file_storage gadget: error in submission: ep2out-bulk --> -90
udc: USB reset done, gadget g_file_storage
udc: USB reset done, gadget g_file_storage
g_file_storage gadget: full speed config #1
g_file_storage gadget: error in submission: ep2out-bulk --> -90
udc: USB reset done, gadget g_file_storage
udc: USB reset done, gadget g_file_storage
g_file_storage gadget: full speed config #1

--


diff --git a/drivers/usb/gadget/omap_udc.c b/drivers/usb/gadget/omap_udc.c
index 31df02e..5cb3198 100644
--- a/drivers/usb/gadget/omap_udc.c
+++ b/drivers/usb/gadget/omap_udc.c
@@ -63,7 +63,7 @@
 
 /* FIXME: OMAP2 currently has some problem in DMA mode */
 #ifdef CONFIG_ARCH_OMAP2
-#undef USE_DMA
+//#undef USE_DMA
 #endif
 
 /* ISO too */
@@ -74,6 +74,7 @@
 
 #define	DMA_ADDR_INVALID	(~(dma_addr_t)0)
 
+#define OMAP2_DMA_CH(ch)	(((ch) - 1) << 1)
 
 /*
  * The OMAP UDC needs _very_ early endpoint setup:  before enabling the
@@ -620,20 +621,25 @@ static void next_in_dma(struct omap_ep *
 	const int	sync_mode = cpu_is_omap15xx()
 				? OMAP_DMA_SYNC_FRAME
 				: OMAP_DMA_SYNC_ELEMENT;
+	int		dma_trigger = 0;
+
+	if (cpu_is_omap24xx())
+		dma_trigger = OMAP24XX_DMA_USB_W2FC_TX0 + OMAP2_DMA_CH(ep->dma_channel);
 
 	/* measure length in either bytes or packets */
 	if ((cpu_is_omap16xx() && length <= UDC_TXN_TSC)
+			|| (cpu_is_omap24xx() && length <= ep->maxpacket)
 			|| (cpu_is_omap15xx() && length < ep->maxpacket)) {
 		txdma_ctrl = UDC_TXN_EOT | length;
 		omap_set_dma_transfer_params(ep->lch, OMAP_DMA_DATA_TYPE_S8,
-				length, 1, sync_mode, 0, 0);
+				length, 1, sync_mode, dma_trigger, 0);
 	} else {
 		length = min(length / ep->maxpacket,
 				(unsigned) UDC_TXN_TSC + 1);
 		txdma_ctrl = length;
 		omap_set_dma_transfer_params(ep->lch, OMAP_DMA_DATA_TYPE_S16,
 				ep->ep.maxpacket >> 1, length, sync_mode,
-				0, 0);
+				dma_trigger, 0);
 		length *= ep->maxpacket;
 	}
 	omap_set_dma_src_params(ep->lch, OMAP_DMA_PORT_EMIFF,
@@ -672,11 +678,15 @@ static void finish_in_dma(struct omap_ep
 static void next_out_dma(struct omap_ep *ep, struct omap_req *req)
 {
 	unsigned packets;
+	int dma_trigger = 0;
 
 	/* NOTE:  we filtered out "short reads" before, so we know
 	 * the buffer has only whole numbers of packets.
 	 */
 
+	if (cpu_is_omap24xx())
+		dma_trigger = OMAP24XX_DMA_USB_W2FC_RX0 + OMAP2_DMA_CH(ep->dma_channel);
+
 	/* set up this DMA transfer, enable the fifo, start */
 	packets = (req->req.length - req->req.actual) / ep->ep.maxpacket;
 	packets = min(packets, (unsigned)UDC_RXN_TC + 1);
@@ -684,7 +694,7 @@ static void next_out_dma(struct omap_ep 
 	omap_set_dma_transfer_params(ep->lch, OMAP_DMA_DATA_TYPE_S16,
 			ep->ep.maxpacket >> 1, packets,
 			OMAP_DMA_SYNC_ELEMENT,
-			0, 0);
+			dma_trigger, 0);
 	omap_set_dma_dest_params(ep->lch, OMAP_DMA_PORT_EMIFF,
 		OMAP_DMA_AMODE_POST_INC, req->req.dma + req->req.actual,
 		0, 0);
@@ -792,6 +802,7 @@ static void dma_channel_claim(struct oma
 {
 	u16	reg;
 	int	status, restart, is_in;
+	int	dma_channel;
 
 	is_in = ep->bEndpointAddress & USB_DIR_IN;
 	if (is_in)
@@ -818,11 +829,15 @@ static void dma_channel_claim(struct oma
 	ep->dma_channel = channel;
 
 	if (is_in) {
-		status = omap_request_dma(OMAP_DMA_USB_W2FC_TX0 - 1 + channel,
+		if (cpu_is_omap24xx())
+			dma_channel = OMAP24XX_DMA_USB_W2FC_TX0 + OMAP2_DMA_CH(channel);
+		else
+			dma_channel = OMAP_DMA_USB_W2FC_TX0 - 1 + channel;
+		status = omap_request_dma(dma_channel,
 			ep->ep.name, dma_error, ep, &ep->lch);
 		if (status == 0) {
 			UDC_TXDMA_CFG_REG = reg;
-			/* EMIFF */
+			/* EMIFF or SDRC*/
 			omap_set_dma_src_burst_mode(ep->lch,
 						OMAP_DMA_DATA_BURST_4);
 			omap_set_dma_src_data_pack(ep->lch, 1);
@@ -834,7 +849,11 @@ static void dma_channel_claim(struct oma
 				0, 0);
 		}
 	} else {
-		status = omap_request_dma(OMAP_DMA_USB_W2FC_RX0 - 1 + channel,
+		if (cpu_is_omap24xx())
+			dma_channel = OMAP24XX_DMA_USB_W2FC_RX0 + OMAP2_DMA_CH(channel);
+		else
+			dma_channel = OMAP_DMA_USB_W2FC_RX0 - 1 + channel;
+		status = omap_request_dma(dma_channel,
 			ep->ep.name, dma_error, ep, &ep->lch);
 		if (status == 0) {
 			UDC_RXDMA_CFG_REG = reg;
@@ -844,7 +863,7 @@ static void dma_channel_claim(struct oma
 				OMAP_DMA_AMODE_CONSTANT,
 				(unsigned long) io_v2p((u32)&UDC_DATA_DMA_REG),
 				0, 0);
-			/* EMIFF */
+			/* EMIFF or SDRC */
 			omap_set_dma_dest_burst_mode(ep->lch,
 						OMAP_DMA_DATA_BURST_4);
 			omap_set_dma_dest_data_pack(ep->lch, 1);
@@ -857,7 +876,7 @@ static void dma_channel_claim(struct oma
 		omap_disable_dma_irq(ep->lch, OMAP_DMA_BLOCK_IRQ);
 
 		/* channel type P: hw synch (fifo) */
-		if (!cpu_is_omap15xx())
+		if (cpu_class_is_omap1() && !cpu_is_omap15xx())
 			OMAP1_DMA_LCH_CTRL_REG(ep->lch) = 2;
 	}
 
@@ -2579,7 +2598,7 @@ omap_ep_setup(char *name, u8 addr, u8 ty
 		 * (for more reliable behavior)
 		 */
 		if ((!use_dma && (addr & USB_DIR_IN))
-				|| machine_is_omap_apollon()
+				|| (!use_dma && machine_is_omap_apollon())
 				|| cpu_is_omap15xx())
 			dbuf = 0;
 


[-- Attachment #2: Type: text/plain, Size: 0 bytes --]



^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2006-11-10  5:18 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-11-10  5:18 [review] OMAP2 USB device DMA support 박경민

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.