public inbox for linux-omap@vger.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox