亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? omap_mmc.c

?? 包含MMC協議,驅動源碼. 在LINUX操作系統下通過.
?? C
?? 第 1 頁 / 共 2 頁
字號:
		*(buf + 2) = data & 0xff;		data = inw(OMAP_MMC_RSP6);		DEBUG(3, " %x \n", data);		*(buf + 3) = data >> 8;		*(buf + 4) = data & 0xff;		break;	case RESPONSE_R2_CID:	case RESPONSE_R2_CSD:		*(buf) = 0x3f;	/* for mmc core */		data = inw(OMAP_MMC_RSP7);		*(buf + 1) = data >> 8;		*(buf + 2) = data & 0xff;		data = inw(OMAP_MMC_RSP6);		*(buf + 3) = data >> 8;		*(buf + 4) = data & 0xff;		data = inw(OMAP_MMC_RSP5);		*(buf + 5) = data >> 8;		*(buf + 6) = data & 0xff;		data = inw(OMAP_MMC_RSP4);		*(buf + 7) = data >> 8;		*(buf + 8) = data & 0xff;		data = inw(OMAP_MMC_RSP3);		*(buf + 9) = data >> 8;		*(buf + 10) = data & 0xff;		data = inw(OMAP_MMC_RSP2);		*(buf + 11) = data >> 8;		*(buf + 12) = data & 0xff;		data = inw(OMAP_MMC_RSP1);		*(buf + 13) = data >> 8;		*(buf + 14) = data & 0xff;		data = inw(OMAP_MMC_RSP0);		*(buf + 15) = data >> 8;		*(buf + 16) = data & 0xff;	case RESPONSE_NONE:	default:		break;	}}static voidomap_mmc_handle_int(struct omap_mmc_data *sd, u16 status){	int retval = MMC_NO_ERROR;	int flags;	local_irq_save(flags);	DEBUG(3, ": Interrupt. Status: %d\n", status);	/* Data or Command time-out? */	if (status & (OMAP_MMC_CMD_TIMEOUT | OMAP_MMC_DATA_TIMEOUT)) {		DEBUG(0, ": MMC/SD status: %d \n", inw(OMAP_MMC_STAT));		retval = MMC_ERROR_TIMEOUT;		goto terminate_int;	}	/* CRC error? */	if ((status & (OMAP_MMC_CMD_CRC | OMAP_MMC_DATA_CRC)) &&	    !(inw(OMAP_MMC_CON) & (1 << 15))) {		DEBUG(0, ": MMC/SD status: %d \n", inw(OMAP_MMC_STAT));		retval = MMC_ERROR_CRC;		goto terminate_int;	}	if (((status & OMAP_MMC_END_OF_CMD)	     && (sd->request->result == MMC_NO_RESPONSE))	    || (status & 1 << 14))		omap_mmc_get_response(sd->request);	switch (g_omap_mmc_data.type) {	case RT_NO_RESPONSE:		break;	case RT_WRITE:		if (sd->request->nob) {			/* Start another transfer */			outw(0xffff, OMAP_MMC_STAT);			omap_mmc_start_tx_dma_transfer(g_omap_mmc_data.request->						       block_len);			return;		}		break;	case RT_READ:		if (sd->request->nob) {			/* Start another transfer */			outw(0xffff, OMAP_MMC_STAT);			omap_mmc_start_rx_dma_transfer(g_omap_mmc_data.request->						       block_len);			return;		}		break;	case RT_RESPONSE_ONLY:		if (sd->request->result < 0) {			printk(KERN_INFO			       "MMC/SD: Illegal interrupt - command hasn't finished\n");			retval = MMC_ERROR_TIMEOUT;		}		break;	}      terminate_int:	outw(0, OMAP_MMC_IE);	/* Clear all interrupts */	sd->request->result = retval;	mmc_cmd_complete(sd->request);	local_irq_restore(flags);}/* Handle IRQ */static voidomap_mmc_int(int irq, void *dev_id, struct pt_regs *regs){	struct omap_mmc_data *sd = (struct omap_mmc_data *) dev_id;	u16 status = inw(OMAP_MMC_STAT);	omap_mmc_handle_int(sd, status);}/* Detect Card */static voidomap_mmc_fix_sd_detect(unsigned long nr){#ifdef CONFIG_ARCH_OMAP1510	card_state = inb(INNOVATOR_FPGA_INFO) & (1 << 4);	if (card_state == 0) {		outw((1 << 11), OMAP_MMC_CON);		mmc_insert(0);	} else {		mmc_eject(0);	}#endif#ifdef CONFIG_ARCH_OMAP1610	u8 state;	state = inb(MPUIO_INPUT_LATCH_REG) & (1 << 1);	if (card_state == state) {		if (card_state == 0) {			outw((1 << 11), OMAP_MMC_CON);			mmc_insert(0);			omap1610_tune_irq(OMAP_MMC_CD, IFL_HIGHLEVEL);		} else {			mmc_eject(0);			omap1610_tune_irq(OMAP_MMC_CD, IFL_LOWLEVEL);		}	}#endif#ifdef CONFIG_ARCH_OMAP730	u8 state;	state = get_p2_mmc_cd_state() & 1;	if(card_state == state) {		if ( card_state == 0 ) { 			/* Slot now has a card */			outw(MMC_CON_POWER_UP, OMAP_MMC_CON); 			mmc_insert(0);			omap730_tune_irq(OMAP_MMC_CD, IFL_HIGHLEVEL);		} else {			/* Slot is now empty */			mmc_eject(0);			omap730_tune_irq(OMAP_MMC_CD, IFL_LOWLEVEL);	    		}	}#endif}static voidomap_mmc_sd_detect_int(int irq, void *dev_id, struct pt_regs *regs){	struct omap_mmc_data *sd = (struct omap_mmc_data *) dev_id;#ifdef CONFIG_ARCH_OMAP1510	u8 state;	state = inb(INNOVATOR_FPGA_INFO) & (1 << 4);	if (card_state != state)		mod_timer(&sd->sd_detect_timer,			  jiffies + ((card_state ? 50 : 500) * HZ) / 1000);#endif#ifdef CONFIG_ARCH_OMAP1610	card_state = inb(MPUIO_INPUT_LATCH_REG) & (1 << 1);	mod_timer(&sd->sd_detect_timer,		  jiffies + ((card_state ? 50 : 500) * HZ) / 1000);#endif#ifdef CONFIG_ARCH_OMAP730	card_state = get_p2_mmc_cd_state() & 1;	mod_timer(&sd->sd_detect_timer,		  jiffies + ((card_state ? 50 : 500) * HZ) / 1000);#endif}static intomap_mmc_slot_is_empty(int slot){#ifdef CONFIG_ARCH_OMAP1510	card_state = inb(INNOVATOR_FPGA_INFO) & (1 << 4);#endif#ifdef CONFIG_ARCH_OMAP1610	card_state = inb(MPUIO_INPUT_LATCH_REG) & (1 << 1);#endif#ifdef CONFIG_ARCH_OMAP730	card_state = get_p2_mmc_cd_state();#endif	return card_state != 0;}/************************************************************************** * *                       Hardware initialization                                              * *************************************************************************/static voidomap_mmc_slot_up(void){	/* OMAP MMC slot hardware init */#ifdef CONFIG_ARCH_OMAP1510	outb(inb(OMAP1510P1_FPGA_POWER) | (1 << 3), OMAP1510P1_FPGA_POWER);#endif#if defined(CONFIG_ARCH_OMAP1510) || defined(CONFIG_ARCH_OMAP1610)	/* Enable MMC/SD clock and disable HI-Z on the MMC.DAT2 pin */	outl(inl(MOD_CONF_CTRL_0) | (1 << 23) | (1 << 21), MOD_CONF_CTRL_0);	/* Set up correct pin multiplexing (OMAP1510 mode) */	/* Configure MMC.DAT3 pin */	outl(inl(FUNC_MUX_CTRL_D) & ~((1 << 14) | (1 << 13) | (1 << 12)),	     FUNC_MUX_CTRL_D);	/* Configure MMC.CLK pin */	outl(inl(FUNC_MUX_CTRL_A) & ~((1 << 23) | (1 << 22) | (1 << 21)),	     FUNC_MUX_CTRL_A);	/* Configure MMC_DAT0_SPI.DI pin */	outl(inl(FUNC_MUX_CTRL_B) & ~((1 << 2) | (1 << 1) | (1 << 0)),	     FUNC_MUX_CTRL_B);	/* Configure MMC.DAT2 pin */	outl(inl(FUNC_MUX_CTRL_A) & ~((1 << 20) | (1 << 19) | (1 << 18)),	     FUNC_MUX_CTRL_A);	/* Configure MMC.DAT1 pin */	outl(inl(FUNC_MUX_CTRL_A) & ~((1 << 26) | (1 << 25) | (1 << 24)),	     FUNC_MUX_CTRL_A);	/* Configure MMC.CMD_SPI.DO pin  */	outl(inl(FUNC_MUX_CTRL_A) & ~((1 << 29) | (1 << 28) | (1 << 27)),	     FUNC_MUX_CTRL_A);#endif#ifdef CONFIG_ARCH_OMAP730	/* Pin MUX is set up for the OMAP730/P2 in perseus2.c */	set_p2_v_sdmmc_state(V_SDMMC_ENABLED);	set_p2_mmc_wp_state(MMC_WP_DISABLED);	/* Start up the 48MHz MMC Clock */	OMAP730_CONFIGURE(PCONF_MMC_DPLL_REQ, ACTIVE);	*((volatile u32 *)ECO_SPARE1) =  ECO_SPARE1_INITVALUE;#endif	/* Configure MMC_CON register */	outw((1 << 11), OMAP_MMC_CON);	/* Clear interrupts and status */	outw(0, OMAP_MMC_IE);	/* Clear all interrupts */	outw(0xffff, OMAP_MMC_STAT);	/* Clear status bits */}static voidomap_mmc_slot_down(void){	disable_irq(OMAP_MMC_CD);	disable_irq(OMAP_MMC_INT);	/* Power Off MMC through FPGA */#ifdef CONFIG_ARCH_OMAP1510	outb(inb(OMAP1510P1_FPGA_POWER) & ~(1 << 3), OMAP1510P1_FPGA_POWER);#endif#if defined(CONFIG_ARCH_OMAP1510) || defined(CONFIG_ARCH_OMAP1610)	/* Disable MMC/SD clock and enable HI-Z on the MMC.DAT2 pin */	outl(inl(MOD_CONF_CTRL_0) & ~((1 << 23) | (1 << 21)), MOD_CONF_CTRL_0);#endif#ifdef CONFIG_ARCH_OMAP730	OMAP730_CONFIGURE(PCONF_MMC_DPLL_REQ, INACTIVE);#endif	outw(0, OMAP_MMC_CON);	del_timer_sync(&g_omap_mmc_data.sd_detect_timer);#ifdef CONFIG_ARCH_OMAP730	set_p2_v_sdmmc_state(V_SDMMC_DISABLED);#endif}/* Standard PM functions */static intomap_mmc_suspend(void){	omap_mmc_stop_clock();	omap_mmc_slot_down();	return 0;}static voidomap_mmc_resume(void){	omap_mmc_slot_up();	omap_mmc_set_clock(g_omap_mmc_data.clock);	/* Set up timers */	g_omap_mmc_data.sd_detect_timer.function = omap_mmc_fix_sd_detect;	g_omap_mmc_data.sd_detect_timer.data = (unsigned long) &g_omap_mmc_data;	init_timer(&g_omap_mmc_data.sd_detect_timer);	enable_irq(OMAP_MMC_INT);	enable_irq(OMAP_MMC_CD);	/* Enable card detect IRQ */}#ifdef CONFIG_PMstatic intomap_mmc_pm_callback(struct pm_dev *pm_dev, pm_request_t req, void *data){	switch (req) {	case PM_SUSPEND:		mmc_eject(0);		omap_mmc_suspend();		break;	case PM_RESUME:		omap_mmc_resume();		omap_mmc_fix_sd_detect(0);		break;	}	return 0;}#endif#ifdef CONFIG_CEE		/* MVL-CEE */static intomap_mmc_dpm_suspend(struct device *dev, u32 state, u32 level){	switch (level) {	case SUSPEND_POWER_DOWN:		/* Turn off power to MMC/SD */		omap_mmc_suspend();		break;	}	return 0;}static intomap_mmc_dpm_resume(struct device *dev, u32 level){	switch (level) {	case RESUME_POWER_ON:		/* Turn on power to MMC/SD */		omap_mmc_resume();		mmc_eject(0);		omap_mmc_fix_sd_detect(0);		break;	}	return 0;}#endifstatic intomap_mmc_slot_init(void){	int retval;	/* Set up timers */	g_omap_mmc_data.sd_detect_timer.function = omap_mmc_fix_sd_detect;	g_omap_mmc_data.sd_detect_timer.data = (unsigned long) &g_omap_mmc_data;	init_timer(&g_omap_mmc_data.sd_detect_timer);	/* Basic service interrupt */	retval = request_irq(OMAP_MMC_INT, omap_mmc_int,			     SA_INTERRUPT, "omap_mmc_int", &g_omap_mmc_data);	if (retval) {		printk(KERN_CRIT "MMC/SD: unable to grab MMC IRQ\n");		return retval;	}	disable_irq(OMAP_MMC_INT);	/* Card Detect interrupt */	retval = request_irq(OMAP_MMC_CD, omap_mmc_sd_detect_int,			     SA_INTERRUPT, "omap_mmc_cd", &g_omap_mmc_data);#ifdef CONFIG_ARCH_OMAP1610	if (omap_mmc_slot_is_empty(0) == 0)		omap1610_tune_irq(OMAP_MMC_CD, IFL_HIGHLEVEL);#endif#ifdef CONFIG_ARCH_OMAP730	if (omap_mmc_slot_is_empty(0) == 0)		omap730_tune_irq(OMAP_MMC_CD, IFL_HIGHLEVEL);#endif	if (retval) {		printk(KERN_CRIT "MMC/SD: unable to grab MMC_CD_IRQ\n");		goto err1;	}	disable_irq(OMAP_MMC_CD);	if (omap_request_dma	    (eMMCRx, "MMC/SD Rx DMA", (dma_callback_t) omap_mmc_rx_dma_callback,	     &g_omap_mmc_data, &(g_omap_mmc_data.rx_dma_regs))) {		printk(KERN_ERR "Failed to request MMC Rx DMA \n");		goto err2;	}	if (omap_request_dma	    (eMMCTx, "MMC/SD Tx DMA", (dma_callback_t) omap_mmc_tx_dma_callback,	     &g_omap_mmc_data, &(g_omap_mmc_data.tx_dma_regs))) {		printk(KERN_ERR "Failed to request MMC Tx DMA \n");		goto err3;	}#ifdef CONFIG_PM	pm_register(PM_UNKNOWN_DEV, PM_SYS_UNKNOWN, omap_mmc_pm_callback);#endif	omap_mmc_slot_up();	enable_irq(OMAP_MMC_CD);	/* Enable IRQ to detect card */	goto noerr;      err3:omap_free_dma(g_omap_mmc_data.tx_dma_regs);      err2:omap_free_dma(g_omap_mmc_data.rx_dma_regs);      err1:free_irq(OMAP_MMC_INT, &g_omap_mmc_data);      noerr:return retval;}static voidomap_mmc_slot_cleanup(void){	long flags;	local_irq_save(flags);	omap_mmc_slot_down();	mmc_eject(0);	omap_free_dma(g_omap_mmc_data.tx_dma_regs);	omap_free_dma(g_omap_mmc_data.rx_dma_regs);	free_irq(OMAP_MMC_CD, &g_omap_mmc_data);	free_irq(OMAP_MMC_INT, &g_omap_mmc_data);	local_irq_restore(flags);}/***********************************************************/static struct mmc_slot_driver dops = {	.owner = THIS_MODULE,	.name = "OMAP1510/1610/730 MMC",	.ocr = OMAP_MMC_OCR,	.flags = MMC_SDFLAG_MMC_MODE,	.init = omap_mmc_slot_init,	.cleanup = omap_mmc_slot_cleanup,	.is_empty = omap_mmc_slot_is_empty,	.send_cmd = omap_mmc_send_command,	.set_clock = omap_mmc_set_clock,};static int __initomap_mmc_init(void){	int retval;#ifdef CONFIG_CEE		/* MVL-CCE */	omap_mmc_ldm_device_register();	omap_mmc_ldm_driver_register();#endif				/* MVL-CCE */	retval = mmc_register_slot_driver(&dops, 1);	if (retval < 0)		printk(KERN_INFO "MMC/SD: unable to register slot\n");	return retval;}static void __exitomap_mmc_cleanup(void){#ifdef CONFIG_CEE		/* MVL-CCE */	omap_mmc_ldm_device_unregister();	omap_mmc_ldm_driver_unregister();#endif				/* MVL-CCE */	mmc_unregister_slot_driver(&dops);}module_init(omap_mmc_init);module_exit(omap_mmc_cleanup);MODULE_AUTHOR("Alexey Lugovskoy");MODULE_DESCRIPTION("OMAP1510/1610/730 Innovator MMC/SD");MODULE_LICENSE("GPL");EXPORT_NO_SYMBOLS;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲一区二区三区四区五区中文| 成人精品小蝌蚪| 国产一区二区三区免费观看| 日本道免费精品一区二区三区| 欧美成人一区二区三区片免费| 亚洲日本va在线观看| 国产综合久久久久久鬼色| 欧美性猛交xxxx乱大交退制版| 亚洲精品一线二线三线| 亚洲国产裸拍裸体视频在线观看乱了| 成人午夜电影小说| 日韩一二在线观看| 视频在线观看国产精品| 91免费国产在线| 国产欧美日韩不卡免费| 精品一二三四在线| 欧美一区二区三区精品| 亚洲午夜激情av| 91免费看片在线观看| 国产精品久久777777| 国产乱一区二区| 亚洲激情在线播放| 欧美在线免费观看视频| 欧美mv日韩mv亚洲| 日韩电影免费一区| 欧美日韩精品三区| 一区二区三区在线观看视频| 高清不卡在线观看| 欧美国产日本韩| 国产精品一区二区x88av| 精品国产亚洲在线| 国产制服丝袜一区| 久久免费精品国产久精品久久久久 | 亚洲天堂网中文字| 大白屁股一区二区视频| 欧美极品aⅴ影院| 波多野结衣中文字幕一区二区三区 | 中文一区在线播放| 国产91精品一区二区麻豆网站| 久久只精品国产| 国产91高潮流白浆在线麻豆| 国产三级精品视频| 色综合天天综合网天天狠天天| 成人免费视频在线观看| 91高清视频在线| 日本亚洲一区二区| 精品处破学生在线二十三| 国产一区二区三区| 国产精品美女久久久久久久久 | 午夜久久久久久久久| 在线观看av不卡| 日本欧美一区二区三区乱码| 日韩欧美一级在线播放| 成人晚上爱看视频| 亚洲国产裸拍裸体视频在线观看乱了| 欧美日本一区二区三区| 久久国产精品免费| 亚洲欧洲性图库| 宅男在线国产精品| 国产高清亚洲一区| 亚洲人快播电影网| 日韩午夜小视频| 成人国产在线观看| 午夜精品国产更新| 国产欧美一区二区精品久导航 | 欧美一级电影网站| 福利电影一区二区| 亚洲午夜在线电影| 久久免费午夜影院| 国产精品福利一区二区三区| 国产欧美视频一区二区| 97超碰欧美中文字幕| 日本伊人色综合网| 国产精品久久久久久久久久免费看| 一本色道久久综合亚洲精品按摩| 日韩vs国产vs欧美| 成人免费在线视频观看| 日韩精品一区二区三区视频播放 | 九九在线精品视频| 亚洲免费在线观看视频| 欧美成人三级在线| 欧洲视频一区二区| 国产成人午夜视频| 三级欧美在线一区| 一区二区三区在线观看视频| 国产日韩欧美一区二区三区综合| 在线播放欧美女士性生活| 成人免费高清在线| 亚洲国产精品综合小说图片区| 欧美日韩在线三级| 国产91丝袜在线18| 精彩视频一区二区三区| 亚洲成人高清在线| 亚洲欧美区自拍先锋| 日本一区二区成人| 欧美精品一区二区三区四区| 欧美精品xxxxbbbb| 欧美亚洲国产一区二区三区va| 成人午夜碰碰视频| 激情都市一区二区| 狠狠色丁香婷综合久久| 蜜臀久久久久久久| 美美哒免费高清在线观看视频一区二区 | 日韩精品自拍偷拍| 欧美福利视频导航| 在线成人av网站| 欧美日韩免费在线视频| 欧美综合视频在线观看| 色天天综合久久久久综合片| 91在线播放网址| 91伊人久久大香线蕉| 色香蕉成人二区免费| 91麻豆视频网站| 色综合天天视频在线观看| www.欧美色图| 色成年激情久久综合| 一本一本大道香蕉久在线精品| 色综合视频一区二区三区高清| 91久久香蕉国产日韩欧美9色| 色偷偷一区二区三区| 欧美日韩免费在线视频| 6080午夜不卡| 久久久久亚洲综合| 国产精品乱码一区二三区小蝌蚪| 国产精品久久久久久一区二区三区| 中文字幕av免费专区久久| 中文字幕中文字幕在线一区 | 国产精品色噜噜| 亚洲卡通动漫在线| 亚洲电影欧美电影有声小说| 亚洲 欧美综合在线网络| 奇米色777欧美一区二区| 蜜臀av性久久久久蜜臀aⅴ四虎| 经典一区二区三区| 成人精品国产一区二区4080| 色偷偷成人一区二区三区91| 欧美人狂配大交3d怪物一区| 精品成人一区二区三区四区| 中文字幕免费不卡在线| 亚洲精品国产视频| 麻豆91精品91久久久的内涵| 高清视频一区二区| 在线视频综合导航| 欧美成人高清电影在线| 中文一区二区在线观看| 亚洲国产成人高清精品| 国模一区二区三区白浆| 一道本成人在线| 久久综合狠狠综合| 亚洲免费观看高清完整| 麻豆91免费看| 欧美亚洲综合一区| 久久久久久久综合| 午夜精品久久久久久| 成人午夜在线播放| 欧美一区二视频| 中文字幕在线观看不卡| 久热成人在线视频| 色偷偷成人一区二区三区91| 欧美va亚洲va国产综合| 一二三四社区欧美黄| 国产成人午夜片在线观看高清观看| 欧美私人免费视频| 国产欧美日韩亚州综合| 丝瓜av网站精品一区二区| www.视频一区| 久久综合国产精品| 偷拍一区二区三区| 92国产精品观看| 久久久久久一二三区| 久久精品久久久精品美女| 欧美在线短视频| 亚洲女人****多毛耸耸8| 国产91精品露脸国语对白| 精品成人佐山爱一区二区| 首页亚洲欧美制服丝腿| 欧洲另类一二三四区| 1区2区3区欧美| av电影在线观看一区| 国产日产欧美精品一区二区三区| 免费高清成人在线| 91.com在线观看| 亚洲成人av资源| 欧洲另类一二三四区| 一区二区三区**美女毛片| 99久久免费视频.com| 欧美国产精品中文字幕| 国产成人免费在线视频| 久久久久久免费| 国产一区二区0| 精品对白一区国产伦| 国产乱码精品一品二品| 日本中文在线一区| 91成人在线免费观看| 亚洲欧美色综合| 色吊一区二区三区| 亚洲综合图片区| 欧美性高清videossexo| 亚洲高清一区二区三区| 欧美男生操女生|