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

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

?? jz_mmc.c

?? 包含MMC協議,驅動源碼. 在LINUX操作系統下通過.
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* * drivers/mmc/jz_mmc.c * * Low-level MMC/SD functions for the Ingenic JZ4730 MMC/SD on-chip controller * * Copyright 2006 Ingenic Semiconductor Inc. * * Copyright 2003 MontaVista Software Inc. * Author: MontaVista Software, Inc. *	   source@mvista.com * *  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. */#include <linux/module.h>#include <linux/version.h>#include <linux/init.h>#include <linux/sched.h>#include <linux/interrupt.h>#include <linux/proc_fs.h>#include <linux/delay.h>#include <linux/timer.h>#include <linux/pm.h>#include <linux/mmc/mmc_ll.h>#include <linux/pci.h>#include <asm/irq.h>#include <asm/unaligned.h>#include <asm/io.h>#include <asm/jzsoc.h>/* Device-specific data */typedef struct jz_mmc_data {	struct mmc_request *	request;	int			sd;	int			dma_rx_ch;	int			dma_tx_ch;	int                     use_4bit;	u32			events;	u32			clock;} jz_mmc_data_t;static jz_mmc_data_t jz_mmc_data;/* MMC Events */#define MMC_EVENT_NONE	        0x00	/* No events */#define MMC_EVENT_RX_DMA_DONE	0x01	/* Rx DMA done */#define MMC_EVENT_TX_DMA_DONE	0x02	/* Tx DMA done */#define MMC_EVENT_DATA_DONE	0x04	/* Data Transfer done */#define MMC_EVENT_PROG_DONE	0x08	/* Programming is done *//* Stop the MMC clock and wait while it happens */static inline int jz_mmc_stop_clock(void){	int timeout = 1000;		DEBUG(2, "stop MMC clock\n");	REG_MSC_STRPCL = MSC_STRPCL_CLOCK_CONTROL_STOP;	while (timeout && (REG_MSC_STAT & MSC_STAT_CLK_EN)) {		timeout--;		if (timeout == 0) {			DEBUG(3, "Timeout on stop clock waiting\n");			return MMC_ERROR_TIMEOUT;		}		udelay(1);	}	DEBUG(2, "clock off time is %d microsec\n", timeout);        return MMC_NO_ERROR;}/* Start the MMC clock and operation */static inline int jz_mmc_start_clock(void){	REG_MSC_STRPCL = MSC_STRPCL_CLOCK_CONTROL_START | MSC_STRPCL_START_OP;	return MMC_NO_ERROR;}static inline u32 jz_mmc_calc_clkrt(int is_sd, u32 rate){	u32 clkrt;	u32 clk_src = is_sd ? 24000000: 16000000;	clkrt = 0;  	while (rate < clk_src)    	{      		clkrt ++;      		clk_src >>= 1;    	}	return clkrt;}/* Select the MMC clock frequency */static int jz_mmc_set_clock(u32 rate){	int clkrt;	jz_mmc_stop_clock();	__cpm_select_msc_clk(jz_mmc_data.sd); /* select clock source from CPM */	clkrt = jz_mmc_calc_clkrt(jz_mmc_data.sd, rate);	DEBUG(2, "set clock to %u Hz is_sd=%d clkrt=%d\n", 	      rate, jz_mmc_data.sd, clkrt);	REG_MSC_CLKRT = clkrt;	jz_mmc_data.clock = rate;	return MMC_NO_ERROR;}/* Initialize the MMC controller to up the slot, assuming the card is in slot */void jz_mmc_slot_up(void){	DEBUG(2, "Init MMC h/w\n");	/* Init GPIO */	__gpio_as_msc();	/* Turn on power for the slot */	__msc_init_io();	__msc_enable_power();		/* Turn on core clock signal for the MMC/SC controller  */	__cpm_select_msc_clk(0); /* select 19MHz clock to MSC module */	__msc_set_clkrt(7);      /* lowest clock to MMC/SD card */	        /* Stop the MMC clock before 1st command */	jz_mmc_stop_clock();}/* Shut down the slot */void jz_mmc_slot_down(void){	DEBUG(2, "down MMC h/w\n");	/* Turn off MMC clock */	jz_mmc_stop_clock();	/* Turn off power for the slot */	__msc_disable_power();}/* Complete the request processing */static inline void jz_mmc_request_complete(struct jz_mmc_data *mmc, 					   enum mmc_result_t result){	struct mmc_request *req = mmc->request;	if (!req) return;	jz_mmc_stop_clock();	req->result = result;	mmc_cmd_complete(req);	mmc->request = NULL;}static inline voidjz_mmc_start_dma(int chan, unsigned long phyaddr,int count, int mode){	unsigned long flags;	flags = claim_dma_lock();	disable_dma(chan);	clear_dma_ff(chan);	jz_set_dma_block_size(chan, 32);	set_dma_mode(chan, mode);	set_dma_addr(chan, phyaddr);	set_dma_count(chan, count + 31);	enable_dma(chan);	release_dma_lock(flags);}static void jz_mmc_dma_rx_start(struct jz_mmc_data *mmc);/* Handle DMA data receive completion */static void jz_mmc_dma_rx_callback(int irq, void *data, 				   struct pt_regs *regs){	struct jz_mmc_data *mmc = data;	int channel = jz_mmc_data.dma_rx_ch;	DEBUG(3, "DMA RX Callback: MMC_STAT 0x%08x "		 "I_REG 0x%08x I_MASK 0x%08x\n",	      REG_MSC_STAT, REG_MSC_IREG, REG_MSC_IMASK);	disable_dma(channel);	if (__dmac_channel_address_error_detected(channel)) {		printk(KERN_DEBUG "%s: DMAC address error.\n", __FUNCTION__);		__dmac_channel_clear_address_error(channel);	}	if (__dmac_channel_transmit_end_detected(channel)) {		__dmac_channel_clear_transmit_end(channel);		mmc->events &= ~MMC_EVENT_RX_DMA_DONE;		if (mmc->events == 0) {			jz_mmc_request_complete(mmc, MMC_NO_ERROR);		}	}}/* Prepare DMA to start data transfer from the MMC card */static void jz_mmc_dma_rx_start(struct jz_mmc_data *mmc){	struct mmc_request *request = mmc->request;	int channel = mmc->dma_rx_ch; 	dma_addr_t dma_addr = PHYSADDR(request->buffer);	u32 size = request->block_len * request->nob;	DEBUG(3, "MMC DMA Rx start: chan %d buf 0x%08x phys 0x%08x "		 "blklen %d nob%d\n",		 channel, (u32)request->buffer, (u32)dma_addr,		 request->block_len, request->nob);	dma_cache_wback_inv((unsigned int)request->buffer, size);	jz_mmc_start_dma(channel, dma_addr, size, DMA_MODE_READ);}static void jz_mmc_dma_tx_start(struct jz_mmc_data *mmc);/* Handle transmit DMA competion */static void jz_mmc_dma_tx_callback(int irq, void *data, 				    struct pt_regs *regs){	struct jz_mmc_data *mmc = data;	int channel = jz_mmc_data.dma_tx_ch;		DEBUG(3, "DMA TX Callback\n");	disable_dma(channel);	if (__dmac_channel_address_error_detected(channel)) {		__dmac_channel_clear_address_error(channel);	}	if (__dmac_channel_transmit_end_detected(channel)) {		__dmac_channel_clear_transmit_end(channel);		mmc->events &= ~MMC_EVENT_TX_DMA_DONE;		if (mmc->events == 0) {			jz_mmc_request_complete(mmc, MMC_NO_ERROR);		}	}}/* Prepare DMA to start data transfer to the MMC card */static void jz_mmc_dma_tx_start(struct jz_mmc_data *mmc){	struct mmc_request *request = mmc->request;	int channel = mmc->dma_tx_ch;	dma_addr_t dma_addr = PHYSADDR(request->buffer);	u32 size = request->block_len * request->nob;	DEBUG(3, "MMC DMA Tx start: chan %d buf 0x%08x phys 0x%08x "		 "blklen %d nob%d\n",		 channel, (u32)request->buffer, (u32)dma_addr,		 request->block_len, request->nob);	dma_cache_wback_inv((unsigned int)request->buffer, size);	jz_mmc_start_dma(channel, dma_addr, size, DMA_MODE_WRITE);}static int jz_mmc_check_status(struct mmc_request *request){	u32 status = REG_MSC_STAT;	/* Checking for response or data timeout */	if (status & (MSC_STAT_TIME_OUT_RES | MSC_STAT_TIME_OUT_READ)) {		printk("MMC/SD timeout, MMC_STAT 0x%x\n", status);		return MMC_ERROR_TIMEOUT;	}	/* Checking for CRC error */	if (status & (MSC_STAT_CRC_READ_ERROR | MSC_STAT_CRC_WRITE_ERROR | MSC_STAT_CRC_RES_ERR)) {		printk("MMC/CD CRC error, MMC_STAT 0x%x\n", status);		return MMC_ERROR_CRC;	}	return MMC_NO_ERROR;}/* Obtain response to the command and store it to response buffer */static void jz_mmc_get_response(struct mmc_request *request){	int i;	u8 *buf;	u32 data;	DEBUG(2, "fetch response for request %d, cmd %d\n", request->rtype, request->cmd);	buf = request->response;	request->result = MMC_NO_ERROR;	switch (request->rtype) {	case RESPONSE_R1: case RESPONSE_R1B: case RESPONSE_R6:	case RESPONSE_R3: case RESPONSE_R4: case RESPONSE_R5:	{		data = REG_MSC_RES;		buf[0] = (data >> 8) & 0xff;		buf[1] = data & 0xff;		data = REG_MSC_RES;		buf[2] = (data >> 8) & 0xff;		buf[3] = data & 0xff;		data = REG_MSC_RES;		buf[4] = data & 0xff;		DEBUG(3, "request %d, response [%02x %02x %02x %02x %02x]\n",		      request->rtype, buf[0], buf[1], buf[2], buf[3], buf[4]);		break;	}	case RESPONSE_R2_CID: case RESPONSE_R2_CSD:	{		for (i = 0; i < 16; i += 2) {			data = REG_MSC_RES;			buf[i] = (data >> 8) & 0xff;			buf[i+1] = data & 0xff;		}		DEBUG(3, "request %d, response [", request->rtype);#if CONFIG_MMC_DEBUG_VERBOSE > 2		if (g_mmc_debug >= 3) {			int n;			for (n = 0; n < 17; n++)				printk("%02x ", buf[n]);			printk("]\n");		}#endif		break;	}	case RESPONSE_NONE:		DEBUG(3, "No response\n");		break;			default:		DEBUG(3, "unhandled response type for request %d\n", request->rtype);		break;	}}/* Prepare MMC controller for card command execution */static int jz_mmc_exec_command(struct mmc_request *request){	struct jz_mmc_data *mmc = &jz_mmc_data;	u32 cmdat = 0, timeout = 0x3fffff;	int retval;	/* stop MMC clock */	jz_mmc_stop_clock();	/* mask interrupts */	REG_MSC_IMASK = 0xffff;	/* clear status */	REG_MSC_IREG = 0xffff;	/* use 4-bit bus width when possible */	if (jz_mmc_data.use_4bit) 		cmdat |= MSC_CMDAT_BUS_WIDTH_4BIT;        /* Set command type and events */ 	mmc->events = MMC_EVENT_NONE;	switch (request->cmd) {	/* MMC core extra command */	case MMC_CIM_RESET:		cmdat |= MSC_CMDAT_INIT; /* Initialization sequence sent prior to command */		break;	/* bc - broadcast - no response */	case MMC_GO_IDLE_STATE:	case MMC_SET_DSR:		break;	/* bcr - broadcast with response */	case MMC_SEND_OP_COND:	case MMC_ALL_SEND_CID:	case MMC_GO_IRQ_STATE:		break;	/* adtc - addressed with data transfer */	case MMC_READ_DAT_UNTIL_STOP:	case MMC_READ_SINGLE_BLOCK:	case MMC_READ_MULTIPLE_BLOCK:		cmdat |= MSC_CMDAT_DATA_EN | MSC_CMDAT_READ | MSC_CMDAT_DMA_EN;		mmc->events = MMC_EVENT_RX_DMA_DONE | MMC_EVENT_DATA_DONE;		break;	case SEND_SCR:		cmdat |= MSC_CMDAT_DATA_EN | MSC_CMDAT_READ;		mmc->events = MMC_EVENT_DATA_DONE;		break;	case MMC_WRITE_DAT_UNTIL_STOP:	case MMC_WRITE_BLOCK:	case MMC_WRITE_MULTIPLE_BLOCK:	case MMC_PROGRAM_CID:	case MMC_PROGRAM_CSD:	case MMC_SEND_WRITE_PROT:	case MMC_GEN_CMD:	case MMC_LOCK_UNLOCK:		cmdat |= MSC_CMDAT_DATA_EN | MSC_CMDAT_WRITE | MSC_CMDAT_DMA_EN;		mmc->events = MMC_EVENT_TX_DMA_DONE | MMC_EVENT_DATA_DONE | MMC_EVENT_PROG_DONE;		break;	case MMC_STOP_TRANSMISSION:		mmc->events = MMC_EVENT_PROG_DONE;		break;	/* ac - no data transfer */	default: 		break;	}	/* Set response type */	switch (request->rtype) {	case RESPONSE_NONE:		break;	case RESPONSE_R1B:		cmdat |= MSC_CMDAT_BUSY;		/*FALLTHRU*/	case RESPONSE_R1:		cmdat |= MSC_CMDAT_RESPONSE_R1;		break;	case RESPONSE_R2_CID:	case RESPONSE_R2_CSD:		cmdat |= MSC_CMDAT_RESPONSE_R2;		break;	case RESPONSE_R3:		cmdat |= MSC_CMDAT_RESPONSE_R3;		break;	case RESPONSE_R4:		cmdat |= MSC_CMDAT_RESPONSE_R4;		break;	case RESPONSE_R5:		cmdat |= MSC_CMDAT_RESPONSE_R5;		break;	case RESPONSE_R6:		cmdat |= MSC_CMDAT_RESPONSE_R6;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久精品99国产精品日本| 在线亚洲高清视频| 色噜噜狠狠色综合中国| 日韩欧美二区三区| 一区二区三区中文在线观看| 国产在线精品一区二区夜色| 色婷婷av久久久久久久| 国产亚洲精品aa| 看片的网站亚洲| 欧美精选在线播放| 一区二区三区产品免费精品久久75| 精品写真视频在线观看| 色欧美片视频在线观看在线视频| 国产午夜精品久久久久久免费视| 日韩二区三区在线观看| 一本色道久久综合亚洲aⅴ蜜桃 | 中文字幕一区二区三区不卡在线| 日本va欧美va欧美va精品| 91精品91久久久中77777| 国产精品日日摸夜夜摸av| 国产美女视频91| 亚洲精品一区二区精华| 免费成人在线影院| 91精品国产色综合久久不卡电影| 亚洲国产视频a| 欧美日韩精品欧美日韩精品一| 亚洲欧美日韩在线播放| 成人av在线电影| 中文字幕日韩av资源站| av一区二区三区| 久久精品国产一区二区三| 欧美色倩网站大全免费| 亚洲国产一区在线观看| 在线成人免费视频| 日韩综合在线视频| 欧美一区二区在线免费播放| 欧美a级理论片| 精品成人免费观看| 国产99久久久国产精品潘金网站| 欧美精品一区二区精品网| 精品一区精品二区高清| 久久免费午夜影院| 大胆欧美人体老妇| 日韩久久一区二区| 在线观看不卡一区| 免费久久99精品国产| 精品国产sm最大网站| 成人av影视在线观看| 亚洲一区在线看| 日韩欧美区一区二| 不卡视频一二三四| 午夜精品久久久久久久久久久 | 欧美午夜精品一区二区蜜桃| 亚洲国产成人tv| 欧美成人一区二区三区| 国产宾馆实践打屁股91| 亚洲另类春色校园小说| 666欧美在线视频| 国产精品综合视频| 亚洲综合偷拍欧美一区色| 91精品综合久久久久久| 国产成人高清在线| 亚洲午夜羞羞片| 久久精品亚洲精品国产欧美kt∨| 99在线精品视频| 日日摸夜夜添夜夜添国产精品 | eeuss鲁一区二区三区| 亚洲在线成人精品| 精品国产凹凸成av人网站| 97久久超碰精品国产| 日韩和欧美一区二区| 中文字幕的久久| 51精品视频一区二区三区| 成人综合婷婷国产精品久久蜜臀 | 国产精品伦一区二区三级视频| 欧美日韩视频在线一区二区| 国产一区啦啦啦在线观看| 亚洲精品欧美激情| 久久久精品国产免大香伊| 欧美在线看片a免费观看| 精品无码三级在线观看视频| 亚洲精品va在线观看| 国产欧美精品一区二区色综合 | 91麻豆国产福利在线观看| 韩国在线一区二区| 亚洲国产成人av网| 中文字幕永久在线不卡| 日韩美女一区二区三区四区| 色婷婷精品久久二区二区蜜臂av| 国产综合久久久久久久久久久久| 亚洲午夜私人影院| 亚洲欧美日韩国产综合| 久久精品免视看| 欧美成人官网二区| 7777精品伊人久久久大香线蕉的| 94-欧美-setu| 99这里都是精品| 风流少妇一区二区| 国产东北露脸精品视频| 久久超碰97人人做人人爱| 亚洲国产一区二区视频| 亚洲日本va午夜在线影院| 国产日韩av一区二区| 精品日韩一区二区三区免费视频| 欧美精品v国产精品v日韩精品| 不卡影院免费观看| 成人国产免费视频| 波多野洁衣一区| www.欧美日韩| 91网站最新网址| 色综合天天综合狠狠| 91麻豆福利精品推荐| 色综合av在线| 欧洲日韩一区二区三区| 欧美在线视频你懂得| 色猫猫国产区一区二在线视频| 99精品欧美一区二区蜜桃免费 | 国产成a人无v码亚洲福利| 国产在线精品不卡| 国产成人啪免费观看软件| 国产激情偷乱视频一区二区三区| 国产精品夜夜嗨| 粗大黑人巨茎大战欧美成人| a美女胸又www黄视频久久| 99re在线视频这里只有精品| 99精品视频一区| 欧美色电影在线| 日韩精品资源二区在线| 久久精品夜色噜噜亚洲a∨| 中文av一区二区| 亚洲久本草在线中文字幕| 亚洲在线中文字幕| 久久疯狂做爰流白浆xx| 国产精品资源在线观看| 99国产精品国产精品久久| 欧美日韩国产一级| 日韩视频免费观看高清完整版在线观看 | 国产欧美一区二区精品婷婷| 国产精品伦一区| 亚洲成人在线网站| 蜜臀国产一区二区三区在线播放| 激情综合色播激情啊| 99在线视频精品| 欧美一级黄色片| 国产精品久久综合| 午夜精品福利一区二区三区av| 开心九九激情九九欧美日韩精美视频电影| 国产在线视频不卡二| 91在线国产观看| 日韩一区二区三区四区五区六区 | 宅男噜噜噜66一区二区66| 久久久99免费| 亚洲成a人片综合在线| 国产999精品久久久久久绿帽| 色哟哟亚洲精品| 久久亚洲一级片| 亚洲成人综合网站| 成人激情视频网站| 欧美一区中文字幕| 亚洲欧美一区二区视频| 麻豆精品视频在线观看免费| 91免费国产在线| 26uuuu精品一区二区| 午夜精彩视频在线观看不卡| 国产成人精品免费网站| 欧美精品在线一区二区| 亚洲精品免费在线观看| 国产精品一区在线观看乱码| 欧美日韩小视频| 亚洲天堂中文字幕| 国产一区二区在线看| 欧美性videosxxxxx| 国产精品美女久久久久久久网站| 日韩高清不卡一区二区三区| 色婷婷久久综合| 国产色婷婷亚洲99精品小说| 久久aⅴ国产欧美74aaa| 欧美三级视频在线观看| 亚洲日本va午夜在线电影| 成人在线综合网| 26uuu成人网一区二区三区| 美国十次综合导航| 制服丝袜亚洲网站| 亚洲国产精品一区二区尤物区| 播五月开心婷婷综合| 国产亚洲精品超碰| 国产一本一道久久香蕉| 欧美电影免费观看完整版| 日本欧美韩国一区三区| 欧美福利视频导航| 亚洲高清在线精品| 欧美色涩在线第一页| 亚洲一级不卡视频| 欧美综合在线视频| 亚洲成人av电影在线| 欧美视频在线一区| 亚洲成人av在线电影| 欧美日韩国产高清一区二区三区| 亚洲一区二区三区四区中文字幕| 在线免费不卡视频|