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

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

?? s3c2410mci.c

?? 這是S3C2410的SD卡測(cè)試程序
?? C
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
/* *  linux/drivers/mmc/s3c2410mci.h - Samsung S3C2410 SDI Interface driver * *  Copyright (C) 2004 Thomas Kleffel, All Rights Reserved. * * 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. */#include <linux/config.h>#include <linux/module.h>#include <linux/moduleparam.h>#include <linux/init.h>#include <linux/ioport.h>#include <linux/device.h>#include <linux/interrupt.h>#include <linux/blkdev.h>#include <linux/delay.h>#include <linux/err.h>#include <linux/dma-mapping.h>#include <linux/mmc/host.h>#include <linux/mmc/protocol.h>//#include <linux/clk.h>#include <asm/dma.h>#include <asm/dma-mapping.h>#include <asm/arch/dma.h>#include <asm/io.h>#include <asm/irq.h>#include <asm/hardware/clock.h>#include <asm/mach/mmc.h>#include <asm/arch/regs-sdi.h>#include <asm/arch/regs-gpio.h>#include <asm/arch/mmc.h>#include <asm/arch/regs-clock.h>//#define S3C2410SDI_DMA_BACKBUF#ifdef CONFIG_MMC_DEBUG#define DBG(x...)       printk(KERN_INFO x)#else#define DBG(x...)       do { } while (0)#endif#include "s3c2410mci.h"#define DRIVER_NAME "mmci-s3c2410"#define PFX DRIVER_NAME ": "#define RESSIZE(ressource) (((ressource)->end - (ressource)->start)+1)static struct s3c2410_dma_client s3c2410sdi_dma_client = {	.name		= "s3c2410-sdi",};/* * ISR for SDI Interface IRQ * Communication between driver and ISR works as follows: *   host->mrq 			points to current request *   host->complete_what	tells the ISR when the request is considered done *     COMPLETION_CMDSENT	  when the command was sent *     COMPLETION_RSPFIN          when a response was received *     COMPLETION_XFERFINISH	  when the data transfer is finished *     COMPLETION_XFERFINISH_RSPFIN both of the above. *   host->complete_request	is the completion-object the driver waits for * * 1) Driver sets up host->mrq and host->complete_what * 2) Driver prepares the transfer * 3) Driver enables interrupts * 4) Driver starts transfer * 5) Driver waits for host->complete_rquest * 6) ISR checks for request status (errors and success) * 6) ISR sets host->mrq->cmd->error and host->mrq->data->error * 7) ISR completes host->complete_request * 8) ISR disables interrupts * 9) Driver wakes up and takes care of the request*/static irqreturn_t s3c2410sdi_irq(int irq, void *dev_id, struct pt_regs *regs){	struct s3c2410sdi_host *host;	u32 sdi_csta, sdi_dsta, sdi_dcnt;	u32 sdi_cclear, sdi_dclear;	unsigned long iflags;	host = (struct s3c2410sdi_host *)dev_id;	//Check for things not supposed to happen	if(!host) return IRQ_HANDLED;		sdi_csta 	= readl(host->base + S3C2410_SDICMDSTAT);	sdi_dsta 	= readl(host->base + S3C2410_SDIDSTA);	sdi_dcnt 	= readl(host->base + S3C2410_SDIDCNT);		DBG(PFX "IRQ csta=0x%08x dsta=0x%08x dcnt:0x%08x\n", sdi_csta, sdi_dsta, sdi_dcnt);			spin_lock_irqsave( &host->complete_lock, iflags);		if( host->complete_what==COMPLETION_NONE ) {		goto clear_imask;	}		if(!host->mrq) { 		goto clear_imask;	}		sdi_csta 	= readl(host->base + S3C2410_SDICMDSTAT);	sdi_dsta 	= readl(host->base + S3C2410_SDIDSTA);	sdi_dcnt 	= readl(host->base + S3C2410_SDIDCNT);	sdi_cclear	= 0;	sdi_dclear	= 0;			if(sdi_csta & S3C2410_SDICMDSTAT_CMDTIMEOUT) {		host->mrq->cmd->error = MMC_ERR_TIMEOUT;		goto transfer_closed;	}	if(sdi_csta & S3C2410_SDICMDSTAT_CMDSENT) {		if(host->complete_what == COMPLETION_CMDSENT) {			host->mrq->cmd->error = MMC_ERR_NONE;			goto transfer_closed;		}		sdi_cclear |= S3C2410_SDICMDSTAT_CMDSENT;	}		if(sdi_csta & S3C2410_SDICMDSTAT_CRCFAIL) {		if (host->mrq->cmd->flags & MMC_RSP_LONG) {			DBG(PFX "s3c2410 fixup : ignore CRC fail with long rsp\n");		}		else {			DBG(PFX "COMMAND CRC FAILED %x\n", sdi_csta);			if(host->mrq->cmd->flags & MMC_RSP_CRC) {				host->mrq->cmd->error = MMC_ERR_BADCRC;				goto transfer_closed;			}		}		sdi_cclear |= S3C2410_SDICMDSTAT_CRCFAIL;	}	if(sdi_csta & S3C2410_SDICMDSTAT_RSPFIN) {		if(host->complete_what == COMPLETION_RSPFIN) {			host->mrq->cmd->error = MMC_ERR_NONE;			goto transfer_closed;		}		if(host->complete_what == COMPLETION_XFERFINISH_RSPFIN) {			host->mrq->cmd->error = MMC_ERR_NONE;			host->complete_what = COMPLETION_XFERFINISH;		}		sdi_cclear |= S3C2410_SDICMDSTAT_RSPFIN;	}	if(sdi_dsta & S3C2410_SDIDSTA_FIFOFAIL) {		host->mrq->cmd->error = MMC_ERR_NONE;		host->mrq->data->error = MMC_ERR_FIFO;		goto transfer_closed;	}	if(sdi_dsta & S3C2410_SDIDSTA_RXCRCFAIL) {		host->mrq->cmd->error = MMC_ERR_NONE;		host->mrq->data->error = MMC_ERR_BADCRC;		goto transfer_closed;	}	if(sdi_dsta & S3C2410_SDIDSTA_CRCFAIL) {		host->mrq->cmd->error = MMC_ERR_NONE;		host->mrq->data->error = MMC_ERR_BADCRC;		goto transfer_closed;	}	if(sdi_dsta & S3C2410_SDIDSTA_DATATIMEOUT) {		host->mrq->cmd->error = MMC_ERR_NONE;		host->mrq->data->error = MMC_ERR_TIMEOUT;		goto transfer_closed;	}	if(sdi_dsta & S3C2410_SDIDSTA_XFERFINISH) {		if(host->complete_what == COMPLETION_XFERFINISH) {			host->mrq->cmd->error = MMC_ERR_NONE;			host->mrq->data->error = MMC_ERR_NONE;			goto transfer_closed;		}		if(host->complete_what == COMPLETION_XFERFINISH_RSPFIN) {			host->mrq->data->error = MMC_ERR_NONE;			host->complete_what = COMPLETION_RSPFIN;		}		sdi_dclear |= S3C2410_SDIDSTA_XFERFINISH;	}	writel(sdi_cclear, host->base + S3C2410_SDICMDSTAT);	writel(sdi_dclear, host->base + S3C2410_SDIDSTA);	spin_unlock_irqrestore( &host->complete_lock, iflags);	DBG(PFX "IRQ still waiting.\n");	return IRQ_HANDLED;transfer_closed:	writel(sdi_cclear, host->base + S3C2410_SDICMDSTAT);	writel(sdi_dclear, host->base + S3C2410_SDIDSTA);	host->complete_what = COMPLETION_NONE;	complete(&host->complete_request);	writel(0, host->base + S3C2410_SDIIMSK);	spin_unlock_irqrestore( &host->complete_lock, iflags);	DBG(PFX "IRQ transfer closed.\n");	return IRQ_HANDLED;	clear_imask:	writel(0, host->base + S3C2410_SDIIMSK);	spin_unlock_irqrestore( &host->complete_lock, iflags);	DBG(PFX "IRQ clear imask.\n");	return IRQ_HANDLED;}/* * ISR for the CardDetect Pin*/static irqreturn_t s3c2410sdi_irq_cd(int irq, void *dev_id, struct pt_regs *regs){	struct s3c2410sdi_host *host = (struct s3c2410sdi_host *)dev_id;	//printk("s3c2410sdi_irq_cd\n");	mmc_detect_change(host->mmc, S3C2410SDI_CDLATENCY);	return IRQ_HANDLED;}void s3c2410sdi_dma_done_callback(s3c2410_dma_chan_t *dma_ch, void *buf_id,	int size, s3c2410_dma_buffresult_t result){	unsigned long iflags;	u32 sdi_csta, sdi_dsta,sdi_dcnt;	struct s3c2410sdi_host *host = (struct s3c2410sdi_host *)buf_id;		sdi_csta 	= readl(host->base + S3C2410_SDICMDSTAT);	sdi_dsta 	= readl(host->base + S3C2410_SDIDSTA);	sdi_dcnt 	= readl(host->base + S3C2410_SDIDCNT);		DBG(PFX "DMAD csta=0x%08x dsta=0x%08x dcnt:0x%08x result:0x%08x\n", sdi_csta, sdi_dsta, sdi_dcnt, result);		spin_lock_irqsave( &host->complete_lock, iflags);		if(!host->mrq) goto out;	if(!host->mrq->data) goto out;			sdi_csta 	= readl(host->base + S3C2410_SDICMDSTAT);	sdi_dsta 	= readl(host->base + S3C2410_SDIDSTA);	sdi_dcnt 	= readl(host->base + S3C2410_SDIDCNT);			if( result!=S3C2410_RES_OK ) {		goto fail_request;	}			if(host->mrq->data->flags & MMC_DATA_READ) {		if( sdi_dcnt>0 ) {			goto fail_request;		}	}	out:		complete(&host->complete_dma);	spin_unlock_irqrestore( &host->complete_lock, iflags);	return;fail_request:	host->mrq->data->error = MMC_ERR_FAILED;	host->complete_what = COMPLETION_NONE;	complete(&host->complete_request);	writel(0, host->base + S3C2410_SDIIMSK);	goto out;}void s3c2410sdi_dma_setup(struct s3c2410sdi_host *host, s3c2410_dmasrc_t source)  {	s3c2410_dma_devconfig(host->dma, source, 3, host->mem->start + S3C2410_SDIDATA);	s3c2410_dma_config(host->dma, 4, (1<<23) | (2<<24));	s3c2410_dma_set_buffdone_fn(host->dma, s3c2410sdi_dma_done_callback);	s3c2410_dma_setflags(host->dma, S3C2410_DMAF_AUTOSTART);}static void s3c2410sdi_request(struct mmc_host *mmc, struct mmc_request *mrq) {	struct s3c2410sdi_host *host = mmc_priv(mmc);	struct device *dev = mmc_dev(host->mmc);	struct platform_device *pdev = to_platform_device(dev);	u32 sdi_carg, sdi_ccon, sdi_timer;	u32 sdi_bsize, sdi_dcon, sdi_imsk;	int dma_len = 0;	//u32 sdi_con;	DBG(KERN_DEBUG PFX "request: [CMD] opcode:0x%02d arg:0x%08x flags:%x retries:%u\n",		mrq->cmd->opcode, mrq->cmd->arg, mrq->cmd->flags, mrq->cmd->retries);	DBG(PFX "request : %s mode\n",mmc->mode == MMC_MODE_MMC ? "mmc" : "sd");	sdi_ccon = mrq->cmd->opcode & S3C2410_SDICMDCON_INDEX;	sdi_ccon|= S3C2410_SDICMDCON_SENDERHOST;	sdi_ccon|= S3C2410_SDICMDCON_CMDSTART;	sdi_carg = mrq->cmd->arg;	//FIXME: Timer value ?!	sdi_timer= 0xF000;	sdi_bsize= 0;	sdi_dcon = 0;	sdi_imsk = 0;	//enable interrupts for transmission errors	sdi_imsk |= S3C2410_SDIIMSK_RESPONSEND;	sdi_imsk |= S3C2410_SDIIMSK_CRCSTATUS;	host->complete_what = COMPLETION_CMDSENT;	if (mrq->cmd->flags & MMC_RSP_MASK) {		host->complete_what = COMPLETION_RSPFIN;		sdi_ccon |= S3C2410_SDICMDCON_WAITRSP;		sdi_imsk |= S3C2410_SDIIMSK_CMDTIMEOUT;	} else {		//We need the CMDSENT-Interrupt only if we want are not waiting		//for a response		sdi_imsk |= S3C2410_SDIIMSK_CMDSENT;	}	if(mrq->cmd->flags & MMC_RSP_LONG) {		sdi_ccon|= S3C2410_SDICMDCON_LONGRSP;	}	if(mrq->cmd->flags & MMC_RSP_CRC) {		sdi_imsk |= S3C2410_SDIIMSK_RESPONSECRC;	}	if (mrq->data) {		host->complete_what = COMPLETION_XFERFINISH_RSPFIN;		sdi_bsize = (1 << mrq->data->blksz_bits);		//fifo reset		//sdi_con = readl(host->base + S3C2410_SDICON);		//sdi_con|= S3C2410_SDICON_FIFORESET;		//writel(sdi_con, host->base + S3C2410_SDICON);		sdi_dcon  = (mrq->data->blocks & S3C2410_SDIDCON_BLKNUM_MASK);		sdi_dcon |= S3C2410_SDIDCON_DMAEN;		sdi_imsk |= S3C2410_SDIIMSK_FIFOFAIL;		sdi_imsk |= S3C2410_SDIIMSK_DATACRC;		sdi_imsk |= S3C2410_SDIIMSK_DATATIMEOUT;		sdi_imsk |= S3C2410_SDIIMSK_DATAFINISH;		sdi_imsk |= 0xFFFFFFE0;		DBG(PFX "request: [DAT] bsize:%u blocks:%u bytes:%u\n",			sdi_bsize, mrq->data->blocks, mrq->data->blocks * sdi_bsize);		if (host->bus_width == MMC_BUS_WIDTH_4)  {			sdi_dcon |= S3C2410_SDIDCON_WIDEBUS;		}		if(!(mrq->data->flags & MMC_DATA_STREAM)) {			sdi_dcon |= S3C2410_SDIDCON_BLOCKMODE;		}		if(mrq->data->flags & MMC_DATA_WRITE) {			sdi_dcon |= S3C2410_SDIDCON_TXAFTERRESP;			sdi_dcon |= S3C2410_SDIDCON_XFER_TXSTART;		

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久久精品免费免费| 亚洲二区在线观看| 久久精品亚洲一区二区三区浴池| 国产欧美精品一区aⅴ影院 | 久久久99免费| 日韩精品最新网址| 日韩一区和二区| 欧美日韩电影一区| 欧美精品日日鲁夜夜添| 欧美人成免费网站| 欧美一区二区三区视频免费播放| 国产成人精品一区二区三区四区| 自拍偷在线精品自拍偷无码专区| 欧美一区二区日韩一区二区| 7777精品伊人久久久大香线蕉的 | 久久精品国产免费| 日本亚洲视频在线| 久久超碰97人人做人人爱| 九色综合狠狠综合久久| 国产乱码精品一区二区三区av| 亚洲成年人影院| 免费观看日韩av| 国产一区二区免费看| 成人午夜伦理影院| 一本大道av一区二区在线播放| 精品亚洲免费视频| 粉嫩久久99精品久久久久久夜| 日韩va欧美va亚洲va久久| 久久99精品网久久| 成人av动漫网站| 欧美视频一区二区| 亚洲精品在线观看网站| 国产精品美女久久久久久| 亚洲欧美乱综合| 日韩在线一区二区三区| 国产高清在线观看免费不卡| aa级大片欧美| 日韩一区二区三区四区五区六区| 欧美色视频在线| 精品国产乱码久久久久久牛牛| 欧美精品电影在线播放| 精品裸体舞一区二区三区| 欧美国产成人在线| 亚洲国产精品欧美一二99| 国产一区二区三区久久悠悠色av| 蜜臀av一区二区| 风间由美性色一区二区三区| 在线免费观看日本一区| 久久蜜臀精品av| 亚洲午夜视频在线| 国产成人自拍高清视频在线免费播放| 久久99精品国产.久久久久久| 日韩成人免费电影| 成人黄色在线视频| 欧美一区二区久久久| 中文字幕亚洲区| 人妖欧美一区二区| 99re视频精品| 精品国产乱码久久久久久夜甘婷婷| 欧美mv和日韩mv的网站| 亚洲激情自拍视频| 国产精品白丝jk黑袜喷水| 在线看不卡av| 亚洲国产成人在线| 蜜乳av一区二区三区| 欧美中文字幕一二三区视频| 国产午夜精品久久| 美女一区二区三区在线观看| 色国产综合视频| 欧美—级在线免费片| 麻豆成人久久精品二区三区红| 精品一区在线看| 欧美日韩国产区一| 亚洲人吸女人奶水| 国产福利一区在线| 欧美大胆人体bbbb| 五月天激情综合| 日本高清不卡aⅴ免费网站| 国产午夜亚洲精品午夜鲁丝片 | 亚洲综合免费观看高清完整版在线| 一区二区三区鲁丝不卡| 国产乱妇无码大片在线观看| 在线不卡免费av| 亚洲图片一区二区| av不卡在线播放| 中文字幕第一区| 国产成人综合在线| 久久美女艺术照精彩视频福利播放| 日本一区二区成人| 激情欧美日韩一区二区| 欧美一区二区在线播放| 亚洲不卡在线观看| 欧美视频中文一区二区三区在线观看| 91精品国产综合久久久久久漫画| 2020国产精品久久精品美国| 青青草国产成人av片免费| 337p日本欧洲亚洲大胆色噜噜| 国产日韩精品一区| 国产精品综合二区| 久久网站热最新地址| 国产一区二区三区免费看| 精品国产乱码久久久久久老虎| 综合欧美一区二区三区| 波多野结衣在线aⅴ中文字幕不卡| 欧美日韩免费视频| 五月激情六月综合| 欧美日韩国产电影| 日本中文在线一区| 日韩欧美电影一二三| 久草精品在线观看| 久久久国产精华| 国产成人aaa| 亚洲欧美中日韩| 91激情五月电影| 亚洲大片在线观看| 欧美一级艳片视频免费观看| 麻豆国产精品一区二区三区 | 精品国产在天天线2019| 精品一区二区三区香蕉蜜桃 | 99精品一区二区三区| 中文字幕一区二区在线观看| 成人激情开心网| 亚洲美女淫视频| 欧美丰满美乳xxx高潮www| 精品中文字幕一区二区小辣椒 | 欧美zozozo| 国产成人精品www牛牛影视| 国产精品国模大尺度视频| 99精品黄色片免费大全| 亚洲午夜久久久| 日韩欧美成人一区二区| 国产91露脸合集magnet| 亚洲美女视频在线| 欧美日韩高清一区二区不卡| 老司机精品视频一区二区三区| 欧美日韩免费观看一区三区| 免费在线观看日韩欧美| 久久蜜臀中文字幕| 91香蕉视频在线| 日本aⅴ亚洲精品中文乱码| 久久久精品黄色| 日本乱码高清不卡字幕| 麻豆国产精品一区二区三区| 国产精品卡一卡二| 欧美日产在线观看| 国产成人午夜精品影院观看视频 | 日韩一区二区在线观看| 国产成人精品影院| 亚洲成av人片在www色猫咪| 日韩亚洲欧美一区二区三区| 成人v精品蜜桃久久一区| 午夜精彩视频在线观看不卡| 国产性色一区二区| 国产精品国产精品国产专区不片| 国产成人自拍在线| 亚洲国产日韩av| 欧美精彩视频一区二区三区| 欧美视频在线观看一区二区| 国产成人福利片| 日韩电影在线免费看| 一区免费观看视频| 精品久久国产老人久久综合| 97精品电影院| 国产在线播放一区三区四| 亚洲一区免费观看| 欧美国产日本韩| 欧美大度的电影原声| 欧美日韩一级片在线观看| 丁香天五香天堂综合| 美女免费视频一区二区| 亚洲综合av网| 国产精品久久久久一区二区三区共| 99国产一区二区三精品乱码| 久草在线在线精品观看| 亚洲国产精品影院| 国产精品萝li| 久久先锋影音av| 日韩欧美国产综合一区| 欧美日韩综合在线免费观看| av亚洲精华国产精华精| 国产一区二区免费视频| 美女视频第一区二区三区免费观看网站 | 久久国产精品色婷婷| 一区二区三区国产精品| 国产欧美日韩综合精品一区二区| 99精品偷自拍| 国产99精品在线观看| 久久se精品一区精品二区| 天堂久久久久va久久久久| 亚洲激情图片一区| 亚洲手机成人高清视频| 国产精品美女一区二区| 国产三级一区二区| 久久午夜色播影院免费高清| 日韩欧美亚洲国产精品字幕久久久| 成人综合婷婷国产精品久久蜜臀| 一区二区在线观看免费| 亚洲欧洲另类国产综合| 欧美激情一区在线| 国产日产欧产精品推荐色|