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

📄 mal.c

📁 HID-Ukey底层源码实现(st72651芯片) windows上层驱动
💻 C
字号:
/*-*-*-*-*-*-*-*-*-*-* (C) 2000 STMicroelectronics *-*-*-*-*-*-*-*-*-*-*-*-*-*

PROJECT  : ST7265 Media Access Library
COMPILER : ST7 C

MODULE  :  MAL.c
VERSION :  V 1.0 Beta

CREATION DATE :  16/03/2001

AUTHOR : Liang Ping
-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

DESCRIPTION : All functions except those with individual one

-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

Modification:

-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/

#include "define.h"
#include "MAP_7265.h"
#include "Mconfig.h"		// Media configuration
#include "MSL.h"
#include "MAL.h"
#include "MAL_Func.h"
#include "NAND.h"

/*-*-*-*-*-*-*-*-*-*-*-*-*-* Variable declaration *-*-*-*-*-*-*-*-*-*-*-*-*-*/
// Golbal variables, seen outside
#pragma DATA_SEG SHORT MAL_RAM0	// Frequently used variable
unsigned short	MAL_Block_Numbers;
unsigned short	MAL_Block_Finish;
unsigned long	MAL_Block_Address;
unsigned char	MAL_Mediano;
unsigned char	OLD_MAL_Mediano;

unsigned char DTC_Code_Number;

#if ALLOW_OUT_RANGE
char Mal_Addr_Out_Range;
#endif

#pragma DATA_SEG MAL_RAM
unsigned char	MAL_Error;
unsigned char	MAL_State;
unsigned long	MAL_Capacity;
static BYTE MAL_Media_Slot;			// Bitmap for slot activation
static BYTE MAL_Slot_Status;		// Bitmap for slot status

extern WORD	MAL_Table[];
extern DWORD	Medium_Capacity[MAX_LUN+1];	// the last addres of the medium

extern void Select(void);
extern void Deselect(void);

/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* Code Segments *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/


#pragma CONST_SEG MAL_CONST
const unsigned char Bit_Mask[8] =
	{ 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 };

#pragma CODE_SEG MAL_CODE

#pragma NO_ENTRY
unsigned char MAL_Call(char Index, char iFunc)
{
	asm TRAP;
}

/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
	Functions relate to the Reading and Writing
-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
void _MAL_BufMgr_Upload(void)
{
	if (BUFMGR_UPLOAD_MODE)
		return;
	EP2TXR = (EP2TXR & 0x04) | 0x02; // NAK on Xmit, Keep DTOG
	CNT2TXR = 64;		// Set Xmit counter
	CNT2RXR = 64;		// Set Recv counter
	BUFSR = 0x01;		// Clear Buffer status
	BUFSR = 0;
	EP2RXR = (EP2RXR & 0x04) | 0x42;	// NAK on Recv & switch to UPLOAD mode
}

void _MAL_BufMgr_Download(void)
{
	if (BUFMGR_DOWNLOAD_MODE)	// return if already in download mode
		return;
	EP2TXR = (EP2TXR & 0x04) | 0x02;	/* NAK on Xmit, Keep DTOG */
	CNT2RXR = 64;	/* Set Recv counter */
	BUFSR = 0x01;	/* Clear Buffer status */
	BUFSR = 0;
	EP2RXR = (EP2RXR & 0x04) | 0x82;	/* NAK on Recv & switch to DOWNLOAD mode */
}

void _MAL_BufMgr_Normal(void)
{
	if (BUFMGR_NORMAL_MODE)		// return if already in normal mode
		return;
	while (BUFSR & 0x06);		/* Wait both buffer are empty */
	EP2RXR = (EP2RXR & 0x04) | 0x02;	/* NAK on Recv & switch to NORMAL mode */
	EP2TXR = (EP2TXR & 0x04) | 0x02; 	/* NAK on Xmit, Keep DTOG */
}

/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
static char _MAL_Address_OutRange()
{
	unsigned long range = Medium_Capacity[MAL_Mediano];
	if (MAL_Block_Address >= range)
		return 2;
	if (MAL_Block_Address + MAL_Block_Numbers > range)
		return 4;
	return 0;
}

/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
//#pragma	NO_OVERLAP
void _MAL_INC_Block_Param(unsigned char delta)
{
	MAL_Block_Numbers -= delta;
	MAL_Block_Address += delta;
	MAL_Block_Finish += delta;

#if ALLOW_OUT_RANGE
	// Check the range
	Mal_Addr_Out_Range = _MAL_Address_OutRange() | ((Mal_Addr_Out_Range >> 1) & 0x01);
#endif
}

/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
//#pragma	NO_OVERLAP
void _MAL_DEC_Block_Param(unsigned char delta)
{
	MAL_Block_Numbers += delta;
	MAL_Block_Address -= delta;
	MAL_Block_Finish += delta;
}

/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/

/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
void MAL_Init(void)
{
	MAL_HW_Init();
	MAL_Port_Init();
}

/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
BYTE MAL_Test_Ready()
{
	unsigned char mask = Bit_Mask[MAL_Mediano];

	if ((MAL_Media_Slot & mask) == 0) {
		if ((MAL_Slot_Status & mask) == 0)
			return MAL_NO_CARD;

		MAL_Media_Slot |= mask;

		SELECT();		// Chip select
		mask = MAL_Call(MAL_Mediano, MAL_INIT);
		DESELECT();		// Chip deselect
		if (mask != MAL_GOOD)
			return mask;

		return MAL_NEW_CARD;
	}

	return MAL_GOOD;
}
/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
BYTE MAL_Read_Capacity(void)
{
	BYTE	MAL_Status;

// Check the medium is ready to be read
	MAL_Status = MAL_Test_Ready();
	if (MAL_Status != MAL_GOOD)
		return MAL_Status;


// To switch between SMC, Flash on baord and MS
	if (OLD_MAL_Mediano != MAL_Mediano)
	{
		// Change the Lookup Table
		OLD_MAL_Mediano = MAL_Mediano;
//		SELECT();		// Chip select
		MAL_Status = MAL_Call(MAL_Mediano, MAL_INIT);
		DESELECT();		// Chip deselect
		if (MAL_Status != MAL_GOOD)
			return MAL_Status;
	}

//	SELECT();		// Chip select
	MAL_Status = MAL_Call(MAL_Mediano, MAL_READ_CAPACITY);
	DESELECT();		// Chip deselect

	Medium_Capacity[MAL_Mediano] = MAL_Capacity;

	return MAL_Status;
}


/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
BYTE MAL_Start_Stop(BYTE flag)
{
	if ((flag & ~0x02) == 0) {
		MAL_Medium_Removing(MAL_Mediano);
		return MAL_GOOD;
	}
	return MAL_Test_Ready();
}

/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
	Main entry point of the MAL_Read()
-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
extern unsigned char Current_Mode;
extern unsigned char Windows_2000;
extern unsigned long Private_Zone_Size;
BYTE MAL_Read(void)
{
	BYTE	Errno;

// Check the medium is ready to be read
	Errno = MAL_Test_Ready();
	if (Errno != MAL_GOOD)
		return Errno;

#if ALLOW_OUT_RANGE
	Mal_Addr_Out_Range = _MAL_Address_OutRange();
#else
	if (_MAL_Address_OutRange())
		return MAL_OUT_RANGE;
#endif

// To switch between SMC, Flash on baord and MS
	if (OLD_MAL_Mediano != MAL_Mediano)
	{
		// Change the Lookup Table
		OLD_MAL_Mediano = MAL_Mediano;
//		SELECT();		// Chip select
		Errno = MAL_Call(MAL_Mediano, MAL_INIT);
		DESELECT();		// Chip deselect
		if (Errno != MAL_GOOD)
			return Errno;
	}

	if(!Windows_2000)	// Not Under Win2000
	{
		if((Current_Mode == 0x02) && (MAL_Mediano == 1))
			MAL_Block_Address += Private_Zone_Size;

		else if((Current_Mode == 0x01) && (MAL_Mediano == 0) && (MAL_Block_Address >= Private_Zone_Size))
			return MAL_OUT_RANGE;
	}
	else				// Win2000
	{
		if((Current_Mode == 0x02) && (MAL_Mediano == 0))
			MAL_Block_Address += Private_Zone_Size;

		else if((Current_Mode == 0x01) && (MAL_Block_Address >= Private_Zone_Size))
			return MAL_OUT_RANGE;
	}

	MAL_State = MAL_READING;
	SELECT();		// Chip select
	return MAL_Call(MAL_Mediano, MAL_READ);
}

/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
	Main entry point of the MAL_Write()
-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
BYTE MAL_Write(void)
{
	BYTE Errno;

// Check the medium is ready to be written
	Errno = MAL_Test_Ready();
	if (Errno != MAL_GOOD)
		return Errno;
	if (isWRITE_PROTECT())
		return MAL_NO_WRITE;
		
#if ALLOW_OUT_RANGE
	Mal_Addr_Out_Range = _MAL_Address_OutRange();
#else
	if (_MAL_Address_OutRange())
		return MAL_OUT_RANGE;
#endif

// To switch between SMC, Flash on baord and MS
	if (OLD_MAL_Mediano != MAL_Mediano)
	{
		// Change the Lookup Table
		OLD_MAL_Mediano = MAL_Mediano;
//		SELECT();		// Chip select
		Errno = MAL_Call(MAL_Mediano, MAL_INIT);
		DESELECT();		// Chip deselect
		if (Errno != MAL_GOOD)
			return Errno;
	}

	if(!Windows_2000)	// Not Under Win2000
	{
		if((Current_Mode == 0x02) && (MAL_Mediano == 1))
			MAL_Block_Address += Private_Zone_Size;

		else if((Current_Mode == 0x01) && (MAL_Mediano == 0) && (MAL_Block_Address >= Private_Zone_Size))
			return MAL_OUT_RANGE;
	}
	else				// Win2000
	{
		if((Current_Mode == 0x02) && (MAL_Mediano == 0))
			MAL_Block_Address += Private_Zone_Size;

		else if((Current_Mode == 0x01) && (MAL_Block_Address >= Private_Zone_Size))
			return MAL_OUT_RANGE;
	}

	MAL_State = MAL_WRITING;
	SELECT();		// Chip select
	return MAL_Call(MAL_Mediano, MAL_WRITE);
}

/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
	Main entry point of the MAL_Format()
-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
BYTE MAL_Format(void)
{
	BYTE Errno;

// Check the medium is ready to be format
	Errno = MAL_Test_Ready();
	if (Errno != MAL_GOOD)
		return Errno;
	if (isWRITE_PROTECT())
		return MAL_NO_WRITE;

// To switch between SMC, Flash on baord and MS
	if (OLD_MAL_Mediano != MAL_Mediano)
	{
		// Change the Lookup Table
		OLD_MAL_Mediano = MAL_Mediano;
//		SELECT();		// Chip select
		Errno = MAL_Call(MAL_Mediano, MAL_INIT);
		DESELECT();		// Chip deselect
		if (Errno != MAL_GOOD)
			return Errno;
	}

	MAL_State = MAL_FORMATTING;
	SELECT();		// Chip select
	return MAL_Call(MAL_Mediano, MAL_FORMAT);
}

/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
void MAL_Finish(unsigned char Result)
{
	MSL_MAL_Finish(Result);
//	_MAL_BufMgr_Normal();

	if (Result)		// return if already in normal mode
		while (BUFSR & 0x06);		/* Wait both buffer are empty */

	BUFSR = 0x01;           // Clear Buffer status BUFSR = 0;
	EP2RXR = (EP2RXR & 0x04) | 0x02;	/* NAK on Recv & switch to NORMAL mode */
	EP2TXR = (EP2TXR & 0x04) | 0x02; 	/* NAK on Xmit, Keep DTOG */

	MAL_State = MAL_IDLE;
	DESELECT();		// Chip deselect
}

/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
// Normally, this funciton is called from the user interrupt routine
void MAL_Medium_Removing(BYTE slot)
{
	MAL_Media_Slot &= ~Bit_Mask[slot];
	MAL_Slot_Status &= ~Bit_Mask[slot];	

	if(!MAL_Slot_Status)	// No other cards left
	{
		// Do sth to stop the current operations
		MAL_Error = MAL_NO_CARD;
		MAL_Call(slot, MAL_BREAK);
//		MAL_POWER_OFF;		// Turn off the power for the Medium
	}
}

#pragma NO_ENTRY
void MAL_Medium_Plug(unsigned char slot)
{
	asm {
		ld		X, A
		ld		A, (Bit_Mask, X)
		or		A, MAL_Slot_Status
		ld		MAL_Slot_Status, A
	}
//	MAL_Slot_Status |= Bit_Mask[slot];
}




⌨️ 快捷键说明

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