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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? mx2_mmc.c

?? 包含MMC協(xié)議,驅(qū)動(dòng)源碼. 在LINUX操作系統(tǒng)下通過.
?? C
?? 第 1 頁 / 共 2 頁
字號(hào):
	int i;	u16 rs;	u32 temp;	request->result = MMC_NO_ERROR;	/* Mark this as having a request result of some kind */	DEBUG(3, ": Get response \n");	switch (request->rtype) {	case RESPONSE_R1:	case RESPONSE_R1B:		request->response[0] = request->cmd;		temp = SDHC_RES_FIFO(MMC_BASE);		rs = (u16) temp;		request->response[1] = (u8) (rs & 0x00FF);		temp = SDHC_RES_FIFO(MMC_BASE);		rs = (u16) temp;		request->response[2] = (u8) (rs >> 8);		if (request->cmd == 3 && request->response[1] == 0		    && request->response[2] == 0x40) {			request->response[2] &=			    request->response[2] & ~(1 << 6);		}		/* mmc device does not clear this bit after APP_CMD command for some mmc cards */		request->response[3] = (u8) (rs & 0x00FF);		temp = SDHC_RES_FIFO(MMC_BASE);		rs = (u16) temp;		request->response[4] = (u8) (rs >> 8);		break;	case RESPONSE_R3:	case RESPONSE_R4:	case RESPONSE_R5:		request->response[0] = 0x3f;		temp = SDHC_RES_FIFO(MMC_BASE);		rs = (u16) temp;		request->response[1] = (u8) (rs & 0x00FF);		temp = SDHC_RES_FIFO(MMC_BASE);		rs = (u16) temp;		request->response[2] = (u8) (rs >> 8);		request->response[3] = (u8) (rs & 0x00FF);		temp = SDHC_RES_FIFO(MMC_BASE);		rs = (u16) temp;		request->response[4] = (u8) (rs >> 8);		break;	case RESPONSE_R2_CID:	case RESPONSE_R2_CSD:		request->response[0] = 0x3f;	/* for mmc core */		for (i = 0; i < 8; i++) {			temp = SDHC_RES_FIFO(MMC_BASE);			rs = (u16) temp;			request->response[2 * i + 1] = (u8) (rs >> 8);			request->response[2 * i + 2] = (u8) (rs & 0x00FF);		}	case RESPONSE_NONE:	default:		break;	}}static voidmx2_mmc_handle_int(struct mx2_mmc_data *sd){	int retval = MMC_NO_ERROR;	u16 status = SDHC_STATUS(MMC_BASE);	mx2_mmc_stop_clock();	/* Clear status bits */	SDHC_INT_MASK(MMC_BASE) = MX2_AUTO_CARD_DETECT_MASK & 0x7f;	/* mask and clear all interrupts */	/* Data or Command time-out? */	if (status & (MX2STAT_TIME_OUT_RESP | MX2STAT_TIME_OUT_READ)) {		DEBUG(1, " TIMEOUT: MMC status: %x \n", status);		retval = MMC_ERROR_TIMEOUT;		sd->request->result = MMC_ERROR_TIMEOUT;		mx2_mmc_get_response(sd->request);		goto terminate_int;	}	/* CRC error? */	if ((status & (MX2STAT_RESP_CRC_ERR /* | MX2STAT_CRC_READ_ERR */ ))) {		DEBUG(1, " MMCSD_RESP_CRC_ERR: MMC status: %x \n", status);		retval = MMC_ERROR_CRC;		goto terminate_int;	}	if (((status & MX2STAT_END_CMD_RESP)	     || (status & MX2STAT_DATA_TRANS_DONE)	     || (status & MX2STAT_WRITE_OP_DONE))	    && (sd->request->result == MMC_NO_RESPONSE)) {		mx2_mmc_get_response(sd->request);	}	switch (g_mx2_mmc_data.type) {	case RT_NO_RESPONSE:		break;	case RT_WRITE:		if (sd->request->nob) {			/* Start another transfer */		}		break;	case RT_READ:		if (sd->request->nob) {			/* Start another transfer */		}		break;	case RT_RESPONSE_ONLY:		if (sd->request->result < 0) {			printk(KERN_INFO			       "MMC: Illegal interrupt - command hasn't finished\n");			retval = MMC_ERROR_TIMEOUT;		}		break;	}      terminate_int:	sd->request->result = retval;	mmc_cmd_complete(sd->request);}/* Handle IRQ */static voidmx2_mmc_int(int irq, void *dev_id, struct pt_regs *regs){	struct mx2_mmc_data *sd = (struct mx2_mmc_data *) dev_id;	u32 status = SDHC_STATUS(MMC_BASE) & 0xFFFF;	DEBUG(4, " 0x%x\n", SDHC_STATUS(MMC_BASE));	if ((sd->request->cmd == MMC_READ_SINGLE_BLOCK	     || sd->request->cmd == MMC_READ_MULTIPLE_BLOCK)) {		if (status & MX2STAT_APPL_BUFF_FF) {			mx2_mmc_rx();		} else if ((status & MX2STAT_DATA_TRANS_DONE)			   || ((status & MX2STAT_END_CMD_RESP)			       && rx_counter >=			       g_mx2_mmc_data.request->block_len)) {			mx2_mmc_handle_int(sd);		}	} else	    if ((sd->request->cmd == MMC_WRITE_BLOCK		 || sd->request->cmd == MMC_WRITE_MULTIPLE_BLOCK)) {		if (status & MX2STAT_WRITE_OP_DONE) {			mx2_mmc_handle_int(sd);		} else if (status & MX2STAT_DATA_TRANS_DONE) {		} else if (status & MX2STAT_APPL_BUFF_FE) {			mx2_mmc_tx();		}	} else {		mx2_mmc_handle_int(sd);	}}static intmx2_mmc_slot_is_empty(int slot){	card_state = SDHC_STATUS(MMC_BASE) & MX2STAT_CARD_PRESENCE;	return card_state == 0;}/************************************************************************** * *                       Hardware initialization * *************************************************************************/static intmx2_mmc_slot_up(void){	int retval;	/* MX2 MMC slot hardware init */	mx_module_clk_open(IPG_MODULE_SDHC1);	/* Perclock 2 */	/* GPIO */	retval = mx2_register_gpios(PORT_E, (1 << 22) |	/* MMC: SD_CMD */				    (1 << 23) |	/* MMC: SD_CLK */				    (1 << 21) |	/* MMC: SD_DAT */				    (1 << 20) |	/* MMC: SD_DAT */				    (1 << 19) |	/* MMC: SD_DAT */				    (1 << 18),	/* MMC: SD_DAT */				    PRIMARY | NOINTERRUPT);	if (retval < 0)		goto error;	return retval;      error:	mx2_unregister_gpios(PORT_E,			     (1 << 18) | (1 << 19) | (1 << 20) | (1 << 21) | (1									      <<									      22)			     | (1 << 23));	return retval;}static voidmx2_mmc_slot_down(void){	disable_irq(INT_SDHC1);	/* Power Off MMC through FPGA */	/* Disable MMC clock and enable HI-Z on the MMC.DAT2 pin */}/* Standard PM functions */static intmx2_mmc_suspend(void){	mx2_gpio_mask_intr(PORT_D, 25);	if (mx2_mmc_inserted) {		mmc_eject(0);		/*set it to be negative level trigger detect card withdraw */		mx2_gpio_config_intr(PORT_D, 25, NEGATIVE_LEVEL, mmcsd_socket1_irq_handler);		mx2_mmc_inserted = 0;	}	mx2_mmc_slot_down(); /*disable MMC IRQ*/	mx2_mmc_stop_clock();	mx_module_clk_close(IPG_MODULE_SDHC1);	return 0;}static voidmx2_mmc_resume(void){	mx_module_clk_open(IPG_MODULE_SDHC1);	mx2_mmc_set_clock(g_mx2_mmc_data.clock);	enable_irq(INT_SDHC1);	mx2_gpio_unmask_intr(PORT_D, 25);}#ifdef CONFIG_PMstatic intmx2_mmc_pm_callback(struct pm_dev *pm_dev, pm_request_t req, void *data){	switch (req) {	case PM_SUSPEND:		mx2_mmc_suspend();		break;	case PM_RESUME:		mx2_mmc_resume();		break;	}	return 0;}#endif#if 1 /*CEE LDM*/static int__ldm_suspend(struct device *dev, u32 state, u32 level){	switch (level) {	case SUSPEND_POWER_DOWN:		mx2_mmc_suspend();		break;	}	return 0;}static int__ldm_resume(struct device *dev, u32 level){	switch (level) {	case RESUME_POWER_ON:		mx2_mmc_resume();		break;	}	return 0;}#endifvoidmmcsd_socket1_irq_handler(int irq, void *dev_id, struct pt_regs *regs){	u32 trigger;	trigger = mx2_gpio_get_intr_config(PORT_D, 25);	if (mx2_gpio_intr_status_bit(PORT_D, 25)) {		if (trigger == 2)	/* it is positive level now */		{			if (mx2_mmc_inserted) {				mmc_eject(0);				/*set it to be negative level trigger detect card withdraw */				mx2_gpio_config_intr(PORT_D, 25, NEGATIVE_LEVEL, mmcsd_socket1_irq_handler);				mx2_mmc_inserted = 0;			}		}		if (trigger == 3)	/* it is negative level now */		{			if (!mx2_mmc_inserted) {				mmc_insert(0);				/*set it to be positive level trigger detect card insert */				mx2_gpio_config_intr(PORT_D, 25, POSITIVE_LEVEL, mmcsd_socket1_irq_handler);				mx2_mmc_inserted = 1;			}		}		mx2_gpio_clear_intr(PORT_D, 25);	}}#define MX2ADS_MMC_MIN_HCLK  33000static intmx2_mmc_slot_init(void){	int retval;	long flags;#if 1 /*CEE LDM*/	if (MX2ADS_MMC_MIN_HCLK > mx_module_get_clk(HCLK) / 1000) {		printk(KERN_ERR "cannot initialize MMC - HCLK too slow\n");		return -EPERM;	}#endif	/* Basic service interrupt */	local_irq_save(flags);	mx2_mmc_slot_up();	mx2_mmc_softreset();	/* check hardware revision */	if ((SDHC_REV_NO(MMC_BASE) & 0xFFFF) != 0x0400) {		printk(KERN_ERR "MMC Hardware revision = 0x%x",		       SDHC_REV_NO(MMC_BASE));	}	mx2_register_gpio(PORT_D, 25, GPIO | INPUT | TRISTATE);	mx2_gpio_unmask_intr(PORT_D, 25);	/* enable */	mx2_gpio_config_intr(PORT_D, 25, NEGATIVE_LEVEL,			     mmcsd_socket1_irq_handler);	mx2_mmc_inserted = 0;	SDHC_INT_MASK(MMC_BASE) = MX2_AUTO_CARD_DETECT_MASK & 0x7f;	/* Clear all interrupts */	retval = request_irq(INT_SDHC1, mx2_mmc_int,			     SA_INTERRUPT, "mx2_mmc_int", &g_mx2_mmc_data);	if (retval) {		printk(KERN_CRIT "MMC: unable to grab MMC IRQ\n");		return retval;	}#ifdef CONFIG_PM	pm_register(PM_UNKNOWN_DEV, PM_SYS_UNKNOWN, mx2_mmc_pm_callback);#endif#if 1 /*CEE LDM*/#ifdef CONFIG_DPM	mx2mmc_constraints.param[0].min = MX2ADS_MMC_MIN_HCLK;	/*in KHz */	mx2mmc_constraints.param[0].max = mx_module_get_clk(MPLL) / 1000;	/* unlimited */#endif	mx21_ldm_bus_register(&__device_ldm, &__driver_ldm);#endif	local_irq_restore(flags);	return retval;}static voidmx2_mmc_slot_cleanup(void){	long flags;	local_irq_save(flags);	mx2_mmc_slot_down();	free_irq(INT_SDHC1, &g_mx2_mmc_data);	mx_module_clk_close(IPG_MODULE_SDHC1);	local_irq_restore(flags);	mx2_unregister_gpio(PORT_D, 25);#ifdef CONFIG_PM	pm_unregister_all(mx2_mmc_pm_callback);#endif#if 1 /*CEE LDM*/	mx21_ldm_bus_unregister(&__device_ldm, &__driver_ldm);#endif}/***********************************************************/static struct mmc_slot_driver dops = {	.owner = THIS_MODULE,	.name = "MX2 MMC",	.ocr = 0x00ffc000,	.flags = MMC_SDFLAG_MMC_MODE,	.init = mx2_mmc_slot_init,	.cleanup = mx2_mmc_slot_cleanup,	.is_empty = mx2_mmc_slot_is_empty,	.send_cmd = mx2_mmc_send_command,	.set_clock = mx2_mmc_set_clock};int __initmx2_mmc_init(void){	int retval;	retval = mmc_register_slot_driver(&dops, 1);	if (retval < 0)		printk(KERN_INFO "MMC: unable to register slot\n");	return retval;}void __exitmx2_mmc_cleanup(void){	mmc_unregister_slot_driver(&dops);	mx2_unregister_gpios(PORT_E,			     (1 << 18) | (1 << 19) | (1 << 20) | (1 << 21) | (1									      <<									      22)			     | (1 << 23));}module_init(mx2_mmc_init);module_exit(mx2_mmc_cleanup);MODULE_DESCRIPTION("MX2 MMC");MODULE_LICENSE("GPL");EXPORT_NO_SYMBOLS;

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
五月天一区二区三区| 国产精品大尺度| www.日韩精品| 美女在线视频一区| 亚洲精品视频免费看| 精品理论电影在线| 欧美久久久影院| av不卡在线观看| 国产另类ts人妖一区二区| 一区二区三区在线高清| 久久精品亚洲麻豆av一区二区 | 91麻豆福利精品推荐| 精品亚洲国产成人av制服丝袜| 色综合天天性综合| 一二三区精品视频| 亚洲国产电影在线观看| 久久天堂av综合合色蜜桃网| 欧美日本一区二区三区四区| 日本伦理一区二区| www.爱久久.com| 国产成人激情av| 国内久久精品视频| 麻豆91免费观看| 青青草成人在线观看| 亚洲电影激情视频网站| 日韩毛片视频在线看| 国产丝袜欧美中文另类| 精品久久人人做人人爰| 欧美一级高清片在线观看| 欧美日韩一二区| 91成人网在线| 欧美三级中文字| 欧美日韩国产首页在线观看| 欧美性欧美巨大黑白大战| 日本美女一区二区三区视频| 久久亚洲捆绑美女| 精品欧美一区二区在线观看| 欧美不卡一区二区三区四区| 欧美一级一区二区| 91精品国产91综合久久蜜臀| 69堂亚洲精品首页| 337p亚洲精品色噜噜噜| 欧美精品亚洲一区二区在线播放| 欧美性色综合网| 欧美日韩一级二级| 欧美日本韩国一区| 欧美一区二区视频在线观看2020 | 欧美一区日韩一区| 91精品久久久久久久99蜜桃| 7777精品伊人久久久大香线蕉超级流畅 | 一区二区日韩av| 亚洲福中文字幕伊人影院| 黄页视频在线91| 欧美高清你懂得| 欧美一区二区久久久| 精品国内二区三区| 国产午夜亚洲精品羞羞网站| 日本一区免费视频| 亚洲日本韩国一区| 午夜视频一区在线观看| 久久精品国产在热久久| 国产高清精品网站| 色综合久久久久综合体桃花网| 欧美午夜电影一区| 日韩欧美久久一区| 久久精品这里都是精品| 中文字幕一区二区三区精华液| 亚洲老妇xxxxxx| 日本亚洲免费观看| 高清beeg欧美| 91视频免费播放| 日韩一区国产二区欧美三区| 久久免费午夜影院| 亚洲视频免费看| 日韩不卡一二三区| 亚洲乱码国产乱码精品精98午夜| 久久精品人人做人人爽人人| 中文字幕日韩欧美一区二区三区| 亚洲一区av在线| 狠狠狠色丁香婷婷综合激情| a级精品国产片在线观看| 欧美在线免费观看亚洲| 欧美精品一区二区高清在线观看| 国产精品三级av在线播放| 亚洲影院在线观看| 国产福利一区二区三区视频| 欧美在线观看一区| 国产午夜精品久久久久久久| 一区二区日韩电影| 国产精品一区不卡| 欧美日韩mp4| 国产精品久久久久久福利一牛影视| 亚洲123区在线观看| 高清在线成人网| 欧美美女网站色| 国产精品美女久久久久久久久久久| 亚洲综合色婷婷| 成人涩涩免费视频| 成人白浆超碰人人人人| 国产99精品在线观看| 欧美美女bb生活片| 国产精品久久久久久久午夜片| 日本色综合中文字幕| 99re66热这里只有精品3直播 | 欧美国产日韩在线观看| 日韩国产欧美三级| 在线亚洲免费视频| 国产女同性恋一区二区| 日本欧美在线观看| 欧美吞精做爰啪啪高潮| 综合婷婷亚洲小说| 国产成人午夜视频| 欧美大肚乱孕交hd孕妇| 亚洲美女淫视频| av一区二区三区黑人| www欧美成人18+| 蜜桃精品视频在线| 欧美理论在线播放| 中文字幕乱码久久午夜不卡| 精品少妇一区二区三区视频免付费| 亚洲国产精品久久不卡毛片 | 日韩影院精彩在线| 欧美色成人综合| 亚洲免费在线观看| 91女人视频在线观看| 国产欧美精品一区aⅴ影院| 美女尤物国产一区| 日韩精品最新网址| 麻豆精品视频在线观看免费| 91精品麻豆日日躁夜夜躁| 午夜久久久久久| 7777精品伊人久久久大香线蕉最新版| 亚洲最新视频在线播放| 欧美性猛交xxxx乱大交退制版| 成人伦理片在线| 蜜桃精品在线观看| 欧美大片在线观看一区| 麻豆国产一区二区| 精品精品国产高清一毛片一天堂| 日韩av电影免费观看高清完整版| 91精品国产欧美一区二区| 麻豆国产精品官网| 欧美精品一区二区精品网| 国产毛片一区二区| 中文天堂在线一区| 99久久综合色| 玉米视频成人免费看| 欧美午夜片在线观看| 丝袜亚洲精品中文字幕一区| 日韩欧美国产综合一区 | 国产传媒一区在线| 国产精品久久久久久户外露出| 99久久国产综合色|国产精品| 日韩一区欧美一区| 欧美羞羞免费网站| 日韩电影在线免费| 久久久久97国产精华液好用吗| 国产成人av福利| 亚洲人成伊人成综合网小说| 欧美色综合影院| 麻豆精品新av中文字幕| 国产欧美日韩综合| 日本高清免费不卡视频| 日韩**一区毛片| 国产偷v国产偷v亚洲高清| 亚洲制服丝袜一区| 成人h版在线观看| 亚洲国产欧美日韩另类综合 | 成人午夜视频网站| 亚洲国产综合人成综合网站| 欧美成人艳星乳罩| 成人高清视频免费观看| 亚洲制服丝袜av| 亚洲精品在线网站| 在线观看网站黄不卡| 久久精品国产精品青草| 国产精品电影一区二区三区| 精品视频一区二区三区免费| 国产一区二区在线看| 一区二区欧美精品| 欧美精品一区二区三区久久久| 色一区在线观看| 国产美女av一区二区三区| 亚洲一区二区三区四区五区中文| 日韩欧美亚洲一区二区| 91色porny| 国产精一区二区三区| 亚洲国产精品欧美一二99| 国产偷国产偷亚洲高清人白洁| 欧美日本国产视频| 无码av免费一区二区三区试看 | 国产综合一区二区| 亚洲一区二区中文在线| 国产亚洲视频系列| 777xxx欧美| 91久久久免费一区二区| 成人综合婷婷国产精品久久蜜臀| 日韩va欧美va亚洲va久久| 亚洲女性喷水在线观看一区| 欧美mv日韩mv国产网站app|