|
From: <mar...@us...> - 2007-04-09 10:54:42
|
Revision: 953
http://svn.sourceforge.net/hackndev/?rev=953&view=rev
Author: marex_z71
Date: 2007-04-09 03:54:38 -0700 (Mon, 09 Apr 2007)
Log Message:
-----------
PalmLD: Switch SX2 to Linux USB Gadget driver API
Modified Paths:
--------------
linux4palm/linux/trunk/arch/arm/mach-pxa/palmld/palmld.c
linux4palm/linux/trunk/drivers/usb/gadget/Kconfig
linux4palm/linux/trunk/drivers/usb/gadget/Makefile
Added Paths:
-----------
linux4palm/linux/trunk/drivers/usb/gadget/sx2_udc.c
linux4palm/linux/trunk/drivers/usb/gadget/sx2_udc.h
linux4palm/linux/trunk/include/asm-arm/arch-pxa/sx2.h
Removed Paths:
-------------
linux4palm/linux/trunk/arch/arm/mach-pxa/palmld/palmld_usb.c
linux4palm/linux/trunk/include/asm-arm/arch-pxa/palmld-usb2.h
Modified: linux4palm/linux/trunk/arch/arm/mach-pxa/palmld/palmld.c
===================================================================
--- linux4palm/linux/trunk/arch/arm/mach-pxa/palmld/palmld.c 2007-04-06 22:44:13 UTC (rev 952)
+++ linux4palm/linux/trunk/arch/arm/mach-pxa/palmld/palmld.c 2007-04-09 10:54:38 UTC (rev 953)
@@ -30,6 +30,7 @@
#include <asm/arch/pxa27x_keyboard.h>
#include <asm/arch/pxapwm-bl.h>
#include <asm/arch/pxa-pm_ll.h>
+#include <asm/arch/sx2.h>
#include <sound/driver.h>
#include <sound/core.h>
@@ -163,6 +164,30 @@
.id = -1,
};
+/*
+ * Cypress EZUSB SX2 USB2.0 Controller
+ */
+static struct sx2_udc_mach_info palmldusb2_platform_data = {
+ .virt_base = PALMLD_USB_VIRT,
+
+ .ready_pin = GPIO_NR_PALMLD_USB_READY,
+ .int_pin = 0, // gotta detect it
+ .reset_pin = GPIO_NR_PALMLD_USB_RESET,
+ .power_pin = GPIO_NR_PALMLD_USB_POWER,
+
+ .sloe_pin = 0, // gotta detect it
+ .slrd_pin = 0, // gotta detect it
+ .slwr_pin = 0, // gotta detect it
+};
+
+static struct platform_device palmldusb2_device = {
+ .name = "sx2-udc",
+ .id = -1,
+ .dev = {
+ .platform_data = &palmldusb2_platform_data,
+ },
+};
+
/**
* Backlight
*/
@@ -258,7 +283,7 @@
static struct platform_device *devices[] __initdata = {
&palmld_kbd, &palmld_ac97, &palmld_ide, &palmld_backlight,
- &palmldled_device, &palmld_pm,
+ &palmldled_device, &palmldusb2_device, &palmld_pm,
};
/*********************************************************
Deleted: linux4palm/linux/trunk/arch/arm/mach-pxa/palmld/palmld_usb.c
===================================================================
--- linux4palm/linux/trunk/arch/arm/mach-pxa/palmld/palmld_usb.c 2007-04-06 22:44:13 UTC (rev 952)
+++ linux4palm/linux/trunk/arch/arm/mach-pxa/palmld/palmld_usb.c 2007-04-09 10:54:38 UTC (rev 953)
@@ -1,310 +0,0 @@
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/errno.h>
-#include <linux/interrupt.h>
-#include <linux/init.h>
-#include <linux/device.h>
-#include <linux/platform_device.h>
-#include <linux/delay.h>
-
-#include <asm/mach-types.h>
-#include <asm/hardware.h>
-#include <asm/arch/pxa-regs.h>
-#include <asm/irq.h>
-#include <asm/arch/palmld-gpio.h>
-#include <asm/arch/palmld-usb2.h>
-
-u16 palmld_usb2_cmd_read(int reg)
-{
- u8 data = PALMLD_USB2_CMD_ADDR | PALMLD_USB2_CMD_READ
- | (reg & PALMLD_USB2_ADDR_MASK);
- PALMLD_USB2_ADDR_CMD = data;
- while((GET_PALMLD_GPIO(USB_READY)?1:0)==0) {
- };
-/* printk("REG 0x%02x F2 0x%02x F4 0x%02x\n",reg,PALMLD_USB2_ADDR_FIFO2,PALMLD_USB2_ADDR_FIFO4);
- printk("REG 0x%02x F2 0x%02x F4 0x%02x\n",reg,PALMLD_USB2_ADDR_FIFO6,PALMLD_USB2_ADDR_FIFO8);
- printk("REG 0x%02x CD 0x%02x\n",reg,PALMLD_USB2_ADDR_CMD);
-*/ return 0;
-}
-
-int palmld_usb2_cmd_set_reg(int reg)
-{
- /* initiate write to addr */
- printk("SETTING 0x%02x\n",(reg | PALMLD_USB2_CMD_ADDR));
- PALMLD_USB2_ADDR_CMD=(reg | PALMLD_USB2_CMD_ADDR);
- /* wait for READY line */
- while((GET_PALMLD_GPIO(USB_READY)?1:0)==0) {
- };
- return 0;
-}
-
-int palmld_usb2_cmd_write(u8 data)
-{
- /* prepare data */
- u8 data1 = ((data & 0xf0)>>4); /* Upper nibble */
- u8 data2 = (data & 0x0f); /* Lower nibble */
-
- /* initiate write to reg */
- printk("UPPER NIBBLE %02x\n",(data1 | PALMLD_USB2_CMD_WRITE));
- PALMLD_USB2_ADDR_CMD=(data1 | PALMLD_USB2_CMD_WRITE);
- /* wait for READY line */
- while((GET_PALMLD_GPIO(USB_READY)?1:0)==0) {
- };
-
- printk("LOWER NIBBLE %02x\n",(data2 | PALMLD_USB2_CMD_WRITE));
- PALMLD_USB2_ADDR_CMD=(data2 | PALMLD_USB2_CMD_WRITE);
- /* wait for READY line */
- while((GET_PALMLD_GPIO(USB_READY)?1:0)==0) {
- };
-
- return 0;
-}
-
-u8 palmld_usb2_test_cmd(void) {
- /* RESET THE CHIP */
- SET_GPIO(118,0);
- udelay(100);
- SET_GPIO(118,1);
- udelay(500);
-
- /* ENUMERATE WITH BUILTIN DESCRIPTOR */
- /* select register 0x30 - descriptor RAM*/
- palmld_usb2_cmd_set_reg(0x30);
- /* write descriptor length */
- palmld_usb2_cmd_write(0xa0);
- palmld_usb2_cmd_write(0x00);
-
- /* write descriptor as described in SX2 docs */
- /* Device Descriptor */
- palmld_usb2_cmd_write(18);
- palmld_usb2_cmd_write(01);
- palmld_usb2_cmd_write(00);
- palmld_usb2_cmd_write(02);
- palmld_usb2_cmd_write(00);
- palmld_usb2_cmd_write(00);
- palmld_usb2_cmd_write(00);
- palmld_usb2_cmd_write(64);
- palmld_usb2_cmd_write(0x12);
- palmld_usb2_cmd_write(0x34);
- palmld_usb2_cmd_write(0x56);
- palmld_usb2_cmd_write(0x78);
- palmld_usb2_cmd_write(0xcd);
- palmld_usb2_cmd_write(0xab);
- palmld_usb2_cmd_write(01);
- palmld_usb2_cmd_write(02);
- palmld_usb2_cmd_write(00);
- palmld_usb2_cmd_write(01);
- /* Device qualifier */
- palmld_usb2_cmd_write(10);
- palmld_usb2_cmd_write(06);
- palmld_usb2_cmd_write(00);
- palmld_usb2_cmd_write(02);
- palmld_usb2_cmd_write(00);
- palmld_usb2_cmd_write(00);
- palmld_usb2_cmd_write(00);
- palmld_usb2_cmd_write(64);
- palmld_usb2_cmd_write(01);
- palmld_usb2_cmd_write(00);
-
- /* High Speed Config */
- palmld_usb2_cmd_write(9);
- palmld_usb2_cmd_write(02);
- palmld_usb2_cmd_write(46);
- palmld_usb2_cmd_write(00);
- palmld_usb2_cmd_write(01);
- palmld_usb2_cmd_write(01);
- palmld_usb2_cmd_write(00);
- palmld_usb2_cmd_write(0x0A);
- palmld_usb2_cmd_write(50);
- /* Interface descr */
- palmld_usb2_cmd_write(9);
- palmld_usb2_cmd_write(04);
- palmld_usb2_cmd_write(00);
- palmld_usb2_cmd_write(00);
- palmld_usb2_cmd_write(04);
- palmld_usb2_cmd_write(0xFF);
- palmld_usb2_cmd_write(0x00);
- palmld_usb2_cmd_write(0x00);
- palmld_usb2_cmd_write(00);
- /* Endpoint descr */
- palmld_usb2_cmd_write(07);
- palmld_usb2_cmd_write(05);
- palmld_usb2_cmd_write(0x02);
- palmld_usb2_cmd_write(02);
- palmld_usb2_cmd_write(0x00);
- palmld_usb2_cmd_write(0x02);
- palmld_usb2_cmd_write(0x00);
- /* Endpoint descr */
- palmld_usb2_cmd_write(07);
- palmld_usb2_cmd_write(05);
- palmld_usb2_cmd_write(0x04);
- palmld_usb2_cmd_write(02);
- palmld_usb2_cmd_write(0x00);
- palmld_usb2_cmd_write(0x02);
- palmld_usb2_cmd_write(0x00);
- /* Endpoint descr */
- palmld_usb2_cmd_write(07);
- palmld_usb2_cmd_write(05);
- palmld_usb2_cmd_write(0x86);
- palmld_usb2_cmd_write(02);
- palmld_usb2_cmd_write(0x00);
- palmld_usb2_cmd_write(0x02);
- palmld_usb2_cmd_write(0x00);
- /* Endpoint descr */
- palmld_usb2_cmd_write(07);
- palmld_usb2_cmd_write(05);
- palmld_usb2_cmd_write(0x88);
- palmld_usb2_cmd_write(02);
- palmld_usb2_cmd_write(0x00);
- palmld_usb2_cmd_write(0x02);
- palmld_usb2_cmd_write(0x00);
-
- /* Full Speed Config */
- palmld_usb2_cmd_write(9);
- palmld_usb2_cmd_write(02);
- palmld_usb2_cmd_write(46);
- palmld_usb2_cmd_write(00);
- palmld_usb2_cmd_write(01);
- palmld_usb2_cmd_write(01);
- palmld_usb2_cmd_write(00);
- palmld_usb2_cmd_write(0x0A);
- palmld_usb2_cmd_write(50);
- /* Interface descr */
- palmld_usb2_cmd_write(9);
- palmld_usb2_cmd_write(04);
- palmld_usb2_cmd_write(00);
- palmld_usb2_cmd_write(00);
- palmld_usb2_cmd_write(04);
- palmld_usb2_cmd_write(0xFF);
- palmld_usb2_cmd_write(0x00);
- palmld_usb2_cmd_write(0x00);
- palmld_usb2_cmd_write(00);
- /* Endpoint descr */
- palmld_usb2_cmd_write(07);
- palmld_usb2_cmd_write(05);
- palmld_usb2_cmd_write(0x02);
- palmld_usb2_cmd_write(02);
- palmld_usb2_cmd_write(0x40);
- palmld_usb2_cmd_write(0x00);
- palmld_usb2_cmd_write(0x00);
- /* Endpoint descr */
- palmld_usb2_cmd_write(07);
- palmld_usb2_cmd_write(05);
- palmld_usb2_cmd_write(0x04);
- palmld_usb2_cmd_write(02);
- palmld_usb2_cmd_write(0x40);
- palmld_usb2_cmd_write(0x00);
- palmld_usb2_cmd_write(0x00);
- /* Endpoint descr */
- palmld_usb2_cmd_write(07);
- palmld_usb2_cmd_write(05);
- palmld_usb2_cmd_write(0x86);
- palmld_usb2_cmd_write(02);
- palmld_usb2_cmd_write(0x40);
- palmld_usb2_cmd_write(0x00);
- palmld_usb2_cmd_write(0x00);
- /* Endpoint descr */
- palmld_usb2_cmd_write(07);
- palmld_usb2_cmd_write(05);
- palmld_usb2_cmd_write(0x88);
- palmld_usb2_cmd_write(02);
- palmld_usb2_cmd_write(0x40);
- palmld_usb2_cmd_write(0x00);
- palmld_usb2_cmd_write(0x00);
-
- /* String descr 0 */
- palmld_usb2_cmd_write(04);
- palmld_usb2_cmd_write(03);
- palmld_usb2_cmd_write(0x09);
- palmld_usb2_cmd_write(0x04);
-
- /* String descr 1 */
- palmld_usb2_cmd_write(16);
- palmld_usb2_cmd_write(03);
- palmld_usb2_cmd_write('C');
- palmld_usb2_cmd_write(00);
- palmld_usb2_cmd_write('y');
- palmld_usb2_cmd_write(00);
- palmld_usb2_cmd_write('p');
- palmld_usb2_cmd_write(00);
- palmld_usb2_cmd_write('r');
- palmld_usb2_cmd_write(00);
- palmld_usb2_cmd_write('e');
- palmld_usb2_cmd_write(00);
- palmld_usb2_cmd_write('s');
- palmld_usb2_cmd_write(00);
- palmld_usb2_cmd_write('s');
- palmld_usb2_cmd_write(00);
-
- /* String descr 1 */
- palmld_usb2_cmd_write(20);
- palmld_usb2_cmd_write(3);
- palmld_usb2_cmd_write('C');
- palmld_usb2_cmd_write(00);
- palmld_usb2_cmd_write('Y');
- palmld_usb2_cmd_write(00);
- palmld_usb2_cmd_write('7');
- palmld_usb2_cmd_write(00);
- palmld_usb2_cmd_write('C');
- palmld_usb2_cmd_write(00);
- palmld_usb2_cmd_write('6');
- palmld_usb2_cmd_write(00);
- palmld_usb2_cmd_write('8');
- palmld_usb2_cmd_write(00);
- palmld_usb2_cmd_write('0');
- palmld_usb2_cmd_write(00);
- palmld_usb2_cmd_write('0');
- palmld_usb2_cmd_write(00);
- palmld_usb2_cmd_write('1');
- palmld_usb2_cmd_write(00);
-
-
- /* A LOT OF DEBUGING CRAP */
-/* printk("GPIO106 %i\n",(GET_GPIO(106)?1:0));
- printk("GPIO106 %i\n",(GET_GPIO(106)?1:0));
- printk("GPIO106 %i\n",(GET_GPIO(106)?1:0));
- printk("GPIO106 %i\n",(GET_GPIO(106)?1:0));
- printk("GPIO106 %i\n",(GET_GPIO(106)?1:0));
- printk("GPIO106 %i\n",(GET_GPIO(106)?1:0));
- printk("GPIO106 %i\n",(GET_GPIO(106)?1:0));
- printk("GPIO106 %i\n",(GET_GPIO(106)?1:0));
- printk("GPIO106 %i\n",(GET_GPIO(106)?1:0));
- printk("GPIO106 %i\n",(GET_GPIO(106)?1:0));
- printk("GPIO106 %i\n",(GET_GPIO(106)?1:0));
-*/
-
- for (;;) {
- /* printk("%02x%02x|%02x%02x|%02x%02x|%02x%02x|%i|%i|%i|%i|%i|%i\n",
- PALMLD_USB2_ADDR_FIFO2,PALMLD_USB2_ADDR_FIFO4,
- PALMLD_USB2_ADDR_FIFO6,PALMLD_USB2_ADDR_FIFO8,
- PALMLD_USB2_ADDR_CMD,PALMLD_USB2_ADDR_RESERVED1,
- PALMLD_USB2_ADDR_RESERVED2,PALMLD_USB2_ADDR_RESERVED3,
- (GET_GPIO(18)?1:0),(GET_GPIO(20)?1:0),
- (GET_GPIO(53)?1:0),(GET_GPIO(86)?1:0),
- (GET_GPIO(90)?1:0),(GET_GPIO(106)?1:0));
- */}
-
- return 0;
-}
-
-static int __init palmld_usb2_init(void)
-{
- printk ("sx2_init()\n");
-
- if(!machine_is_xscale_palmld()) return -ENODEV;
-
- palmld_usb2_test_cmd();
-
- return -ENODEV;
-}
-
-static void __exit palmld_usb2_exit(void)
-{
-}
-
-module_init(palmld_usb2_init);
-module_exit(palmld_usb2_exit);
-
-MODULE_AUTHOR ("Marek Vasut <mar...@gm...>");
-MODULE_DESCRIPTION ("USB2 driver for Palm LifeDrive");
-MODULE_LICENSE ("GPL");
Modified: linux4palm/linux/trunk/drivers/usb/gadget/Kconfig
===================================================================
--- linux4palm/linux/trunk/drivers/usb/gadget/Kconfig 2007-04-06 22:44:13 UTC (rev 952)
+++ linux4palm/linux/trunk/drivers/usb/gadget/Kconfig 2007-04-09 10:54:38 UTC (rev 953)
@@ -148,6 +148,19 @@
depends on USB_GADGET_PXA27X
default n
+config USB_GADGET_SX2
+ boolean "Cypress EZUSB SX2"
+ depends on ARCH_PXA
+ help
+ Cypress EZUSB SX2 driver
+
+config USB_SX2
+ tristate
+ depends on USB_GADGET_SX2
+ default USB_GADGET
+ select USB_GADGET_SELECTED
+
+
config USB_GADGET_GOKU
boolean "Toshiba TC86C001 'Goku-S'"
depends on PCI
Modified: linux4palm/linux/trunk/drivers/usb/gadget/Makefile
===================================================================
--- linux4palm/linux/trunk/drivers/usb/gadget/Makefile 2007-04-06 22:44:13 UTC (rev 952)
+++ linux4palm/linux/trunk/drivers/usb/gadget/Makefile 2007-04-09 10:54:38 UTC (rev 953)
@@ -4,6 +4,7 @@
obj-$(CONFIG_USB_DUMMY_HCD) += dummy_hcd.o
obj-$(CONFIG_USB_NET2280) += net2280.o
obj-$(CONFIG_USB_PXA2XX) += pxa2xx_udc.o
+obj-$(CONFIG_USB_SX2) += sx2_udc.o
obj-$(CONFIG_USB_GOKU) += goku_udc.o
obj-$(CONFIG_USB_OMAP) += omap_udc.o
obj-$(CONFIG_USB_LH7A40X) += lh7a40x_udc.o
Added: linux4palm/linux/trunk/drivers/usb/gadget/sx2_udc.c
===================================================================
--- linux4palm/linux/trunk/drivers/usb/gadget/sx2_udc.c (rev 0)
+++ linux4palm/linux/trunk/drivers/usb/gadget/sx2_udc.c 2007-04-09 10:54:38 UTC (rev 953)
@@ -0,0 +1,434 @@
+/*
+ * linux/drivers/usb/gadget/sx2_udc.c
+ * Cypress EZUSB SX2 high speed USB device controller
+ *
+ * Copyright (C) 2007 Marek Vasut
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/ioport.h>
+#include <linux/types.h>
+#include <linux/version.h>
+#include <linux/errno.h>
+#include <linux/delay.h>
+#include <linux/sched.h>
+#include <linux/slab.h>
+#include <linux/init.h>
+#include <linux/timer.h>
+#include <linux/list.h>
+#include <linux/interrupt.h>
+#include <linux/proc_fs.h>
+#include <linux/mm.h>
+#include <linux/platform_device.h>
+#include <linux/dma-mapping.h>
+
+#include <asm/byteorder.h>
+#include <asm/dma.h>
+#include <asm/io.h>
+#include <asm/irq.h>
+#include <asm/system.h>
+#include <asm/mach-types.h>
+#include <asm/unaligned.h>
+#include <asm/hardware.h>
+
+#include <asm/arch/gpio.h>
+
+#include <linux/usb_ch9.h>
+#include <linux/usb_gadget.h>
+
+#include <asm/arch/sx2.h>
+#include <asm/arch/palmld-gpio.h>
+
+#include "sx2_udc.h"
+
+struct sx2_udc_mach_info sx2_mach;
+
+/*
+ TESTING STUFF
+ */
+int sx2_cmd_set_reg(int reg);
+int sx2_cmd_write(u8 data);
+
+int sx2_enum(void)
+{
+printk("sx2_mach: %08x\n",sx2_mach.virt_base);
+ssleep(10);
+ /* ENUMERATE WITH BUILTIN DESCRIPTOR */
+ /* select register 0x30 - descriptor RAM*/
+ sx2_cmd_set_reg(0x30);
+ /* write descriptor length */
+ sx2_cmd_write(0xa0);
+ sx2_cmd_write(0x00);
+
+ /* write descriptor as described in SX2 docs */
+ /* Device Descriptor */
+ sx2_cmd_write(18);
+ sx2_cmd_write(01);
+ sx2_cmd_write(00);
+ sx2_cmd_write(02);
+ sx2_cmd_write(00);
+ sx2_cmd_write(00);
+ sx2_cmd_write(00);
+ sx2_cmd_write(64);
+ sx2_cmd_write(0x25);
+ sx2_cmd_write(0x05);
+ sx2_cmd_write(0xab);
+ sx2_cmd_write(0xcd);
+ sx2_cmd_write(0x12);
+ sx2_cmd_write(0x34);
+ sx2_cmd_write(01);
+ sx2_cmd_write(02);
+ sx2_cmd_write(00);
+ sx2_cmd_write(01);
+ /* Device qualifier */
+ sx2_cmd_write(10);
+ sx2_cmd_write(06);
+ sx2_cmd_write(00);
+ sx2_cmd_write(02);
+ sx2_cmd_write(00);
+ sx2_cmd_write(00);
+ sx2_cmd_write(00);
+ sx2_cmd_write(64);
+ sx2_cmd_write(01);
+ sx2_cmd_write(00);
+
+ /* High Speed Config */
+ sx2_cmd_write(9);
+ sx2_cmd_write(02);
+ sx2_cmd_write(46);
+ sx2_cmd_write(00);
+ sx2_cmd_write(01);
+ sx2_cmd_write(01);
+ sx2_cmd_write(00);
+ sx2_cmd_write(0x0A);
+ sx2_cmd_write(50);
+ /* Interface descr */
+ sx2_cmd_write(9);
+ sx2_cmd_write(04);
+ sx2_cmd_write(00);
+ sx2_cmd_write(00);
+ sx2_cmd_write(04);
+ sx2_cmd_write(0xFF);
+ sx2_cmd_write(0x00);
+ sx2_cmd_write(0x00);
+ sx2_cmd_write(00);
+ /* Endpoint descr */
+ sx2_cmd_write(07);
+ sx2_cmd_write(05);
+ sx2_cmd_write(0x02);
+ sx2_cmd_write(02);
+ sx2_cmd_write(0x00);
+ sx2_cmd_write(0x02);
+ sx2_cmd_write(0x00);
+ /* Endpoint descr */
+ sx2_cmd_write(07);
+ sx2_cmd_write(05);
+ sx2_cmd_write(0x04);
+ sx2_cmd_write(02);
+ sx2_cmd_write(0x00);
+ sx2_cmd_write(0x02);
+ sx2_cmd_write(0x00);
+ /* Endpoint descr */
+ sx2_cmd_write(07);
+ sx2_cmd_write(05);
+ sx2_cmd_write(0x86);
+ sx2_cmd_write(02);
+ sx2_cmd_write(0x00);
+ sx2_cmd_write(0x02);
+ sx2_cmd_write(0x00);
+ /* Endpoint descr */
+ sx2_cmd_write(07);
+ sx2_cmd_write(05);
+ sx2_cmd_write(0x88);
+ sx2_cmd_write(02);
+ sx2_cmd_write(0x00);
+ sx2_cmd_write(0x02);
+ sx2_cmd_write(0x00);
+
+ /* Full Speed Config */
+ sx2_cmd_write(9);
+ sx2_cmd_write(02);
+ sx2_cmd_write(46);
+ sx2_cmd_write(00);
+ sx2_cmd_write(01);
+ sx2_cmd_write(01);
+ sx2_cmd_write(00);
+ sx2_cmd_write(0x0A);
+ sx2_cmd_write(50);
+ /* Interface descr */
+ sx2_cmd_write(9);
+ sx2_cmd_write(04);
+ sx2_cmd_write(00);
+ sx2_cmd_write(00);
+ sx2_cmd_write(04);
+ sx2_cmd_write(0xFF);
+ sx2_cmd_write(0x00);
+ sx2_cmd_write(0x00);
+ sx2_cmd_write(00);
+ /* Endpoint descr */
+ sx2_cmd_write(07);
+ sx2_cmd_write(05);
+ sx2_cmd_write(0x02);
+ sx2_cmd_write(02);
+ sx2_cmd_write(0x40);
+ sx2_cmd_write(0x00);
+ sx2_cmd_write(0x00);
+ /* Endpoint descr */
+ sx2_cmd_write(07);
+ sx2_cmd_write(05);
+ sx2_cmd_write(0x04);
+ sx2_cmd_write(02);
+ sx2_cmd_write(0x40);
+ sx2_cmd_write(0x00);
+ sx2_cmd_write(0x00);
+ /* Endpoint descr */
+ sx2_cmd_write(07);
+ sx2_cmd_write(05);
+ sx2_cmd_write(0x86);
+ sx2_cmd_write(02);
+ sx2_cmd_write(0x40);
+ sx2_cmd_write(0x00);
+ sx2_cmd_write(0x00);
+ /* Endpoint descr */
+ sx2_cmd_write(07);
+ sx2_cmd_write(05);
+ sx2_cmd_write(0x88);
+ sx2_cmd_write(02);
+ sx2_cmd_write(0x40);
+ sx2_cmd_write(0x00);
+ sx2_cmd_write(0x00);
+
+ /* String descr 0 */
+ sx2_cmd_write(04);
+ sx2_cmd_write(03);
+ sx2_cmd_write(0x09);
+ sx2_cmd_write(0x04);
+
+ /* String descr 1 */
+ sx2_cmd_write(16);
+ sx2_cmd_write(03);
+ sx2_cmd_write('C');
+ sx2_cmd_write(00);
+ sx2_cmd_write('y');
+ sx2_cmd_write(00);
+ sx2_cmd_write('p');
+ sx2_cmd_write(00);
+ sx2_cmd_write('r');
+ sx2_cmd_write(00);
+ sx2_cmd_write('e');
+ sx2_cmd_write(00);
+ sx2_cmd_write('s');
+ sx2_cmd_write(00);
+ sx2_cmd_write('s');
+ sx2_cmd_write(00);
+
+ /* String descr 2 */
+ sx2_cmd_write(20);
+ sx2_cmd_write(03);
+ sx2_cmd_write('C');
+ sx2_cmd_write(00);
+ sx2_cmd_write('Y');
+ sx2_cmd_write(00);
+ sx2_cmd_write('7');
+ sx2_cmd_write(00);
+ sx2_cmd_write('C');
+ sx2_cmd_write(00);
+ sx2_cmd_write('6');
+ sx2_cmd_write(00);
+ sx2_cmd_write('8');
+ sx2_cmd_write(00);
+ sx2_cmd_write('0');
+ sx2_cmd_write(00);
+ sx2_cmd_write('0');
+ sx2_cmd_write(00);
+ sx2_cmd_write('1');
+ sx2_cmd_write(00);
+ return 0;
+}
+
+u16 sx2_cmd_read(int reg)
+{
+ u8 data = SX2_CMD_ADDR | SX2_CMD_READ
+ | (reg & SX2_ADDR_MASK);
+
+ printk("READING 0x%02x\n",reg);
+ SX2_ADDR_CMD=data;
+// while((gpio_get_value(sx2_udc.mach->ready_pin)?1:0)==0) {
+ while((GET_PALMLD_GPIO(USB_READY)?1:0)==0) {
+ printk("WAITING FOR IRQ\n");
+ };
+ printk("REG 0x%02x F2 0x%02x F4 0x%02x\n",reg,SX2_ADDR_FIFO2,SX2_ADDR_FIFO4);
+ printk("REG 0x%02x F2 0x%02x F4 0x%02x\n",reg,SX2_ADDR_FIFO6,SX2_ADDR_FIFO8);
+ printk("REG 0x%02x CD 0x%02x\n",reg,SX2_ADDR_CMD);
+ return 0;
+}
+
+int sx2_cmd_set_reg(int reg)
+{
+ /* initiate write to addr */
+ printk("SETTING 0x%02x\n",(reg | SX2_CMD_ADDR));
+ SX2_ADDR_CMD=(reg | SX2_CMD_ADDR);
+ /* wait for READY line */
+// while((gpio_get_value(sx2_udc.mach->ready_pin)?1:0)==0) {
+ while((GET_PALMLD_GPIO(USB_READY)?1:0)==0) {
+ printk("WAITING FOR IRQ\n");
+ };
+
+ return 0;
+}
+
+int sx2_cmd_write(u8 data)
+{
+ /* prepare data */
+ u8 data1 = ((data & 0xf0)>>4); /* Upper nibble */
+ u8 data2 = (data & 0x0f); /* Lower nibble */
+
+ /* initiate write to reg */
+ printk("UPPER NIBBLE %02x\n",(data1 | SX2_CMD_WRITE));
+ SX2_ADDR_CMD=(data1 | SX2_CMD_WRITE);
+ /* wait for READY line */
+// while((gpio_get_value(sx2_udc.mach->ready_pin)?1:0)==0) {
+ while((GET_PALMLD_GPIO(USB_READY)?1:0)==0) {
+ printk("WAITING FOR IRQ\n");
+ };
+
+ printk("LOWER NIBBLE %02x\n",(data2 | SX2_CMD_WRITE));
+ SX2_ADDR_CMD=(data2 | SX2_CMD_WRITE);
+ /* wait for READY line */
+// while((gpio_get_value(sx2_udc.mach->ready_pin)?1:0)==0) {
+ while((GET_PALMLD_GPIO(USB_READY)?1:0)==0) {
+ printk("WAITING FOR IRQ\n");
+ };
+
+ return 0;
+}
+
+
+
+
+
+/*
+ GADGET LEVEL HANDLING STUFF
+ */
+
+static const char driver_name [] = "sx2_udc";
+
+int usb_gadget_register_driver(struct usb_gadget_driver *driver)
+{
+printk("SX2: usb_gadget_register_driver\n");
+return 0;
+}
+EXPORT_SYMBOL(usb_gadget_register_driver);
+
+int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
+{
+printk("SX2: usb_gadget_unregister_driver\n");
+return 0;
+}
+EXPORT_SYMBOL(usb_gadget_unregister_driver);
+
+
+
+
+
+
+
+
+
+/*
+ HARDWARE LEVEL HANDLING STUFF
+ */
+static int sx2_udc_probe(struct platform_device *pdev)
+{
+ static struct sx2_dev *usb;
+/*
+INIT THE CONTROLLER - POWER UP ETC
+*/
+ /* FIXME - this cant be static :-E */
+ if(!request_mem_region(SX2_ADDR_BASE, 0x10000, "sx2-udc"))
+ return -EBUSY;
+
+ usb = kmalloc(sizeof(struct sx2_dev), GFP_KERNEL);
+ if(!usb)
+ return -ENOMEM;
+
+ memset(usb, 0,sizeof(struct sx2_dev));
+ platform_set_drvdata(pdev, usb);
+
+ usb->dev = &(pdev->dev);
+ usb->mach = pdev->dev.platform_data;
+ sx2_mach = *(usb->mach);
+
+/* Now power down and up the chip */
+ gpio_set_value(usb->mach->power_pin,0);
+ udelay(100);
+ gpio_set_value(usb->mach->power_pin,1);
+ udelay(500);
+ sx2_enum();
+ printk("SX2: sx2_udc_probe DONE\n");
+ return 0;
+}
+
+static int sx2_udc_remove(struct platform_device *pdev)
+{
+ platform_set_drvdata(pdev, 0);
+
+printk("SX2: sx2_udc_remove\n");
+ return 0;
+}
+
+/*-------------------------------------------------------------------------*/
+
+static struct platform_driver udc_driver = {
+ .probe = sx2_udc_probe,
+ .remove = __exit_p(sx2_udc_remove),
+ .suspend = NULL,
+ .resume = NULL,
+ .driver = {
+ .owner = THIS_MODULE,
+ .name = "sx2-udc",
+ },
+};
+
+static int __init udc_init(void)
+{
+ return platform_driver_register(&udc_driver);
+}
+module_init(udc_init);
+
+static void __exit udc_exit(void)
+{
+ platform_driver_unregister(&udc_driver);
+}
+module_exit(udc_exit);
+
+MODULE_DESCRIPTION("Cypress EZUSB SX2 Peripheral Controller");
+MODULE_AUTHOR("Marek Vasut");
+MODULE_LICENSE("GPL");
+
+
+
+
+
+
+
+
+
+
+
Added: linux4palm/linux/trunk/drivers/usb/gadget/sx2_udc.h
===================================================================
--- linux4palm/linux/trunk/drivers/usb/gadget/sx2_udc.h (rev 0)
+++ linux4palm/linux/trunk/drivers/usb/gadget/sx2_udc.h 2007-04-09 10:54:38 UTC (rev 953)
@@ -0,0 +1,170 @@
+/*
+ * sx2_udc.h
+ *
+ * Cypress EZUSB SX2 - CY7C68001 External master register definitions
+ *
+ * Author: Marek Vasut <mar...@gm...>
+ *
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ *
+ *
+ */
+#ifndef _INCLUDE_SX2_UDC_H_
+
+#define _INCLUDE_SX2_UDC_H_
+
+/***************************************************
+ * SX2 REGISTERS *
+ ***************************************************/
+
+/* General configuration */
+#define SX2_REG_IFCONFIG 0x01
+#define SX2_REG_FLAGSAB 0x02
+#define SX2_REG_FLAGSCD 0x03
+#define SX2_REG_POLAR 0x04
+#define SX2_REG_REVID 0x05
+
+/* Endpoint configuration */
+#define SX2_REG_EP2CFG 0x06
+#define SX2_REG_EP4CFG 0x07
+#define SX2_REG_EP6CFG 0x08
+#define SX2_REG_EP8CFG 0x09
+#define SX2_REG_EP2PKTLENH 0x0A
+#define SX2_REG_EP2PKTLENL 0x0B
+#define SX2_REG_EP4PKTLENH 0x0C
+#define SX2_REG_EP4PKTLENL 0x0D
+#define SX2_REG_EP6PKTLENH 0x0E
+#define SX2_REG_EP6PKTLENL 0x0F
+#define SX2_REG_EP8PKTLENH 0x10
+#define SX2_REG_EP8PKTLENL 0x11
+#define SX2_REG_EP2PFH 0x12
+#define SX2_REG_EP2PFL 0x13
+#define SX2_REG_EP4PFH 0x14
+#define SX2_REG_EP4PFL 0x15
+#define SX2_REG_EP6PFH 0x16
+#define SX2_REG_EP6PFL 0x17
+#define SX2_REG_EP8PFH 0x18
+#define SX2_REG_EP8PFL 0x19
+#define SX2_REG_EP2ISOINPKTS 0x1A
+#define SX2_REG_EP4ISOINPKTS 0x1B
+#define SX2_REG_EP6ISOINPKTS 0x1C
+#define SX2_REG_EP8ISOINPKTS 0x1D
+
+/* Flags */
+#define SX2_REG_EP24FLAGS 0x1E
+#define SX2_REG_EP68FLAGS 0x1F
+
+/* INPKTEND/FLUSH */
+#define SX2_REG_INPKTEND 0x20
+#define SX2_REG_FLUSH 0x20
+
+/* USB Configuration */
+#define SX2_REG_USBFRAMEH 0x2A
+#define SX2_REG_USBFRAMEL 0x2B
+#define SX2_REG_MICROFRAME 0x2C
+#define SX2_REG_FNADDR 0x2D
+
+/* Interrupts */
+#define SX2_REG_INTENABLE 0x2E
+
+/* Descriptor */
+#define SX2_REG_DESC 0x30
+
+/* Endpoint 0 */
+#define SX2_REG_EP0BUF 0x31
+#define SX2_REG_SETUP 0x32
+#define SX2_REG_EP0BC 0x33
+
+/* Un-indexed Register control */
+#define SX2_REG_UIRC0 0x3A
+#define SX2_REG_UIRC1 0x3B
+#define SX2_REG_UIRC2 0x3C
+
+/* Un-indexed Registers in XDATA space */
+#define SX2_REG_FIFOPINPOLAR 0xE609
+#define SX2_REG_TOGCTL 0xE683
+#define SX2_REG_CT1 0xE6FB
+
+/***************************************************
+ * SX2 ADDRESS *
+ ***************************************************/
+#define SX2_ADDR_BASE 0xf0000000
+
+#define SX2_ADDR_IF(x) (*((volatile u8 *)x))
+
+/* We have 16bit bus of the chip connected to 32 bit bus of CPU */
+
+#define SX2_ADDR_FIFO2 SX2_ADDR_IF (SX2_ADDR_BASE + 0x00)
+#define SX2_ADDR_FIFO4 SX2_ADDR_IF (SX2_ADDR_BASE + 0x01)
+#define SX2_ADDR_FIFO6 SX2_ADDR_IF (SX2_ADDR_BASE + 0x04)
+#define SX2_ADDR_FIFO8 SX2_ADDR_IF (SX2_ADDR_BASE + 0x05)
+#define SX2_ADDR_CMD SX2_ADDR_IF (SX2_ADDR_BASE + 0x08)
+#define SX2_ADDR_RESERVED1 SX2_ADDR_IF (SX2_ADDR_BASE + 0x09)
+#define SX2_ADDR_RESERVED2 SX2_ADDR_IF (SX2_ADDR_BASE + 0x0C)
+#define SX2_ADDR_RESERVED3 SX2_ADDR_IF (SX2_ADDR_BASE + 0x0D)
+
+/***************************************************
+ * SX2 COMMANDS *
+ ***************************************************/
+
+#define SX2_CMD_WRITE (0x00)
+#define SX2_CMD_READ (0x40)
+#define SX2_CMD_ADDR (0x80)
+
+/***************************************************
+ * SX2 MISC *
+ ***************************************************/
+
+#define SX2_ADDR_MASK (0x3f)
+
+struct sx2_dev {
+ struct device *dev;
+ struct sx2_udc_mach_info *mach;
+ spinlock_t lock;
+ /*
+ * EP0 write thread.
+ */
+ void (*wrint)(struct sx2_dev *);
+ struct usb_buf *wrbuf;
+ unsigned char *wrptr;
+ unsigned int wrlen;
+
+ /*
+ * EP0 statistics.
+ */
+ unsigned long ep0_wr_fifo_errs;
+ unsigned long ep0_wr_bytes;
+ unsigned long ep0_wr_packets;
+ unsigned long ep0_rd_fifo_errs;
+ unsigned long ep0_rd_bytes;
+ unsigned long ep0_rd_packets;
+ unsigned long ep0_stall_sent;
+ unsigned long ep0_early_irqs;
+
+ /*
+ * EP1 .. n
+ */
+ struct {
+ unsigned int buflen;
+ void *pktcpu;
+ unsigned int pktlen;
+ unsigned int pktrem;
+
+ void *cb_data;
+ void (*cb_func)(void *data, int flag, int size);
+
+ u32 udccs;
+ unsigned int maxpktsize;
+ unsigned int configured;
+ unsigned int host_halt;
+ unsigned long fifo_errs;
+ unsigned long bytes;
+ unsigned long packets;
+ } ep[4];
+};
+
+#endif
Deleted: linux4palm/linux/trunk/include/asm-arm/arch-pxa/palmld-usb2.h
===================================================================
--- linux4palm/linux/trunk/include/asm-arm/arch-pxa/palmld-usb2.h 2007-04-06 22:44:13 UTC (rev 952)
+++ linux4palm/linux/trunk/include/asm-arm/arch-pxa/palmld-usb2.h 2007-04-09 10:54:38 UTC (rev 953)
@@ -1,127 +0,0 @@
-/*
- * palmld-usb2.h
- *
- * Cypress EZUSB SX2 - CY7C68001 External master register definitions
- * SX2 is an USB2 controller in PalmOne LifeDrive Handheld Computer
- *
- * Author: Marek Vasut <mar...@gm...>
- *
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- *
- *
- */
-#ifndef _INCLUDE_PALMLD_USB2_H_
-
-#define _INCLUDE_PALMLD_USB2_H_
-
-#include <asm/arch/palmld-gpio.h>
-
-/***************************************************
- * SX2 REGISTERS *
- ***************************************************/
-
-/* General configuration */
-#define PALMLD_USB2_REG_IFCONFIG 0x01
-#define PALMLD_USB2_REG_FLAGSAB 0x02
-#define PALMLD_USB2_REG_FLAGSCD 0x03
-#define PALMLD_USB2_REG_POLAR 0x04
-#define PALMLD_USB2_REG_REVID 0x05
-
-/* Endpoint configuration */
-#define PALMLD_USB2_REG_EP2CFG 0x06
-#define PALMLD_USB2_REG_EP4CFG 0x07
-#define PALMLD_USB2_REG_EP6CFG 0x08
-#define PALMLD_USB2_REG_EP8CFG 0x09
-#define PALMLD_USB2_REG_EP2PKTLENH 0x0A
-#define PALMLD_USB2_REG_EP2PKTLENL 0x0B
-#define PALMLD_USB2_REG_EP4PKTLENH 0x0C
-#define PALMLD_USB2_REG_EP4PKTLENL 0x0D
-#define PALMLD_USB2_REG_EP6PKTLENH 0x0E
-#define PALMLD_USB2_REG_EP6PKTLENL 0x0F
-#define PALMLD_USB2_REG_EP8PKTLENH 0x10
-#define PALMLD_USB2_REG_EP8PKTLENL 0x11
-#define PALMLD_USB2_REG_EP2PFH 0x12
-#define PALMLD_USB2_REG_EP2PFL 0x13
-#define PALMLD_USB2_REG_EP4PFH 0x14
-#define PALMLD_USB2_REG_EP4PFL 0x15
-#define PALMLD_USB2_REG_EP6PFH 0x16
-#define PALMLD_USB2_REG_EP6PFL 0x17
-#define PALMLD_USB2_REG_EP8PFH 0x18
-#define PALMLD_USB2_REG_EP8PFL 0x19
-#define PALMLD_USB2_REG_EP2ISOINPKTS 0x1A
-#define PALMLD_USB2_REG_EP4ISOINPKTS 0x1B
-#define PALMLD_USB2_REG_EP6ISOINPKTS 0x1C
-#define PALMLD_USB2_REG_EP8ISOINPKTS 0x1D
-
-/* Flags */
-#define PALMLD_USB2_REG_EP24FLAGS 0x1E
-#define PALMLD_USB2_REG_EP68FLAGS 0x1F
-
-/* INPKTEND/FLUSH */
-#define PALMLD_USB2_REG_INPKTEND 0x20
-#define PALMLD_USB2_REG_FLUSH 0x20
-
-/* USB Configuration */
-#define PALMLD_USB2_REG_USBFRAMEH 0x2A
-#define PALMLD_USB2_REG_USBFRAMEL 0x2B
-#define PALMLD_USB2_REG_MICROFRAME 0x2C
-#define PALMLD_USB2_REG_FNADDR 0x2D
-
-/* Interrupts */
-#define PALMLD_USB2_REG_INTENABLE 0x2E
-
-/* Descriptor */
-#define PALMLD_USB2_REG_DESC 0x30
-
-/* Endpoint 0 */
-#define PALMLD_USB2_REG_EP0BUF 0x31
-#define PALMLD_USB2_REG_SETUP 0x32
-#define PALMLD_USB2_REG_EP0BC 0x33
-
-/* Un-indexed Register control */
-#define PALMLD_USB2_REG_UIRC0 0x3A
-#define PALMLD_USB2_REG_UIRC1 0x3B
-#define PALMLD_USB2_REG_UIRC2 0x3C
-
-/* Un-indexed Registers in XDATA space */
-#define PALMLD_USB2_REG_FIFOPINPOLAR 0xE609
-#define PALMLD_USB2_REG_TOGCTL 0xE683
-
-/***************************************************
- * SX2 ADDRESS *
- ***************************************************/
-
-#define PALMLD_USB2_ADDR_BASE PALMLD_USB_VIRT
-
-#define PALMLD_USB2_ADDR_IF(x) (*((volatile u8 *)x))
-
-/* We have 16bit bus of the chip connected to 32 bit bus of CPU */
-
-#define PALMLD_USB2_ADDR_FIFO2 PALMLD_USB2_ADDR_IF (PALMLD_USB2_ADDR_BASE + 0x0)
-#define PALMLD_USB2_ADDR_FIFO4 PALMLD_USB2_ADDR_IF (PALMLD_USB2_ADDR_BASE + 0x1)
-#define PALMLD_USB2_ADDR_FIFO6 PALMLD_USB2_ADDR_IF (PALMLD_USB2_ADDR_BASE + 0x4)
-#define PALMLD_USB2_ADDR_FIFO8 PALMLD_USB2_ADDR_IF (PALMLD_USB2_ADDR_BASE + 0x5)
-#define PALMLD_USB2_ADDR_CMD PALMLD_USB2_ADDR_IF (PALMLD_USB2_ADDR_BASE + 0x8)
-#define PALMLD_USB2_ADDR_RESERVED1 PALMLD_USB2_ADDR_IF (PALMLD_USB2_ADDR_BASE + 0x9)
-#define PALMLD_USB2_ADDR_RESERVED2 PALMLD_USB2_ADDR_IF (PALMLD_USB2_ADDR_BASE + 0xc)
-#define PALMLD_USB2_ADDR_RESERVED3 PALMLD_USB2_ADDR_IF (PALMLD_USB2_ADDR_BASE + 0xd)
-
-/***************************************************
- * SX2 COMMANDS *
- ***************************************************/
-
-#define PALMLD_USB2_CMD_WRITE (0x00)
-#define PALMLD_USB2_CMD_READ (0x40)
-#define PALMLD_USB2_CMD_ADDR (0x80)
-
-/***************************************************
- * SX2 MISC *
- ***************************************************/
-
-#define PALMLD_USB2_ADDR_MASK (0x3f)
-
-#endif
Added: linux4palm/linux/trunk/include/asm-arm/arch-pxa/sx2.h
===================================================================
--- linux4palm/linux/trunk/include/asm-arm/arch-pxa/sx2.h (rev 0)
+++ linux4palm/linux/trunk/include/asm-arm/arch-pxa/sx2.h 2007-04-09 10:54:38 UTC (rev 953)
@@ -0,0 +1,21 @@
+/*
+ * linux/include/asm-arm/arch-pxa/sx2.h
+ *
+ * This supports machine-specific differences in how the Cypress SX2
+ * USB Device Controller (UDC) is wired.
+ *
+ */
+
+struct sx2_udc_mach_info {
+ u32 virt_base;
+
+ int ready_pin;
+ int int_pin;
+ int reset_pin;
+ int power_pin;
+
+ int sloe_pin;
+ int slrd_pin;
+ int slwr_pin;
+};
+
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|