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

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

?? sdc.c

?? 本程序為ST公司開發(fā)的源代碼
?? C
字號:
/************************************************** * * sdc.c * * CVS ID:   $Id: sdc.c,v 1.17 2007/03/19 17:59:41 belardi Exp $ * Author:   Sangwon Bae [swbae] - Optomech * Date:     $Date: 2007/03/19 17:59:41 $ * Revision: $Revision: 1.17 $ *  * Description: *  * *************************************************** *  * COPYRIGHT (C) Optomech  2006 *            All Rights Reserved * *************************************************** * * STM CVS Log: * * $Log: sdc.c,v $ * Revision 1.17  2007/03/19 17:59:41  belardi * Integration of Optomech SDC driver P150307 * * Revision 1.16  2007/02/27 09:29:35  belardi * Optomech patch 070226 * - MMC is supported by SDC driver * * Revision 1.15  2007/02/08 12:39:48  belardi * Optomech driver stability patch P070131 * * Revision 1.14  2006/12/13 09:24:52  belardi * Optomech stability fix for SDC driver (P061212) * * Revision 1.13  2006/11/28 09:28:45  belardi * bug fix from Optomech * * Revision 1.12  2006/09/18 09:55:24  belardi * Corrected CVS keyword usage * * Revision 1.11  2006/09/18 09:25:23  belardi * Added Log CVS keyword into file header * * ***************************************************/#include "gendef.h"#include "hwreg.h"#include "osal.h"#if (1 == HAVE_SDC)#include "hostif_high.h"#include "xfile.h"#include "sdc.h"#include "sdci.h"tU8  sdc_data[SDP_BUFFERLEN];tU32 sdc_nac;SDC_FLAG_STATUS sdc_status;t_fsm sdc_fsm_xfer;tU8   sdc_kick;t_child_cmd_event local_sdc_cmd_event;t_child_cmd_event sdc_cmd_event_data[EVENT_MAX_STAGES];/****************************************************************** * *  SD Card * *****************************************************************//* Init SDC task */void InitSDCTask(void){	sd_init();	sdc_kick = 0;	start_timer(SDC_TIMER, SD_ELAPSE_INSERTION);}/* SDC task */void SDCTask(void *unused){	while (TRUE)	{		OSAL_wait_thread(OSAL_THREAD_SDCTask);				event_disable_scheduling();		event_in_shedule(SDC_CMD_EVENT);		event_enable_scheduling();				sdc_process_preevents();				sdc_transition_handler();				event_disable_scheduling();		event_in_clear(SDC_CMD_EVENT);		event_out_shedule(SDC_STOP_EVENT);		event_out_shedule(SDC_DATA_EVENT);		event_out_shedule(SDC_MOUNT_EVENT);		event_enable_scheduling();      	}}void sd_init(void){	PDB |= 0x1000;      // CS	SD_CLK = SDP_CLOCK_INIT;    // 67.74MHz / 170 = 398.5 kHz < 400 kHz	SD_CSR1.field.bspe = 0;     // BSPI Disable	SD_CSR1.field.mstr = 1;     // BSPI is a master	SD_CSR1.field.rie = 0;	SD_CSR1.field.reie = 0;	SD_CSR1.field.beie = 0;	SD_CSR1.field.cpol = 0;	SD_CSR1.field.cpha = 0;  	SD_CSR1.field.wl = 0;	SD_CSR1.field.rfs = 0;      // 8 Word Rx	SD_CSR2.field.dfifo = 1;     // Clear FIFO	SD_CSR2.field.tfs = 0;      // 8 Word Tx	SD_CSR2.field.tie = 0;	SD_CSR3.field.mask_ss = 1;   // Mask SS	SD_CSR3.field.dma_en = 0;	SD_CSR3.field.tburst_len = 0;	SD_CSR3.field.rburst_len = 10;    // Set as 8	SD_CSR3.field.treq_len = 0;	SD_CSR3.field.rreq_len = 0;	SD_CSR1.field.bspe = 1;      // BSPI Enable	sdc_nac = SDP_NACDEFAULT;	sdc_status.value = SDS_NONE;}void *get_sdc_cmd_event_data(t_event_stage i){	return (void *)&sdc_cmd_event_data[i];}void sdc_process_preevents(void){	if (IS_SDC_CMD_EVENT)	{		local_sdc_cmd_event = SDC_CMD;		switch(local_sdc_cmd_event.command)		{		case CHILD_CMD_XFER_DATA:			FSM_activate(&sdc_fsm_xfer, SDC_DATA_FSM_IDLE, 1);			break;		case CHILD_CMD_BACKGROUND:			sdc_kick = 1;			break;		}	}}void sdc_transition_handler(void){	uint16 sdc_awaited_transitions;	do 	{		sdc_awaited_transitions = 0;		if (FSM_RUN == sdc_fsm_xfer.state)		{			sdc_awaited_transitions |= sdc_xfer_transition();		}	} while(sdc_awaited_transitions);	if(sdc_kick)	{		sdc_test_back();		sdc_kick = 0;	}}uint16 sdc_xfer_transition(void){	static tU32 sdc_begin;	static tU32 sdc_count;	static tU16 sdc_offset;	static tU8* sdc_target;	tU16 sdc_size;		switch (sdc_fsm_xfer.transition)	{	case SDC_DATA_FSM_IDLE:		if(0 == sdc_status.f.Ready)		{			sdc_fsm_xfer.transition = SDC_DATA_FSM_ERROR;			break;		}		sdc_begin = local_sdc_cmd_event.command_params.xfer_params.sector_start << 9;		sdc_count = local_sdc_cmd_event.command_params.xfer_params.count;		sdc_offset = local_sdc_cmd_event.command_params.xfer_params.offset;		sdc_target = local_sdc_cmd_event.command_params.xfer_params.dest;		if((0 == sdc_count) || (SDP_BLOCKLEN <= sdc_offset))		{			sdc_fsm_xfer.transition = SDC_DATA_FSM_DONE;			break;		}		sdc_fsm_xfer.transition = SDC_DATA_FSM_READ;	case SDC_DATA_FSM_READ:		sdc_size = SDP_BLOCKLEN - sdc_offset;		if(sdc_size > sdc_count)		{			sdc_size = sdc_count;		}		if(SDE_TIME_OUT == sd_open(sdc_begin, sdc_offset, sdc_target, sdc_size))		{			sdc_fsm_xfer.transition = SDC_DATA_FSM_ERROR;			break;		}		sdc_count -= sdc_size;		if(sdc_count)		{			sdc_begin += (sdc_size + sdc_offset);			sdc_target += sdc_size;			sdc_offset = 0;			break;		}	case SDC_DATA_FSM_DONE:				sdc_fsm_xfer.state = FSM_DONE;		event_data_set_sdc(READY);		return 0;	default:		sdc_set_error(&sdc_fsm_xfer, E_SDC_READ);		if(sdc_status.f.Ready)		{			sdc_kick = 1;		}		else		{			event_mount_set_sdc(SDC_UMOUNT);		}		return 0;	}			return CTR_TRANSITION_SDC_DATA_FOR_SDC;}void sdc_set_error(t_fsm *sdc_fsm, GRESULT error_reason){	sdc_fsm->state = FSM_ERROR;	sdc_fsm->error_reason = error_reason;	    	event_data_set_sdc(error_reason);	}void sdc_test(void){	sdc_kick = 1;	OSAL_wake_thread(OSAL_THREAD_SDCTask);}void sdc_test_back(void)	{		uint16 delay;		if (sdc_status.f.Ready)		{			if(OK != sd_check())			{				sdc_status.value = SDS_NONE;			event_mount_set_sdc(SDC_UMOUNT);				delay = SD_ELAPSE_INSERTION;			}			else			{				delay = SD_ELAPSE_REMOVAL;			}		}		else		{			switch(sd_detect())			{			case READY :				sdc_status.f.Ready = 1;			event_mount_set_sdc(SDC_MOUNT);			delay = SD_ELAPSE_MONITOR;			break;			case IN_PROGRESS :				delay = SD_ELAPSE_DETECTION;				break;			default :				delay = SD_ELAPSE_INSERTION;			}		}		start_timer(SDC_TIMER, delay);	}RETVAL sd_detect(void){	GRESULT res;	switch(sdc_status.f.Step)	{	case SDC_STEP_SUPPLY :		sd_delay(SD_CLOCK_SUPPLY);		sdc_status.f.Step ++;		return MEDIA_NOT_FOUND;	case SDC_STEP_RESET :		res = sd_reset();		break;	case SDC_STEP_WAKEUP :		if(E_FAIL == (res = sd_wakeup()))		{			return IN_PROGRESS;		}		break;	case SDC_STEP_READOCR :		res = sd_readocr();		break;#if 0	case SDC_STEP_SENDCSD :		res = sd_sendcsd();		break;#endif // 0	case SDC_STEP_SETBL :		res = sd_setbl();		break;	case SDC_STEP_DONE :		sdc_status.f.Step = 0;		return READY;	case SDC_STEP_FAIL :	default :		res = E_FAIL;	}	if(S_OK == res)	{		sdc_status.f.Step ++;		return IN_PROGRESS;	}	sdc_status.f.Step = 0;	return MEDIA_NOT_FOUND;}RETVAL sd_check(void){	if(SDE_OK == sd_command(SDC_READ_OCR, 0, SDR_3))	{		return OK;	}//	sdc_status.value = SDS_NONE;	// reset clock	sd_reset_clock();	return MEDIA_NOT_FOUND;}RETVAL sdc_cmd(t_child_cmd_event* cmd_event){	t_child_cmd_event* pout_event = (t_child_cmd_event *)pevent_get_out(SDC_CMD_EVENT);	*pout_event = *cmd_event;	event_set_out(SDC_CMD_EVENT);	event_out_shedule(SDC_CMD_EVENT);	return BUSY;}GRESULT sd_reset(void){	switch(sd_command(SDC_GO_IDLE_STATE, 0, SDR_1))	{	case SDE_OK :	case SDE_IN_IDLE_STATE :		sdc_status.f.Count = SDW_TRY_IDLE;		return S_OK;	default ://		sdc_status.value = SDS_NONE;		return E_DEVICE_NOT_AVAILABLE;	}}GRESULT sd_wakeup(void){	e_SDErr res = sd_command(SDC_APP_CMD, 0, SDR_1);	if(SDE_IN_IDLE_STATE == res)	{		res = sd_command(SDAC_SEND_OP_COND, 0, SDR_1);	}//  res = sd_command(SDC_READ_OCR, 0, SDR_3);  if(SDE_ILLEGAL_COMMAND & res)  {    res = sd_command(SDC_SEND_OP_COND, 0, SDR_1);  }	if(SDE_OK == res)	{		return S_OK;	}	if(sdc_status.f.Count)	{		sdc_status.f.Count --;		return E_FAIL;	}	return E_READ_TIMEOUT;}GRESULT sd_readocr(void){	if(SDE_OK != sd_command(SDC_READ_OCR, 0, SDR_3))	{//		sdc_status.value = SDS_NONE;		return E_READ_FAILURE;	}	// check voltage	if(SDP_OCR_33_MSK != (SDP_OCR_33_MSK & sdc_data[SDP_OCR_33_IDX]))	{//		sdc_status.value = SDS_ERROR;		return E_INVALID_DEVICE_TYPE;	}	return S_OK;}#if 0GRESULT sd_sendcsd(void){	const tU32 a_Unit[] = {0, 0, 0, 1, 10, 100, 1000, 10000};	const tU32 a_Value[] = {0, 10, 12, 13, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 70, 80};	// send csd	if(SDE_OK != sd_command(SDC_SEND_CSD, 0, SDR_R))	{//		sdc_status.value = SDS_NONE;		return E_READ_FAILURE;	}	// get nac (we should assume clock cycle for taac. choose 10MHz safely.)	sdc_nac = a_Unit[SDP_CSD_TAAC_UMSK & sdc_data[SDP_CSD_TAAC_IDX]];	if(sdc_nac)	{		sdc_nac *= a_Value[SDP_CSD_TAAC_VMSK & (sdc_data[SDP_CSD_TAAC_IDX] >> SDP_CSD_TAAC_VOFFSET)];	}	else	{		sdc_nac = SDP_NACMIN;	}	sdc_nac += (SDP_CSD_NSAC_UNIT * sdc_data[SDP_CSD_NSAC_IDX]);	// optional check to avoid error	if(SDP_NACDEFAULT > sdc_nac)	{		sdc_nac = SDP_NACDEFAULT;	}	// check 8s multiple//	sdc_nac >>= 3;           // divide by 8                             // Some SDC doesn't follow their spec.                             // Wait more safely	return S_OK;}#endif //0GRESULT sd_setbl(void){	// set BLOCKLEN	if(SDE_OK != sd_command(SDC_SET_BLOCKLEN, SDP_BLOCKLEN, SDR_1))	{//		sdc_status.value = SDS_NONE;		return E_READ_FAILURE;	}  	// ready//	sdc_status.value = SDS_READY;  	// update clock	sd_burst_clock();	return S_OK;}e_SDErr sd_command(e_SDCmd cmd, tU32 param, e_SDRes type){	tU8 res;	tU32 cnt;	tU32 req;	tU8* p_out = sdc_data;	res = sd_query(cmd, param);	// check response type	switch(type)	{	case SDR_R :		if(SDE_OK != res)		{			sd_close();			return res;		}		cnt = 8;		req = 16;		break;	case SDR_2 :	case SDR_3 :		// set count		cnt = (SDR_2 == type) ? 1 : 4;		// set response		*p_out ++ = res;		// read response block		while(cnt --)		{			*p_out ++ = sd_read(0xFF);		}	case SDR_1 :	default :		sd_close();		return res;	}	// wait data	do	{		res = sd_read(0xFF);	} while((0xFF == res) && (cnt --));	// check result	if((0xFF == res) || (!(SDP_DATAERR_MSK & res)))	{		sd_close();		return res;	}	// read response	p_out = sdc_data;	cnt = req;	while(cnt --)	{		*p_out ++ = sd_read(0xFF);	}	sd_close();	return SDE_OK;}e_SDErr sd_open(tU32 addr, tU32 offset, tU8* dest, tU32 size){	tU8  res;	tU32 cnt;	if(SDE_OK != (res = sd_query(SDC_READ_SINGLE_BLOCK, addr)))	{		sd_close();		return res;	}	// wait data	cnt = sdc_nac;	do	{		res = sd_read(0xFF);	} while((0xFF == res) && (cnt --));	// check result	if((0xFF == res) || (!(SDP_DATAERR_MSK & res)))	{		sd_close();		return res;	}	cnt = (SDP_BLOCKLEN > (offset + size)) ? (SDP_BLOCKLEN - size - offset) : 0;	while(offset --)	{		sd_read(0xFF);	}	while(size --)	{		*dest ++ = sd_read(0xFF);	}	while(cnt --)	{		sd_read(0xFF);	}	sd_close();	return SDE_OK;}#if 0 // [RB] commented out to reduce ROM spacee_SDErr sd_wait(void){	return SDE_OK;}#endife_SDErr sd_query(e_SDCmd cmd, tU32 param){	tU8 res = SDE_TIME_OUT;	tU32 cnt = 17;	PDB |= 0x1000;              // confirm - optional	SD_CSR2.field.dfifo = 1;    // clear fifo	PDB &= ~0x1000;             // CS	// dummy high	sd_read(0xFF);	// start bit, transmission bit & command	sd_read(0x40 | (0x3F & cmd));	// parameter	sd_read(0xFF & (param >> 24));	sd_read(0xFF & (param >> 16));	sd_read(0xFF & (param >> 8));	sd_read(0xFF & param);	// CRC7 & end bit	sd_read(0x95);              // dummy for CMD0	// dummy high	sd_read(0xFF);	// wait response	do	{		res = sd_read(0xFF);	} while((0xFF == res) && (cnt --));	return res;}e_SDErr sd_close(void){	// trash crc	sd_delay(4);	PDB |= 0x1000;	sd_delay(2);	return SDE_OK;}void sd_delay(tU32 cnt){	while(cnt --)	{		sd_read(0xFF);	}}void sd_send(tU8 dat){	while(1)	{		if(SD_CSR2.field.tfe)		{			SD_TXR = (dat << 8);			break;		}	}}tU8 sd_read(tU8 dat){	sd_send(dat);	while(1)	{		if(SD_CSR2.field.rfne)		{			return (SD_RXR & 0xFF);		}	}}void sd_reset_clock(void){	SD_CLK = SDP_CLOCK_INIT;       // 67.74MHz / 170 = 398.5 kHz < 400 kHz}void sd_burst_clock(void){	SD_CLK = SDP_CLOCK_BURST;      // test value}#endif /* HAVE_SDC *//* End of sdc.c */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产成人精品免费在线| 亚洲第一电影网| 国产精品亚洲成人| 久久久久久免费毛片精品| 美脚の诱脚舐め脚责91| 日韩欧美国产系列| 九一久久久久久| 久久久综合精品| 成人av电影在线网| 一区二区三区四区在线播放| 欧日韩精品视频| 日精品一区二区三区| 精品日韩99亚洲| 国产成人免费视频一区| 亚洲三级免费电影| 欧美精品久久久久久久多人混战| 日韩电影一区二区三区四区| www国产亚洲精品久久麻豆| 国产在线精品一区二区三区不卡| 亚洲国产精品成人久久综合一区| 97国产一区二区| 日韩极品在线观看| 久久精品一级爱片| 91福利区一区二区三区| 日本成人在线看| 国产精品色在线| 欧美日韩精品系列| 国产91在线|亚洲| 亚洲一级在线观看| 久久影音资源网| 在线一区二区三区四区五区| 蜜桃视频在线一区| 亚洲欧美一区二区三区孕妇| 91精品国产综合久久蜜臀| 国产成人综合精品三级| 一级女性全黄久久生活片免费| 欧美一二三四区在线| 成人h版在线观看| 日韩精品一二三区| 亚洲欧美另类图片小说| 欧美xxxxxxxx| 色婷婷综合在线| 狠狠色狠狠色综合日日91app| 亚洲人成小说网站色在线| 欧美成人一区二区三区片免费 | 国产精品91xxx| 亚洲免费高清视频在线| 久久久久久久久久久久久久久99| 欧美三级日韩三级| 成人黄色网址在线观看| 乱一区二区av| 亚洲一区二区不卡免费| 一区视频在线播放| 久久精品人人爽人人爽| 欧美一级日韩一级| 欧美日韩在线电影| 91在线国产观看| 成人永久免费视频| 韩国视频一区二区| 美女在线一区二区| 亚洲成av人片一区二区| 亚洲图片另类小说| 中文欧美字幕免费| 久久久精品欧美丰满| 欧美sm美女调教| 91超碰这里只有精品国产| 欧美系列在线观看| 色菇凉天天综合网| 91视频免费播放| 99精品国产99久久久久久白柏| 国产在线播精品第三| 麻豆国产精品777777在线| 三级亚洲高清视频| 日韩成人精品在线| 视频一区二区中文字幕| 亚洲综合色视频| 夜夜精品浪潮av一区二区三区| 国产精品久久久久三级| 国产精品久久久久久久久图文区 | 91精品国产麻豆| 欧美猛男超大videosgay| 欧美性色黄大片| 欧美日韩在线亚洲一区蜜芽| 在线亚洲一区观看| 欧美亚洲图片小说| 欧美日韩另类一区| 7777精品伊人久久久大香线蕉的 | 在线不卡中文字幕播放| 91麻豆精品国产91久久久久| 69堂国产成人免费视频| 日韩欧美亚洲国产另类 | 奇米影视一区二区三区小说| 奇米影视一区二区三区| 国产一区视频网站| 国产99久久久精品| 91小视频免费看| 欧美日韩一区二区三区四区 | 69精品人人人人| 日韩精品一区二| 国产三级精品三级| 亚洲精品成人精品456| 亚洲国产精品一区二区久久 | 精品国产91洋老外米糕| 久久久.com| 亚洲欧美日本在线| 天天综合网天天综合色| 狠狠色丁香婷综合久久| 成人av网站在线观看免费| aaa亚洲精品| 欧美精品v日韩精品v韩国精品v| 欧美一级片在线看| 国产精品久久久久久久浪潮网站| 亚洲女同一区二区| 毛片av中文字幕一区二区| 粉嫩一区二区三区性色av| 91国产福利在线| 欧美成人午夜电影| 最好看的中文字幕久久| 无码av免费一区二区三区试看| 激情五月婷婷综合网| 91美女精品福利| 日韩精品一区二区三区在线播放| 欧美极品另类videosde| 亚洲国产欧美在线| 国产69精品久久久久777| 欧美亚洲丝袜传媒另类| 久久久九九九九| 亚洲一卡二卡三卡四卡五卡| 国产精品中文有码| 欧美日韩在线播| 国产精品免费久久久久| 日韩 欧美一区二区三区| 成人黄色片在线观看| 欧美一区二区三区的| 亚洲欧美色图小说| 国产一区二区免费看| 欧美日本在线看| 国产精品黄色在线观看| 久久精品噜噜噜成人av农村| 色哟哟国产精品免费观看| 久久蜜臀中文字幕| 视频一区免费在线观看| 色婷婷av久久久久久久| 国产婷婷色一区二区三区四区| 亚洲1区2区3区4区| 91丨九色丨黑人外教| 久久精品视频在线免费观看| 日本视频一区二区三区| 91色.com| 国产精品久久看| 国产麻豆9l精品三级站| 日韩一区二区三区视频在线观看 | 亚洲人精品一区| 国产·精品毛片| 久久久久久99久久久精品网站| 日韩高清不卡一区| 欧美日韩另类国产亚洲欧美一级| 亚洲色图20p| av网站免费线看精品| 欧美激情在线看| 国产精品一线二线三线精华| 日韩女优制服丝袜电影| 日韩精品免费专区| 欧美精选在线播放| 日日夜夜精品视频免费| 欧美日韩精品欧美日韩精品一| 亚洲一区二区三区小说| 色欧美片视频在线观看在线视频| 自拍偷拍欧美精品| 91麻豆国产自产在线观看| 亚洲同性gay激情无套| 色综合久久中文综合久久牛| 亚洲视频免费在线| 色悠久久久久综合欧美99| 亚洲三级在线免费观看| 91首页免费视频| 亚洲综合一二区| 欧美日韩一区二区三区高清| 亚洲 欧美综合在线网络| 欧美丰满一区二区免费视频| 日本午夜精品视频在线观看| 日韩免费视频一区二区| 国产在线视频一区二区三区| 久久网这里都是精品| 懂色av噜噜一区二区三区av| 国产精品日产欧美久久久久| 91视频观看视频| 午夜激情一区二区| 欧美xxxxx裸体时装秀| 国产成人av一区二区| 中文字幕一区二区三中文字幕| 色婷婷精品久久二区二区蜜臀av | 337p日本欧洲亚洲大胆精品| 国产精品123| 亚洲欧美成aⅴ人在线观看| 欧美在线不卡视频| 美腿丝袜亚洲一区| 亚洲国产精品99久久久久久久久 | 欧美亚洲精品一区| 99re视频这里只有精品|