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. |