2k_mass.c
来自「HID-Ukey底层源码实现(st72651芯片) windows上层驱动」· C语言 代码 · 共 1,672 行 · 第 1/3 页
C
1,672 行
---------------------------------------------------------------------------*/
unsigned char DTC_SMC_Read_USB(void)
{
// if (DTC_Code_Number != CODE_READ_USB) {
// DTC_Load_Code(SMC_DTC_USB_Mass_Upld);
// DTC_Code_Number = CODE_READ_USB;
// }
if (DTC_Code_Number != CODE_READ_USB256) {
DTC_Load_Code(SMC_DTC_USB_Mass_Upld256);
DTC_Code_Number = CODE_READ_USB256;
}
Copy_malPaddr();
Buffer_Param[0x3F] = malNpage; // Nb of Sectors processed
if (SMC_Cluster_Size != 64)
Buffer_Param[0x00] = 0x01; //flag to recognize 2K or 512 flash
else
Buffer_Param[0x00] = 0x00; //flag to recognize 2K or 512 flash
Enable_DTC_Int();
// DTC_Process(SMC_DTC_USB_Upload);
DTC_Process(0x00); //for 256MB
return 0x00;
}
unsigned char DTC_SMC_Read_USB2(void)
{
Enable_DTC_Int();
// DTC_Process(SMC_DTC_USB_Upload2); // for 256MB
DTC_Process(0xb5);
return 0x00;
}
/*-----------------------------------------------------------------------------
Routine : DTC_SMC_Copy_Pages
Input :
Output :
Description
-----------------------------------------------------------------------------*/
unsigned char DTC_SMC_Copy_Pages(void)
{
unsigned char DTC_Status; // , Nbblocks;
unsigned long Raddrtemp, Laddrtemp;
if(SMC_Cluster_Size == 64){
if (DTC_Code_Number != CODE_COPY_PAGES256){
DTC_Load_Code(SMC_DTC_Copypages256);
DTC_Code_Number = CODE_COPY_PAGES256;
}
asm { // Copy the source page address with 8 bits shift left
LD A, malRaddr:3
LD Buffer_Param:35, A
LD A, malRaddr:2
LD Buffer_Param:34, A
LD A, malRaddr:1
LD Buffer_Param:33, A
LD A, malRaddr:0
LD Buffer_Param:32, A
}
asm { // Copy the destination page address with 8 bits shift left
LD A, malPaddr:3
LD Buffer_Param:30, A
LD A, malPaddr:2
LD Buffer_Param:29, A
LD A, malPaddr:1
LD Buffer_Param:28, A
LD A, malPaddr:0
LD Buffer_Param:27, A
}
Buffer_Param[0x1F] = Buffer_Param[0x24] = 0;
Buffer_Param[0x3F] = malNpage; // Nb of Sectors processed
// Buffer_Param[0x3e] = ((malNpage * 4) + SubBlock); // Nb of Sectors processed
// Nbblocks = Buffer_Param[0x3e];
}
else {
if (DTC_Code_Number != CODE_COPY_PAGES){
DTC_Load_Code(SMC_DTC_Copy_Pages);
DTC_Code_Number = CODE_COPY_PAGES;
}
asm { // Copy the source page address with 8 bits shift left
LD A, malRaddr:1
LD Buffer_Param:37, A
LD A, malRaddr:2
LD Buffer_Param:36, A
LD A, malRaddr:3
LD Buffer_Param:35, A
CLR A
LD Buffer_Param:34, A
}
asm { // Copy the destination page address with 8 bits shift left
CLR A
LD Buffer_Param:39, A
LD A, malPaddr:1
LD Buffer_Param:42, A
LD A, malPaddr:2
LD Buffer_Param:41, A
LD A, malPaddr:3
LD Buffer_Param:40, A
}
Buffer_Param[0x3F] = malNpage; // Nb of Sectors processed
}
No_DTC_Int();
DTC_Process(0x00);
Laddrtemp = malPaddr;
Raddrtemp = malRaddr;
// forward the pointers
if(SMC_Cluster_Size == 64){
malNpage = malNpage << 8;
// malNpage = (malNpage - 1) << 8;
// malPaddr += malNpage;
// malRaddr += malNpage;
// malNpage = 0;
}
// else { // added for 256MB
malPaddr += malNpage;
malRaddr += malNpage;
malNpage = 0;
// }
DTC_Status = DTC_Wait_Stop();
return DTC_Status;
}
/******************TO DEBUG DATA CORRUPTION*****************/
/*
#ifdef debug
asm { // Copy the source page address with 8 bits shift left
LD A, Raddrtemp:3
LD Buffer_Param:36, A
LD A, Raddrtemp:2
LD Buffer_Param:35, A
LD A, Raddrtemp:1
LD Buffer_Param:34, A
LD A, Raddrtemp:0
LD Buffer_Param:33, A
}
asm { // Copy the destination page address with 8 bits shift left
LD A, Laddrtemp:0
LD Buffer_Param:39, A
LD A, Laddrtemp:1
LD Buffer_Param:40, A
LD A, Laddrtemp:2
LD Buffer_Param:41, A
LD A, Laddrtemp:3
LD Buffer_Param:42, A
}
if (Buffer_Param[0x3c] == 0) {
Buffer_Param[0x25] = Buffer_Param[0x2b]=0x00;
Buffer_Param[0x24] = Buffer_Param[0x2a]=0x00;
}
else if (Buffer_Param[0x3c] == 1) {
Buffer_Param[0x25] = Buffer_Param[0x2b]=0x10;
Buffer_Param[0x24] = Buffer_Param[0x2a]=0x02;
Nbblocks = Nbblocks - 1;
}
else if (Buffer_Param[0x3c] == 1) {
Buffer_Param[0x25] = Buffer_Param[0x2b]=0x20;
Buffer_Param[0x24] = Buffer_Param[0x2a]=0x04;
Nbblocks = Nbblocks - 2;
}
else {
Buffer_Param[0x25] = Buffer_Param[0x2b]=0x30;
Buffer_Param[0x24] = Buffer_Param[0x2a]=0x06;
Nbblocks = Nbblocks - 3;
}
DTC_Status = 0x00;
if (DTC_Code_Number != CODE_DEBUG) {
DTC_Load_Code(SMC_DTC_Debug);
DTC_Code_Number = CODE_DEBUG ;
}
Buffer_Param[0x20] = Nbblocks;
DTC_Process(0x00);
while(!(DTC_Status)){
DTC_Status = DTCSTATUS & 0x03;
}
if (DTC_Status & 0x02) {
counter++;
asm nop;
Error_Laddr[counter] = SMC_Laddr ;
Error_Page[counter] =((unsigned char *)(&(Laddrtemp)))[2];
Error_offset[counter]= Buffer_Param[0x20];
}
asm nop;
#endif
}
*/
/*-----------------------------------------------------------------------------
Routine : DTC_SMC_Mark_Pages
Input :
Output : void
Description
-----------------------------------------------------------------------------*/
unsigned char DTC_SMC_Mark_Page0(unsigned char Marking_Mark)
{
unsigned char value;
if (DTC_Code_Number != CODE_MARK_PAGES) {
// DTC_Load_Code(SMC_DTC_Mark_Pages);
DTC_Load_Code(SMC_DTC_Markpages256); // for 256MB
DTC_Code_Number = CODE_MARK_PAGES;
}
asm {
LD X, #15
LD A, #0xFF
FF_Spare:
LD (Buffer_Param[0x27], X), A
DEC X
JRPL FF_Spare
}
// Spare_Area.Reserved_Field = 0xFFFFFFFFL;
// Spare_Area.ECC_Field_2[0] = 0xFF;
// Spare_Area.ECC_Field_2[1] = 0xFF;
// Spare_Area.ECC_Field_2[2] = 0xFF;
// Spare_Area.ECC_Field_1[0] = 0xFF;
// Spare_Area.ECC_Field_1[1] = 0xFF;
// Spare_Area.ECC_Field_1[2] = 0xFF;
// Spare_Area.Data_Status_Byte = 0xFF;
Spare_Area.Block_Status_Byte = Marking_Mark;
if (Marking_Mark == 0xFF) {
Spare_Area.Block_Address_Field_1 =
Spare_Area.Block_Address_Field_2 = DTC_SMC_Addr_Parity(SMC_Laddr);
}
// else {
// Spare_Area.Block_Address_Field_1 = 0xFFFF;
// Spare_Area.Block_Address_Field_2 = 0xFFFF;
// }
if (SMC_Cluster_Size != 64) // for 256MB
Buffer_Param[0x3F] = malNpage; // Nb of Sectors processed
else
Buffer_Param[0x3f] = ((malNpage * 4) + SubBlock);
No_DTC_Int();
DTC_Process(0x00);
value = DTC_Wait_Stop();
malNpage = Buffer_Param[0x3F];
// return malNpage;
return value;
}
unsigned char DTC_SMC_Mark_Pages()
{
// CopyStartAddr8(malPaddr); removed for 256MB
Copy_malPaddr();
if (SMC_Cluster_Size != 64) {
Buffer_Param[0x00]= 0x01;
Buffer_Param[0x10] = 0x50; //1st cmd for write operation
malPaddr += malNpage;
}
else {
Buffer_Param[0x24] &= 0x06;
Buffer_Param[0x24] += 0x02;
Buffer_Param[0x12] = Buffer_Param[0x26];//make a copy of number of add. bytes
Buffer_Param[0x00]= 0x00; //flag for 256MB recognition
Buffer_Param[0x10] = 0x80; //first cmd
malPaddr += (malNpage << 8); //added for 256MB
}
return DTC_SMC_Mark_Page0(0xFF);
}
//unsigned char DTC_SMC_Mark_Bad(unsigned long SMC_Bad_Paddr)
unsigned char DTC_SMC_Mark_Bad(void)
{
// CopyStartAddr8(SMC_Bad_Paddr);
Copy_malPaddr(); //for 256MB
if (SMC_Cluster_Size != 64){
malPaddr += malNpage;
Buffer_Param[0x00]= 0x01;
Buffer_Param[0x10] = 0x50; //1st cmd for write operation
}
else {
// Buffer_Param[0x24] &= 0x06;
Buffer_Param[0x24] = 0x02;
Buffer_Param[0x25] = 0x00;
Buffer_Param[0x12] = Buffer_Param[0x26];//make a copy of number of add. bytes
Buffer_Param[0x00]= 0x00; //flag for 256MB recognition
Buffer_Param[0x10] = 0x80; //first cmd
// malPaddr += (malNpage << 8); //added for 256MB
}
return DTC_SMC_Mark_Page0(0xF0);
}
/*---------------------------------------------------------------------------
Routine : DTC_SMC_Write_USB
Input :
Output : void
Description
---------------------------------------------------------------------------*/
void DTC_SMC_Init_Download(void)
{
// DTC_Load_Code(SMC_DTC_USB_Mass_Dwld);
if (SMC_Cluster_Size == 64){
if (DTC_Code_Number != CODE_WRITE_USB256) {
DTC_Load_Code(SMC_DTC_USB_Mass_Dwld256); //for 256MB
DTC_Code_Number = CODE_WRITE_USB256;
}
}
else{
if (DTC_Code_Number != CODE_WRITE_USB) {
DTC_Load_Code(SMC_DTC_USB_Mass_Dwld); //for 256MB, if other Flash
DTC_Code_Number = CODE_WRITE_USB;
}
}
}
//#pragma NO_OVERLAP
unsigned char DTC_SMC_Write_USB(unsigned char buf_no)
{
unsigned char counter;
DTC_SMC_Init_Download();
asm { // Copy the logical address
LD A, SMC_Laddr
LD X, SMC_Laddr:1
SLL X
RLC A
OR A, #0x10 // Shift one bit left and set bit 12 as 1
LD Buffer_Param[0x36], A
LD Buffer_Param[0x3B], A
LD Buffer_Param[0x37], X
LD Buffer_Param[0x3C], X
}
if (SMC_Cluster_Size != 64) {
Buffer_Param[0x25] = 0; // CA0-7
Buffer_Param[0x24] = ((unsigned char *)(&(malPaddr)))[3]; // PA0-7
Buffer_Param[0x23] = ((unsigned char *)(&(malPaddr)))[2]; // PA8-15
Buffer_Param[0x22] = ((unsigned char *)(&(malPaddr)))[1]; // PA16-23
}
else
Copy_malPaddr();
Buffer_Param[0x20] = malNpage; // Number of pages
Enable_DTC_Int();
DTC_Process(buf_no ? SMC_DTC_USB_Download_Buf1 : SMC_DTC_USB_Download_Buf0);
return 0x00;
}
void DTC_SMC_Dummy_Write(unsigned char buf_no)
{
Buffer_Param[0x3E] = buf_no; // Start with even or odd page
Buffer_Param[0x3F] = malNpage; // Nb of Sectors processed
if (DTC_Code_Number != CODE_DTC_CODE0) {
DTC_Load_Code(SMC_DTC_Code0);
DTC_Code_Number = CODE_DTC_CODE0;
}
Enable_DTC_Int();
DTC_Process(SMC_DTC_Code_Dummy_Write);
}
/*-----------------------------------------------------------------------------
ROUTINE NAME : DTC_SMC_Erase
INPUT/OUTPUT : None/None
DESCRIPTION : None
-----------------------------------------------------------------------------*/
unsigned char DTC_SMC_Erase()
{
// DTC_SMC_Init_Download();
if (SMC_Cluster_Size == 64){
if (DTC_Code_Number != CODE_ERASE_256) { // modified by HYJ on Oct. 12, 2005
DTC_Load_Code(SMC_DTC_Erass_256);
DTC_Code_Number = CODE_ERASE_256;
}
}
else{
if (DTC_Code_Number != CODE_WRITE_USB) {
DTC_Load_Code(SMC_DTC_USB_Mass_Dwld); //for 256MB, if other Flash
DTC_Code_Number = CODE_WRITE_USB;
}
}
if (SMC_Cluster_Size != 64) { //for 256MB
Buffer_Param[0x25] = ((unsigned char *)(&(malPaddr)))[3]; // PA0-7
Buffer_Param[0x24] = ((unsigned char *)(&(malPaddr)))[2]; // PA8-15
Buffer_Param[0x23] = ((unsigned char *)(&(malPaddr)))[1]; // PA16-23
}
else{
Buffer_Param[0x25] = ((unsigned char *)(&(malPaddr)))[2]; // PA0-7
Buffer_Param[0x24] = ((unsigned char *)(&(malPaddr)))[1]; // PA8-15
Buffer_Param[0x23] = ((unsigned char *)(&(malPaddr)))[0];
}
No_DTC_Int();
DTC_Process(SMC_DTC_USB_DownErase);
return DTC_Wait_Stop();
}
/*----------------------------------------------------------------------------
ROUTINE NAME : DTC_SMC_Format_Chk
INPUT/OUTPUT : Buffer_0 fill with the check pattern
DESCRIPTION : None
----------------------------------------------------------------------------*/
void DTC_SMC_Format_Start()
{
if (SMC_Cluster_Size == 64){
if (DTC_Code_Number != CODE_SMC_FORMAT256) {
DTC_Load_Code(SMC_DTC_Format256); //for 256MB
DTC_Code_Number = CODE_SMC_FORMAT256;
}
}
else {
if (DTC_Code_Number != CODE_SMC_FORMAT) {
DTC_Load_Code(SMC_DTC_Format); //for 256MB
DTC_Code_Number = CODE_SMC_FORMAT;
}
}
Buffer_0[0] = ~0x01;
Buffer_0[1] = ~0x02;
Buffer_0[2] = ~0x04;
Buffer_0[3] = ~0x08;
Buffer_0[4] = ~0x10;
Buffer_0[5] = ~0x20;
Buffer_0[6] = ~0x40;
Buffer_0[7] = ~0x80;
Buffer_0[8] = 0xFF;
Buffer_Param[0x3F] = malNpage; // Nb of Sectors processed
Enable_DTC_Int();
if (SMC_Cluster_Size != 64) {
Buffer_Param[0x25] = ((unsigned char *)(&(malPaddr)))[3]; // PA0-7
Buffer_Param[0x24] = ((unsigned char *)(&(malPaddr)))[2]; // PA8-15
Buffer_Param[0x23] = ((unsigned char *)(&(malPaddr)))[1];
Buffer_Param[0x22] = ((unsigned char *)(&(malPaddr)))[0];
DTC_Process(SMC_DTC_Format_Cmd_Check);
}
else{
Copy_malPaddr(); // cluster address
Buffer_Param[0x25] = 0x00;
Buffer_Param[0x24] = 0x02;
DTC_Process(SMC_DTC_Format_Cmd_Check256);
}
return;
}
unsigned char DTC_SMC_Format_Chk(unsigned char flag)
{
if (SMC_Cluster_Size == 64) {
if (DTC_Code_Number != CODE_SMC_FORMAT256) {
DTC_Load_Code(SMC_DTC_Format256); //for 256MB
DTC_Code_Number = CODE_SMC_FORMAT256;
}
}
else {
if (DTC_Code_Number != CODE_SMC_FORMAT) {
DTC_Load_Code(SMC_DTC_Format);
DTC_Code_Number = CODE_SMC_FORMAT;
}
}
Buffer_0[0] = ~0x01;
Buffer_0[1] = ~0x02;
Buffer_0[2] = ~0x04;
Buffer_0[3] = ~0x08;
Buffer_0[4] = ~0x10;
Buffer_0[5] = ~0x20;
Buffer_0[6] = ~0x40;
Buffer_0[7] = ~0x80;
Buffer_0[8] = 0xFF;
Buffer_Param[0x3F] = malNpage; // Nb of Sectors processed
No_DTC_Int();
if (SMC_Cluster_Size != 64) {
Buffer_Param[0x25] = ((unsigned char *)(&(malPaddr)))[3]; // PA0-7
Buffer_Param[0x24] = ((unsigned char *)(&(malPaddr)))[2]; // PA8-15
Buffer_Param[0x23] = ((unsigned char *)(&(malPaddr)))[1];
Buffer_Param[0x22] = ((unsigned char *)(&(malPaddr)))[0];
DTC_Process(SMC_DTC_Format_Cmd_Check);
}
else {
Copy_malPaddr(); // cluster address
Buffer_Param[0x25] = 0x00;
if (flag == format)
Buffer_Param[0x24] = 0x02;
else
Buffer_Param[0x24] = 0x08; //for finding factory bad clusters
DTC_Process(SMC_DTC_Format_Cmd_Check256);
}
DTC_Wait_Stop();
if (SMC_Cluster_Size != 64)
DTC_Process(SMC_DTC_Format_Check);
else
DTC_Process(SMC_DTC_Format_Check256);
return DTC_Wait_Stop();
}
void DTC_SMC_Format_Erase()
{
No_DTC_Int();
if (SMC_Cluster_Size != 64 )
DTC_Process(SMC_DTC_Format_Cmd_Erase);
else {
Buffer_Param[0x25] = ((unsigned char *)(&(malPaddr)))[2]; // PA0-7
Buffer_Param[0x24] = ((unsigned char *)(&(malPaddr)))[1]; // PA8-15
Buffer_Param[0x23] = ((unsigned char *)(&(malPaddr)))[0];
DTC_Process(SMC_DTC_Format_Cmd_Erase256);
}
DTC_Wait_Stop();
Enable_DTC_Int();
if (SMC_Cluster_Size != 64)
DTC_Process(SMC_DTC_Format_Erase_Wait);
else
DTC_Process(SMC_DTC_Format_Erase_Wait256);
}
void DTC_SMC_Format_Write()
{
if (SMC_Cluster_Size != 64){
No_DTC_Int();
DTC_Process(SMC_DTC_Format_Cmd_Read0);
DTC_Wait_Stop();
Enable_DTC_Int();
DTC_Process(SMC_DTC_Format_Write_0);
}
else {
Copy_malPaddr();
Buffer_Param[0x25] = 0x00;
Enable_DTC_Int();
DTC_Process(SMC_DTC_Format_Write0_256);
}
}
void DTC_SMC_Format_Read()
{
Buffer_Param[0x19] = Buffer_Param[0x23];
// Copy_malPaddr(); // cluster address
No_DTC_Int();
if (SMC_Cluster_Size != 64) {
Buffer_Param[0x25] = ((unsigned char *)(&(malPaddr)))[3]; // PA0-7
Buffer_Param[0x24] = ((unsigned char *)(&(malPaddr)))[2]; // PA8-15
Buffer_Param[0x23] = ((unsigned char *)(&(malPaddr)))[1];
Buffer_Param[0x22] = ((unsigned char *)(&(malPaddr)))[0];
DTC_Process(SMC_DTC_Format_Cmd_Read);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?