⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usb-ohci-omap1510.c

📁 linux2.4.20下的针对三星公司的s3c2410的usb模块驱动代码
💻 C
📖 第 1 页 / 共 2 页
字号:
	    (unsigned short *) 0xfffec238;	int tlb;	unsigned long lbaddr, physaddr;#endif	int ret;#ifndef CONFIG_ARCH_OMAP1610	/*	 * Request memory resources.	 *///      if (!request_mem_region(_USB_OHCI_OP_BASE, _USB_EXTENT, "usb-ohci"))//              return -EBUSY;#define APLL_CTRL_REG_APLL_NDPLL_SWITCH		0x0001#define DPLL_CTRL_REG_PLL_ENABLE		0x0010#define DPLL_CTRL_REG_LOCK			0x0001#define SOFT_REQ_REG_DPLL_REQ			0x0001#define CLOCK_CTRL_REG_USB_MCLK_EN		0x0010#define MOD_CONF_CTRL_0_USB_HOST_HHC_UHOST_EN	0x00000200	*apll_ctrl_reg &= ~APLL_CTRL_REG_APLL_NDPLL_SWITCH;	*dpll_ctrl_reg |= DPLL_CTRL_REG_PLL_ENABLE;	*soft_req_reg |= SOFT_REQ_REG_DPLL_REQ;	while (!(*dpll_ctrl_reg & DPLL_CTRL_REG_LOCK)) ;	*clock_ctrl_reg |= CLOCK_CTRL_REG_USB_MCLK_EN;	*ARM_IDLECT2 |= (1 << EN_LBFREECK) | (1 << EN_LBCK);	*mod_conf_ctrl_0 |= MOD_CONF_CTRL_0_USB_HOST_HHC_UHOST_EN;#ifdef CONFIG_OMAP_INNOVATOR	*fpga_usb_host_ctrl |= 0x20;#endif	*lb_clock_div = (*lb_clock_div & 0xfffffff8) | 0x4;	*lb_mmu_cntl_reg = 0x3;	udelay(200);	for (tlb = 0; tlb < 32; tlb++) {		lbaddr = tlb * 0x00100000 + OMAP1510_LB_OFFSET;		physaddr = tlb * 0x00100000 + PHYS_OFFSET;		*lb_mmu_cam_h_reg = (lbaddr & 0x0fffffff) >> 22;		*lb_mmu_cam_l_reg = ((lbaddr & 0x003ffc00) >> 6) | 0xc;		*lb_mmu_ram_h_reg = physaddr >> 16;		*lb_mmu_ram_l_reg = (physaddr & 0x0000fc00) | 0x300;		*lb_mmu_lock_reg = tlb << 4;		*lb_mmu_ld_tlb_reg = 0x1;	}	*lb_mmu_cntl_reg = 0x7;	udelay(200);#else#define MOD_CONF_CTRL_0_USB_HOST_HHC_UHOST_EN	0x00000200/*set up pinout*//*USB pin group 1 configuration*/#if 1	OMAP1610_SET_FUNC_MUX_CTRL(1, FUNC_MUX_CTRL_9, 24);	/*USB1.TXD W14 */	open_drain(4, PULL_DWN_CTRL_2);	OMAP1610_SET_FUNC_MUX_CTRL(2, FUNC_MUX_CTRL_9, 3);	/*USB1.TXEN W16 */	open_drain(29, PULL_DWN_CTRL_1);#ifndef CONFIG_OMAP_H2	OMAP1610_SET_FUNC_MUX_CTRL(2, FUNC_MUX_CTRL_A, 3);	/*USB1.VP AA17 */	open_drain(7, PULL_DWN_CTRL_2);#endif	OMAP1610_SET_FUNC_MUX_CTRL(4, FUNC_MUX_CTRL_9, 0);	/*USB1.SEO W13 */	open_drain(28, PULL_DWN_CTRL_1);	OMAP1610_SET_FUNC_MUX_CTRL(1, FUNC_MUX_CTRL_A, 9);	/*USB1.RCV V15 */	open_drain(9, PULL_DWN_CTRL_2);	//OMAP1610_SET_FUNC_MUX_CTRL(2,FUNC_MUX_CTRL_8,27); /*USB1.SUSP J20*/ /*not used on OMAP1610 INNOVATOR*/	//open_drain(27,PULL_DWN_CTRL_1);#ifndef CONFIG_OMAP_H2	OMAP1610_SET_FUNC_MUX_CTRL(2, FUNC_MUX_CTRL_A, 6);	/*USB1.VM P14 */	open_drain(8, PULL_DWN_CTRL_2);#endif#ifdef CONFIG_OMAP_H2	OMAP1610_SET_FUNC_MUX_CTRL(5, FUNC_MUX_CTRL_A, 12);	/*USB1.SPEED R13 *//*connected on OMAP1610 H2, not INNOVATOR */	open_drain(10, PULL_DWN_CTRL_2);#endif#endif#ifndef CONFIG_OMAP_H2#if 1	/*USB pin group 2 configuration */	OMAP1610_SET_FUNC_MUX_CTRL(1, FUNC_MUX_CTRL_B, 9);	/*USB2.TXEN W9 */	open_drain(19, PULL_DWN_CTRL_2);	OMAP1610_SET_FUNC_MUX_CTRL(1, FUNC_MUX_CTRL_B, 6);	/*USB2.VP AA9 */	open_drain(18, PULL_DWN_CTRL_2);	OMAP1610_SET_FUNC_MUX_CTRL(1, FUNC_MUX_CTRL_B, 3);	/*USB2.SUSP Y10 */	open_drain(17, PULL_DWN_CTRL_2);	OMAP1610_SET_FUNC_MUX_CTRL(1, FUNC_MUX_CTRL_C, 21);	/*USB2.RCV Y5 */	open_drain(1, PULL_DWN_CTRL_3);	OMAP1610_SET_FUNC_MUX_CTRL(1, FUNC_MUX_CTRL_C, 18);	/*USB2.VM R9 */	open_drain(0, PULL_DWN_CTRL_3);	OMAP1610_SET_FUNC_MUX_CTRL(2, FUNC_MUX_CTRL_C, 27);	/*USB2.TXD V6 */	open_drain(3, PULL_DWN_CTRL_3);	OMAP1610_SET_FUNC_MUX_CTRL(2, FUNC_MUX_CTRL_C, 24);	/*USB2.SE0 W5 */	open_drain(2, PULL_DWN_CTRL_3);	//OMAP1610_SET_FUNC_MUX_CTRL(2,FUNC_MUX_CTRL_B,12); /*USB2.SPEED V9*/ /*not used on OMAP1610 INNOVATOR*/	//open_drain(20,PULL_DWN_CTRL_2);#else	/*USB pin group 2 alternate configuration */	OMAP1610_SET_FUNC_MUX_CTRL(5, FUNC_MUX_CTRL_B, 9);	/*USB0.TXEN W9 */	open_drain(19, PULL_DWN_CTRL_2);	OMAP1610_SET_FUNC_MUX_CTRL(5, FUNC_MUX_CTRL_B, 6);	/*USB0.VP AA9 */	open_drain(18, PULL_DWN_CTRL_2);	OMAP1610_SET_FUNC_MUX_CTRL(5, FUNC_MUX_CTRL_B, 3);	/*USB0.SUSP Y10 */	open_drain(17, PULL_DWN_CTRL_2);	OMAP1610_SET_FUNC_MUX_CTRL(5, FUNC_MUX_CTRL_C, 21);	/*USB0.RCV Y5 */	open_drain(1, PULL_DWN_CTRL_3);	OMAP1610_SET_FUNC_MUX_CTRL(5, FUNC_MUX_CTRL_C, 18);	/*USB0.VM R9 */	open_drain(0, PULL_DWN_CTRL_3);	OMAP1610_SET_FUNC_MUX_CTRL(5, FUNC_MUX_CTRL_C, 27);	/*USB0.TXD V6 */	open_drain(3, PULL_DWN_CTRL_3);	OMAP1610_SET_FUNC_MUX_CTRL(5, FUNC_MUX_CTRL_C, 24);	/*USB0.SE0 W5 */	open_drain(2, PULL_DWN_CTRL_3);	//OMAP1610_SET_FUNC_MUX_CTRL(5,FUNC_MUX_CTRL_B,12); /*USB0.SPEED V9*/ /*not used on OMAP1610 INNOVATOR*/	//open_drain(20,PULL_DWN_CTRL_2);#endif#endif	OMAP1610_CONFIRM_MUX_SETUP();#ifdef CONFIG_OMAP_H2	//USB_TRANSCEIVER_CTRL.7 = 0 (CONF_USB1_UNI_R) //unidirectional vs bidirectional, set to 1 if trx mode 0	outl((inl(USB_TRANSCEIVER_CTRL) & ~(1 << 7)), USB_TRANSCEIVER_CTRL);#else	//USB_TRANSCEIVER_CTRL.7 = 1 (CONF_USB1_UNI_R) //unidirectional vs bidirectional, set to 1 if trx mode 0	//USB_TRANSCEIVER_CTRL.8 = 1 (CONF_USB2_UNI_R) //unidirectional vs bidirectional, set to 1 if trx mode 0	outl((inl(USB_TRANSCEIVER_CTRL) | (1 << 7)), USB_TRANSCEIVER_CTRL);	outl((inl(USB_TRANSCEIVER_CTRL) | (1 << 8)), USB_TRANSCEIVER_CTRL);#endif	/*set up USB Host without OTG function.	   OTG registers still must be configured */	//RESET_CONTROL.0 = 1 (CONF_OCP_RESET_R) //page oct03.448 	//RESET_CONTROL.2 = 1 (CONF_ARMIO_RESET_R)	outl(inl(RESET_CONTROL) | 5, RESET_CONTROL);	//ARM_RSTCT2.0 = 1(PER_EN)	outl(inl(ARM_RSTCT2) | 1, ARM_RSTCT2);	//ARM_IDLECT3.0 = 1 (EN_OCPI_CK)	//ARM_IDLECT3.1 = 0 (IDLOCPI_ARM) //make OCPI idle when MPU is idle	outl(inl(ARM_IDLECT3) | 1, ARM_IDLECT3);	outl(inl(ARM_IDLECT3) & ~(1 << 1), ARM_IDLECT3);	// Enable everything in OCPI. Seems like everything must be enabled	outl(inl(OCPI_PROT) & ~0xff, OCPI_PROT);	outl(inl(OCPI_SEC) & ~0x7f, OCPI_SEC);	//CLOCK_CTRL_REG.5 = 0 (DIS_USB_PVCI_CLK)	//CLOCK_CTRL_REG.4 = 1 (USB_MCLK_EN)	outl((inl(CLOCK_CTRL_REG) & ~(1 << 5)), CLOCK_CTRL_REG);	outl((inl(CLOCK_CTRL_REG) | (1 << 4)), CLOCK_CTRL_REG);	//MOD_CONF_CTRL_0.9 = 1 (CONF_MOD_USB_HOST_HHC_UHOST_EN_R) //enable 48 and 12 MHz clocks	//MOD_CONF_CTRL_0.11 = 0 (CONF_MOD_USB_HOST_UART_SELECT_R) //enable uart on USB port 1	outl((inl(MOD_CONF_CTRL_0) | (1 << 9)), MOD_CONF_CTRL_0);	outl((inl(MOD_CONF_CTRL_0) & ~(1 << 11)), MOD_CONF_CTRL_0);	//SOFT_REQ_REG.8 = 1 (SOFT_USB_OTG_DPLL_REQ)	//SOFT_REQ_REG.4 = x (USB_REQ_EN) //USB Client HW DPLL req	//SOFT_REQ_REG.3 = 1 (SOFT_USB_REQ) 	//SOFT_REQ_REG.0 = 1 (SOFT_DPLL_REQ) //ULPD_PLL clock req	outl((inl(SOFT_REQ_REG) | (1 << 0) | (1 << 3) | (1 << 8)),	     SOFT_REQ_REG);	//SOFT_DISABLE_REQ_REG.6 = 0 (DIS_USB_HOST_DPLL_REQ) //USB Host clock HW	//SOFT_DISABLE_REQ_REG.3 = 0 (DIS_PERIPH_REQ) 	outl((inl(SOFT_DISABLE_REQ_REG) & ~((1 << 6) | (1 << 3))),	     SOFT_DISABLE_REQ_REG);	//? OTG_SYSCON_1.1 = 1 (SOFT_RST)	//? OTG_SYSCON_1.2 == 1 ? (RESET_DONE)	//OTG_SYSCON_1.15 = 0 (OTG_IDLE_EN)	//OTG_SYSCON_1.13 = 0 (DEV_IDLE_EN) //user choice	//OTG_SYSCON_1.1 = 0 (SOFT_RST)	//OTG_SYSCON_1.26-24 = 3(USB2_TRXMODE) //user choice	//OTG_SYSCON_1.22-20 = 3(USB1_TRXMODE) //user choice	//OTG_SYSCON_1.18-16 = x (USB0_TRXMODE) //user choice#ifdef CONFIG_OMAP_H2	outl((2 << 20), OTG_SYSCON_1);#else	outl((inl(OTG_SYSCON_1) & (7 << 16)), OTG_SYSCON_1);	outl((inl(OTG_SYSCON_1) | (3 << 20) | (3 << 24)), OTG_SYSCON_1);#endif	//OTG_SYSCON_2.31 = 0 (OTG_EN)	//OTG_SYSCON_2.30 = 1 (USBx_SYNCHRO)	//OTG_SYSCON_2.29 = 0 (OTG_MST16)	//OTG_SYSCON_2.28 = 0 (SRP_GPDATA)	//OTG_SYSCON_2.27 = 0 (SRP_GPDVBUS)	//OTG_SYSCON_2.26-24 = 0 (SRP_GPUVBUS)	//OTG_SYSCON_2.22-20 = 0 (A_WAIT_RISE)	//OTG_SYSCON_2.18-16 = 4 (B_ASE0_BRST)	//OTG_SYSCON_2.14 = 0 (SRP_DPW)	//OTG_SYSCON_2.13 = 0 (SRP_DATA)	//OTG_SYSCON_2.12 = 0 (SRP_VBUS)	//OTG_SYSCON_2.10 = 0 (OTG_PADEN)	//OTG_SYSCON_2.9 = 0 (HMC_PADEN)	//OTG_SYSCON_2.8 = 1 (UHOST_EN) //user choice	//OTG_SYSCON_2.7 = 0 (HMC_TTLSPEED) //user choice	//OTG_SYSCON_2.6 = 0 (HMC_TTLATTACH) //user choice	//OTG_SYSCON_2.5-0 = 4 (HMC_MODE) //user choice	outl((1 << 30) | (4 << 16) | (1 << 8) | 4, OTG_SYSCON_2);	//OTG_CTRL.18 = x (BSESSVLD) //1 = host attached (VBUS present)	//other bits must be 0	outl((inl(OTG_CTRL) & (1 << 18)), OTG_CTRL);	//OTG_IRQ_EN = 0	outl(0, OTG_IRQ_EN);	//OTG_SYSCON_1.15 = 1 (OTG_IDLE_EN) //to reduce power consumption	//outl(inl(OTG_SYSCON_1)|(1<<15),OTG_SYSCON_1); //if enabled, usbserial looses some incoming data#endif	/*	 * Fill in some fields of the bogus pci_dev.	 */	memset(&bogus_pcidev, 0, sizeof (struct pci_dev));	strcpy(bogus_pcidev.name, "OMAP1510 OHCI");	strcpy(bogus_pcidev.slot_name, "builtin");	bogus_pcidev.resource[0].name = "OHCI Operational Registers";	bogus_pcidev.resource[0].start = 0xfffba000;	bogus_pcidev.resource[0].end = 0xfffba000 + 4096;	/* REVISIT */	bogus_pcidev.resource[0].flags = 0;	bogus_pcidev.irq = IH2_BASE + 6;	/*	 * Initialise the generic OHCI driver.	 */	ret = hc_add_ohci(&bogus_pcidev, bogus_pcidev.irq,			  (void *) bogus_pcidev.resource[0].start, 0,			  &omap1510_ohci, "usb-ohci", "omap1510");//      if (ret)//              release_mem_region(_USB_OHCI_OP_BASE, _USB_EXTENT);	return ret;}static voidomap1510_ohci_release(void){	/* REVISIT: Need to properly shut off clocks here. */	volatile unsigned long *mod_conf_ctrl_0 = (unsigned long *) 0xfffe1080;	hc_remove_ohci(omap1510_ohci);	*mod_conf_ctrl_0 &= ~MOD_CONF_CTRL_0_USB_HOST_HHC_UHOST_EN;#ifdef CONFIG_ARCH_OMAP1610	outl(inl(OTG_SYSCON_2) & ~(1 << 8), OTG_SYSCON_2);#endif	/*	 * Release memory resources.	 *///      release_mem_region(_USB_OHCI_OP_BASE, _USB_EXTENT);}#ifdef CONFIG_OMAP_H2/* Release IO region */static voidomap_h2_release_io(void){	i2c_close();	if (initstate_region) {		release_region(OTG_BASE, OTG_IOSIZE);		initstate_region = 0;	}}#endifstatic int __initomap1510_ohci_init(void){	int ret = 0;#ifdef CONFIG_OMAP_H2	int tmp =	    (int) request_region(OTG_BASE, OTG_IOSIZE, "OMAP H2 USB OHCI");	if (!tmp) {		err("OTG is already in use");		omap_h2_release_io();		return -ENODEV;	}	initstate_region = 1;	tmp = i2c_configure();	if (tmp < 0) {		omap_h2_release_io();		return tmp;	}	isp1301_configure();	i2c_close();		/*i2c is no longer needed here */#endif#if	defined(CONFIG_OMAP_INNOVATOR)	/* MVL-CEE */	init_waitqueue_head(&kusbdpmd_wait);	init_completion(&kusbdpmd);	omap1510_usbpmd_req = SIGHUP;	if ((omap1510_ohci_pid = kernel_thread(omap1510_ohci_thread,					       (void *) NULL,					       CLONE_FS | CLONE_FILES |					       CLONE_SIGHAND)) <= 0) {#ifdef CONFIG_OMAP_H2		omap_h2_release_io();#endif		return -1;	}	wait_for_completion(&kusbdpmd);	omap1510_ohci_ldm_driver_register();	omap1510_ohci_ldm_device_register();#else				/* MVL-CEE */	ret = omap1510_ohci_configure();#endif				/* MVL-CEE */	return 0;}static void __exitomap1510_ohci_exit(void){	int ret;#if	defined(CONFIG_OMAP_INNOVATOR)	/* MVL-CEE */	omap1510_ohci_ldm_device_unregister();	omap1510_ohci_ldm_driver_unregister();	/* Kill the thread */	init_completion(&kusbdpmd);	omap1510_usbpmd_req = SIGTERM;	wake_up(&kusbdpmd_wait);	wait_for_completion(&kusbdpmd);#endif				/* MVL-CEE */	omap1510_ohci_release();#ifdef CONFIG_OMAP_H2	omap_h2_release_io();#endif}module_init(omap1510_ohci_init);module_exit(omap1510_ohci_exit);MODULE_LICENSE("GPL");

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -