⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sst39vf160.c

📁 tornado开发 三星s3c44b0x开发板 bsp
💻 C
字号:
/* sst39vf160.c - SST39VF160 MTD driver *//* Copyright 2004-2005 Amine@263.net *//************************************************************************//*                                                                      *//*		FAT-FTL Lite Software Development Kit			*//*		Copyright (C) M-Systems Ltd. 1995-1996			*//*									*//************************************************************************//*modification history--------------------01o,28jul04,a_m  BSP定制 for 思创S3C44B0X黄金开发板*/#include "intLib.h"#include "stdio.h"#include "tffs/flflash.h"#include "config.h"/* NOTE:	!!!UNLOCK_ADDR为字地址, 赋值转换x2	!!!使用自己的地址映射函数	!!!中断向量表在同一片Flash存储器上,擦除和写入操作时需要屏蔽中断*//* 需与sysTffs.c中相同定义一致 */#if(BOARD_TYPE == BOARD_ARMEPS) /*ARMCORE V1.0*/#define	FLASH_BASE_ADRS		0x2000000#define	FLASH_SIZE			0x0400000#else#define	FLASH_BASE_ADRS		ROM_SIZE#define	FLASH_SIZE		(0x00200000-ROM_SIZE)#endiftypedef struct {	FlashWPTR	unlockAddr1;	FlashWPTR  	unlockAddr2;} Vars;static Vars mtdVars[DRIVES];#define thisVars   ((Vars *) vol.mtdVars)#undef DEBUG_PRINT	/* 调试信息输出宏定义 */static void FAR0* sst39vf160Map(FLFlash* pVol,	CardAddress address, int length);static FLStatus sst39vf160Erase	(FLFlash vol, int firstErasableBlock, int numOfErasableBlocks);static FLStatus sst39vf160Write	(FLFlash vol, CardAddress address, const void FAR1 *buffer, int length, int modes);static STATUS  doneDetect(void * ptr,  int timeCounter);/*------------------------------------------------------------------------ Procedure:     sst39vf160Identify ID:1 Purpose:       MTD入口函数 Input:          Output:		 Errors:------------------------------------------------------------------------*/FLStatus sst39vf160Identify(FLFlash vol){	FlashWPTR  baseFlashPtr;#ifdef DEBUG_PRINT  	DEBUG_PRINT("Debug: entering 16-bit SST media identification routine.\n");#endif	flSetWindowBusWidth(vol.socket, 16);	/* use 16-bits */	flSetWindowSpeed(vol.socket, 90);  		/* 90 nsec */	flSetWindowSize(vol.socket, FLASH_SIZE>>12);	vol.interleaving = 1; 	vol.chipSize = FLASH_SIZE;	vol.noOfChips = 0x1;	                /* one chip */	vol.erasableBlockSize = 0x1000;      	/* 4k bytes */  	vol.flags |= SUSPEND_FOR_WRITE;	vol.map   = sst39vf160Map;		vol.erase = sst39vf160Erase;	vol.write = sst39vf160Write;	vol.mtdVars = &mtdVars[flSocketNoOf(vol.socket)];	baseFlashPtr = (FlashWPTR)vol.map (&vol, (CardAddress)0, vol.interleaving);	/*!!!UNLOCK_ADDR为字地址, 赋值转换x2*/	thisVars->unlockAddr1 = (FlashWPTR)((long)baseFlashPtr) + 0x5555;	thisVars->unlockAddr2 = (FlashWPTR)((long)baseFlashPtr) + 0x2aaa;	return flOK;}/*------------------------------------------------------------------------ Procedure:     sst39vf160Map ID:1 Purpose:       映射Flash片内地址为CPU全局地址 Input:         address-相对地址 Output:		 Errors:------------------------------------------------------------------------*/static void FAR0* sst39vf160Map(FLFlash* pVol,	CardAddress address, int length){	void FAR0* pFlash = (void FAR0*) (FLASH_BASE_ADRS + address);	return(pFlash);}/*------------------------------------------------------------------------ Procedure:     sst39vf160Erase ID:1 Purpose:       MTD擦除Flash函数 Input:          Output:		 Errors:------------------------------------------------------------------------*/static FLStatus sst39vf160Erase	(FLFlash vol, int firstErasableBlock, int numOfErasableBlocks){	int iBlock, i; 			FlashWPTR flashPtr;	unsigned int offset;	int level;	if(numOfErasableBlocks <= 0) return ERROR;	for (iBlock = 0; iBlock < numOfErasableBlocks; iBlock++) {		offset = (firstErasableBlock + iBlock) * vol.erasableBlockSize;		flashPtr = (FlashWPTR) vol.map(&vol, offset, vol.interleaving);#ifdef DEBUG_PRINT    	DEBUG_PRINT("Debug: sst39vf160Erase - flashPtr=0x%x, first=%d, number=%d.\n", flashPtr, firstErasableBlock, numOfErasableBlocks);#endif		*thisVars->unlockAddr1 = 0xaa;	    *thisVars->unlockAddr2 = 0x55;	    *thisVars->unlockAddr1 = 0x80;		*thisVars->unlockAddr1 = 0xaa;	    *thisVars->unlockAddr2 = 0x55;	    #if(BOARD_TYPE != BOARD_ARMEPS) /*ARMCORE V1.0*/		level = intLock();		#endif		*flashPtr = 0x30;		doneDetect((void *)flashPtr, 0x2000000);				  		for(i=0; i<vol.erasableBlockSize/2; i++,flashPtr++){		   if(*flashPtr != 0xffff)  break;		}		*flashPtr = 0xf0;		#if(BOARD_TYPE != BOARD_ARMEPS) /*ARMCORE V1.0*/		intUnlock(level);		#endif		if(i < vol.erasableBlockSize/2)	{#ifdef DEBUG_PRINT			DEBUG_PRINT("Debug: sst39vf160Erase fail.\n");#endif			return flWriteFault;		}	}		return flOK;}/*------------------------------------------------------------------------ Procedure:     sst39vf160Write ID:1 Purpose:       MTD写Flash函数 Input:          Output:		 Errors:------------------------------------------------------------------------*/static FLStatus sst39vf160Write	(FLFlash vol, CardAddress address, const void FAR1 *buffer, int length, int modes){	int cLength; int level;	FlashWPTR flashPtr, flashTmp;	volatile UINT16 *gBuffer;	flashTmp = flashPtr = (FlashWPTR) vol.map(&vol, address, length);#ifdef DEBUG_PRINT    DEBUG_PRINT("Debug: sst39vf160Write - flashPtr=0x%x, buffer=0x%x, length=%d, modes=%d.\n", flashPtr, buffer, length, modes);#endif	if(length&1)		printf("warning! the data length can not divided by 2.");		cLength = length/2;	gBuffer = (UINT16 *)buffer;	while (cLength >= 1) {		*thisVars->unlockAddr1 = 0x0aa;    	*thisVars->unlockAddr2 = 0x55;    	#if(BOARD_TYPE != BOARD_ARMEPS) /*ARMCORE V1.0*/		level = intLock();		#endif	    *thisVars->unlockAddr1 = 0x0a0;		*flashPtr = *gBuffer;		doneDetect((void *)flashPtr, 0x1000000);		if(*flashPtr != *gBuffer) {			*flashPtr = 0xf0;#ifdef DEBUG_PRINT			DEBUG_PRINT("Debug: sst39vf160Write timeout.\n");#endif			return flWriteFault;		}		#if(BOARD_TYPE != BOARD_ARMEPS) /*ARMCORE V1.0*/		intUnlock(level);		#endif		cLength--;		flashPtr++;		gBuffer++;	}	if (tffscmp((void FAR0 *)flashTmp, buffer,length))	{#ifdef DEBUG_PRINT		DEBUG_PRINT("Debug: sst39vf160Write fail.\n");#endif		return flWriteFault;	}	return flOK;}/*------------------------------------------------------------------------ Procedure:     doneDetect ID:1 Purpose:       探测write,erase操作是否结束,超时错误 Input:          Output:		 Errors:------------------------------------------------------------------------*/static STATUS  doneDetect(void * ptr,  int timeCounter){	FlashWPTR pFlash = ptr;	INT16 buf1,buf2;		buf1 = *pFlash & 0x40;	while(1){		buf2  = *pFlash & 0x40;		if(buf1 == buf2) break; /* D6位没有跳变表示操作结束 */		else buf1 = buf2;		if(timeCounter-- <= 0) return ERROR;	}	return OK;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -