📄 ms_drv.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 + -