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

📄 ms_drv.c

📁 索尼记忆棒的示例源码。采自日文期刊Interface的附属光盘。
💻 C
字号:
//---------------------------------------------------------------------
//  関数名:	int ReadXtrData                                         
//  機能  :	物理アドレスpblockで指定されたブロックの              
//         	pageページの冗長部をxtrに読み込む。               
//        	statusに読込み状態の詳細が格納される。               
//  引値  :	HALF pblock      	[IN]ブロックの物理アドレス    
//         	BYTE page        	[IN]ブロック内ページ番号      
//         	BYTE *xtr         	[OUT]管理情報バッファ
//         	int  *status       	[OUT]読込み状態            
//  返値  :	正常終了= OK                                        
//         	エラー時= NG                                        
//---------------------------------------------------------------------
int ReadXtrData(WORD pblock, BYTE page, BYTE *xtr, int *status)
{
	int	i;
	BYTE	param[MSREG_WRITE_SIZE];
	HALF	flErrNo;

	flErrNo = 0;
	*status = 0;

 	/* WRITE_REG(Parameters) */
	param[0] = 0x80;			/* SystemParam */
	param[1] = 0x00;			/* BlockAdr2 */
	param[2] = pblock>>8;		/* BlockAdr1 */
	param[3] = pblock;			/* BlockAdr0 */
	param[4] = 0x40;			/* CommandParam */
	param[5] = page;			/* Page */

	write_reg(param);

	/* SET_CMD(BLOCK_READ) */
	set_cmd(TPCMD_BLOCK_READ);

	/* Wait SIF INT */
	if (wait_sif() != 0) {
		return(NG);
    	}

  	/* READ_REG */
	read_reg(xtr);

  	/* Check IntRegister */
 	if (xtr[1] & MSFLAG_INT_CMDNK) {
		return(NG);
    	} else if (xtr[1] & MSFLAG_INT_CED) {		
		/* Check Error Status */
		if ((xtr[1] & MSFLAG_INT_ERR) == 0) {
			*status = XTR_ERROR_FREE;
			return(OK);
		} else {
			/* Check Status Register 1 */
			if (xtr[3] & (MSFLAG_STAT1_UCMT | MSFLAG_STAT1_UJFG)) {
				return(NG);
			} else {
				*status = XTR_ERROR_CORRECT;
			}
			return(OK);
		}
    	} else {
    		return(NG);
	}
}


//---------------------------------------------------------------------
//  関数名:	int OverwriteXtrData                                  
//  機能  :	物理アドレスpblockで指定されたブロックの                
//        	pageページの冗長部のオーバーライトフラグを     
//        	オーバーライトする。                                     
//        	overwrite値はマスク値を指定する。即ちオーバーライトしたい  
//        	Bitを0に指定し、変更したくない部分を1に指定する。        
//  引値  :	HALF pblock            	[IN]ブロックの物理アドレス      
//         	BYTE page              	[IN]ブロック内ページ番号        
//          	BYTE *overwrite		[IN]Overwriteするマスク値               
//  返値  : 	正常終了= OK                                          
//         	エラー時= NG                                          
//---------------------------------------------------------------------
int OverwriteXtrData(HALF pblock, BYTE page, BYTE *overwrite)
{
  	HALF	flErrNo;
	BYTE	param[MSREG_WRITE_SIZE];
    	BYTE	IntReg;

    	flErrNo = 0;

    	/* WRITE_REG(Parameters) */
    	param[0] = 0x80;			/* SystemParam */
    	param[1] = 0x00;		 	/* BlockAdr2 */
    	param[2] = pblock>>8;		/* BlockAdr1 */
    	param[3] = pblock;			/* BlockAdr0 */
    	param[4] = 0x80;			/* CommandParam */
    	param[5] = page;			/* Page */
    	param[6] = *overwrite;		/* Block Flag Data */

    	write_reg(param);

	/* SET_CMD(BLOCK_WRITE) */
    	set_cmd(TPCMD_BLOCK_WRITE);

    	/* Wait SIF INT */
    	if (wait_sif() != 0) {
        	return(NG);
    	}

    	/* GET_INT */
    	get_int(&IntReg);

    	/* Check IntRegister */
    	if (IntReg & MSFLAG_INT_CMDNK) {
		return(NG);
    	} else if (IntReg & MSFLAG_INT_CED) {
    		if ((IntReg & MSFLAG_INT_ERR) == 0) {
			return(OK);
		} else {
			return(NG);
		}
   	} else {
		return(NG);
    	}
}


//---------------------------------------------------------------------
//  関数名:   int WriteFlashPage                                    
//  機能  :   物理アドレスpblockで指定されたブロックの                
//            pageページに、buf内のデータを書き込む。                 
//            書き込むサイズは512Byte固定。                          
//            データと共に冗長部に書く内容をxtrで指定する。     
//  引値  :   HALF pblock         	[IN]ブロックの物理アドレス      
//            BYTE page           	[IN]ブロック内ページ番号        
//            BYTE *buf           	[IN]データバッファ               
//            BYTE *xtr        	[IN]管理情報         
//  返値  :   正常終了= OK                                            
//            エラー時= NG                                            
//---------------------------------------------------------------------
int WriteFlashPage(HALF pblock, BYTE page, BYTE *buf, BYTE *xtr)
{
    	int	i;
	BYTE	param[MSREG_WRITE_SIZE];
	HALF	flErrNo;
    	BYTE	IntReg;

    	flErrNo = 0;

   	/* WRITE_REG(Parameter) */
    	param[0] = 0x80;			/* SystemParam */
    	param[1] = 0x00; 			/* BlockAdr2 */
    	param[2] = pblock>>8;		/* BlockAdr1 */
    	param[3] = pblock;			/* BlockAdr0 */
    	param[4] = 0x20;			/* CommandParam */
    	param[5] = page;			/* Page */
    	for (i=0; i<MSREG_XTR_SIZE; i++) param[6+i] = xtr[i];

    	write_reg(param);

    	/* WRITE_PAGE_DATA */
    	write_page_data(buf);

    	/* SET_CMD(BLOCK_WRITE) */
    	set_cmd(TPCMD_BLOCK_WRITE);

    	/* Wait SIF INT */
    	if (wait_sif() != 0) {
        	return(NG);
    	}

    	/* GET_INT */
    	get_int(&IntReg);

    	/* Check IntRegister */
    	if (IntReg & MSFLAG_INT_CMDNK) {
		return(NG);
	} else if (IntReg & MSFLAG_INT_CED) {
    		if ((IntReg & MSFLAG_INT_ERR) == 0) {
			return(OK);
		} else {
			return(NG);
		}
   	} else {
	    	return(NG);
    	}
}


//---------------------------------------------------------------------
//  関数名:	int ReadFlashPage                                     
//  機能  :	物理アドレスpblockで指定されたブロックの                
//        	pageページのデータをbuf内に読み込む。                  
//        	読み込むサイズは512Byte固定。
//            データと共に冗長部の内容がxtrに読み込まれる。                            
//         	statusには読込み状態の詳細が格納される。               
//  引値  :	HALF pblock      		[IN]ブロックの物理アドレス     
//         	BYTE page           		[IN]ブロック内ページ番号       
//         	BYTE *buf           		[OUT]データバッファ            
//        	BYTE *xtr         		[OUT]管理情報バッファ
//        	int  *status         	[OUT]読込み状態                
//              DATA_ERROR_FREE   		データ部読込み時エラーなし      
//              DATA_ERROR_CORRECT		データ部読込み時エラー訂正発生  
//              XTR_ERROR_FREE       	冗長部読込み時エラーなし        
//              XTR_ERROR_CORRECT    	冗長部読込み時エラー訂正発生    
//  返値  :	正常終了= OK                                          
//          	エラー時= NG                                          
//---------------------------------------------------------------------
int ReadFlashPage(HALF pblock, BYTE page, BYTE *buf, BYTE *xtr, int *status)
{
    	int	i;
	BYTE	param[MSREG_WRITE_SIZE];
	HALF	flErrNo;

    	flErrNo = 0;
    	*status = 0;

    	/* WRITE_REG(Parameters) */
    	param[0] = 0x80;			/* SystemParam */
    	param[1] = 0x00; 			/* BlockAdr2 */
    	param[2] = pblock>>8;		/* BlockAdr1 */
    	param[3] = pblock;			/* BlockAdr0 */
    	param[4] = 0x20;			/* CommandParam */
    	param[5] = page;			/* Page */
    	write_reg(param);

    	/* SET_CMD(BLOCK_READ) */
    	set_cmd(TPCMD_BLOCK_READ);

    	/* Wait SIF INT */
    	if (wait_sif() != 0) {
        	return(NG);
    	}

    	/* READ_REG */
    	read_reg(xtr);

	/* Check IntRegister */
    	/* Check Command Nack Flag */
    	if (xtr[1] & MSFLAG_INT_CMDNK) {		/* Check Command Nack Flag */
	    	return(NG);
    	} else if (xtr[1] & MSFLAG_INT_BREQ) {
    		/* READ_PAGE_DATA */
		read_page_data(buf);
	
		/* Check Error Status Flag */
		if (xtr[1] & MSFLAG_INT_ERR) {
			if (xtr[3] & MSFLAG_STAT1_DTER) {
				if (xtr[3] & MSFLAG_STAT1_UCDT) {
					return(NG);
				} else {
					*status = DATA_ERROR_CORRECT;
				}
			} else {
				*status = DATA_ERROR_FREE;
			}

			if (xtr[3] & (MSFLAG_STAT1_MTER | MSFLAG_STAT1_FGER)) {
				if (xtr[3] & (MSFLAG_STAT1_UCMT | MSFLAG_STAT1_UJFG)) {
					return(NG);
				} else {
					*status |= XTR_ERROR_CORRECT;
				}
			} else {
				*status |= XTR_ERROR_FREE;
			}
		} else {
			*status = DATA_ERROR_FREE | XTR_ERROR_FREE;
		}

		/* Check Command End Flag */
		if (xtr[1] & MSFLAG_INT_CED) {
			return(OK);
		} else {
			return(NG);
		}
	} else {
	    	return(NG);
	}
}


//---------------------------------------------------------------------
//   関数名:	int EraseAllPages                                   
//   機能  :	物理アドレスpblockで指定されたブロックを消去する。     
//   引値  :	HALF pblock       	[IN]ブロックの物理アドレス       
//   返値  :	正常終了= OK                                         
//         	エラー時= NG                                         
//---------------------------------------------------------------------
int EraseAllPages(HALF pblock)
{
	BYTE	param[MSREG_WRITE_SIZE];
	HALF	flErrNo;
    	BYTE	IntReg;


    	/* WRITE_REG(Parameters) */
    	param[0] = 0x80;			/* SystemParam */
    	param[1] = 0x00;	 		/* BlockAdr2 */
    	param[2] = pblock>>8;		/* BlockAdr1 */
    	param[3] = pblock;			/* BlockAdr0 */
    	param[4] = 0x20;			/* CommandParam */
    	param[5] = 0x00;			/* Page */

    	write_reg(param);

    	/* SET_CMD(BLOCK_ERASE) */
    	set_cmd(TPCMD_BLOCK_ERASE);

    	/* Wait SIF INT */
    	if (wait_sif() != 0) {
        	return(NG);
    	}

    	/* GET_INT */
    	get_int(&IntReg);

    	/* Check IntRegister */
    	if (IntReg & MSFLAG_INT_CMDNK) {
    		return(NG);
    	} else if (IntReg & MSFLAG_INT_CED) {
    		if ((IntReg & MSFLAG_INT_ERR) == 0) {
			return(OK);
		} else {
    			return(NG);
		}
    	} else {
    		return(NG);
    	}
}

⌨️ 快捷键说明

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