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

📄 smcgui.c

📁 经过测试好用的读卡器源程序
💻 C
字号:
#include <ansi_c.h>
#include <utility.h>
#include <cvirte.h>		/* Needed if linking in external compiler; harmless otherwise */
#include <userint.h>
#include "SMCanalyzer.h"
#include "hwcfg.h"
#include "common.h"
#include "HwAccess.h"


// Variable definition
static int panelHandle;
unsigned char 	page_data[528],write_data[528],spare_data[16];
unsigned int  	page_add;
unsigned char   Card_State,pagedata_string[4000];

int main (int argc, char *argv[])
{
	if (InitCVIRTE (0, argv, 0) == 0)	/* Needed if linking in external compiler; harmless otherwise */
		return -1;	/* out of memory */
	if ((panelHandle = LoadPanel (0, "SMCanalyzer.uir", PANEL)) < 0)
		return -1;
	if (GetCurrentPlatform() == 3)			  // Is WINNT?
	  {
	  if (CVILowLevelSupportDriverLoaded() == 0)  // Lowlevel Driver had loaded at startup?
	    {
	    MessagePopup ("Error","WINNT didn't load the low level driver");
	    QuitUserInterface (0);
	    }
	  }
	HwInitial();
	Hw_VccOff();
	DisplayPanel (panelHandle);
	RunUserInterface ();
	return 0;
}

int CVICALLBACK Timer_5ms_Callback (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
	unsigned char status;
	int dimmed_state;
	switch (event)
	
		{
		case EVENT_TIMER_TICK:
			/* Check Reader */
			if (CheckReader())
			  {
			  SetCtrlVal (PANEL,PANEL_READER,1);
    	      SetCtrlAttribute (panelHandle, PANEL_ALERT_PIC,ATTR_VISIBLE,0);
    	      SetCtrlAttribute (panelHandle, PANEL_ALERT_TEXT,ATTR_VISIBLE,0);
			  /* Check SmartMedia Card status */
			  Card_State = Hw_ChkCardIn();
			  SetCtrlVal (PANEL,PANEL_CARDDET_LED,Card_State);
			  SetCtrlVal (PANEL,PANEL_BUSY_LED,Hw_ChkBusy());
			  if (Card_State) dimmed_state = 0;
			  else dimmed_state = 1;
    	      SetCtrlAttribute (panelHandle, PANEL_READ_PRAMETER, ATTR_DIMMED, dimmed_state);
    	      SetCtrlAttribute (panelHandle, PANEL_FORMAT, ATTR_DIMMED, dimmed_state);
    	      SetCtrlAttribute (panelHandle, PANEL_ERASEALL, ATTR_DIMMED, dimmed_state);			
    	      SetCtrlAttribute (panelHandle, PANEL_ERASEBLOCK, ATTR_DIMMED, dimmed_state);
    	      SetCtrlAttribute (panelHandle, PANEL_READ_PHYSICAL_BLOCK, ATTR_DIMMED, dimmed_state);			
    	      SetCtrlAttribute (panelHandle, PANEL_READ_PHYSICAL_ALL, ATTR_DIMMED, dimmed_state);			
    	      SetCtrlAttribute (panelHandle, PANEL_WRITE_PHYSICAL_BLOCK, ATTR_DIMMED, dimmed_state);
    	      }
    	    else
    	      {
    	      ResetTextBox (panelHandle, PANEL_SMC_PHY_DATA, " ");
    	      SetCtrlAttribute (panelHandle, PANEL_ALERT_PIC,ATTR_VISIBLE,1);
    	      SetCtrlAttribute (panelHandle, PANEL_ALERT_TEXT,ATTR_VISIBLE,1);
    	      SetCtrlVal (PANEL,PANEL_READER,0);
			  SetCtrlVal (PANEL,PANEL_CARDDET_LED,0);
			  SetCtrlVal (PANEL,PANEL_BUSY_LED,0);
    	      SetCtrlAttribute (panelHandle, PANEL_READ_PRAMETER, ATTR_DIMMED, 1);
    	      SetCtrlAttribute (panelHandle, PANEL_FORMAT, ATTR_DIMMED, 1);
    	      SetCtrlAttribute (panelHandle, PANEL_ERASEALL, ATTR_DIMMED, 1);			
    	      SetCtrlAttribute (panelHandle, PANEL_ERASEBLOCK, ATTR_DIMMED, 1);
    	      SetCtrlAttribute (panelHandle, PANEL_READ_PHYSICAL_BLOCK, ATTR_DIMMED, 1);			
    	      SetCtrlAttribute (panelHandle, PANEL_READ_PHYSICAL_ALL, ATTR_DIMMED, 1);			
    	      SetCtrlAttribute (panelHandle, PANEL_WRITE_PHYSICAL_BLOCK, ATTR_DIMMED, 1);
    	      }
			break;
		}
	return 0;
}

int CVICALLBACK Quit_Callback (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
	switch (event)
		{
		case EVENT_COMMIT:
			QuitUserInterface (0);
			break;
		}
	return 0;
}

int CVICALLBACK About_Callback (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
	switch (event)
		{
		case EVENT_COMMIT:
			MessagePopup ("About me","This is a Smart-Media Card Reader with parallel port interface(EPP mode).\n\nDesigned by Janeslee\n\nAll Right Reserved");
			break;
		}
	return 0;
}

int CVICALLBACK Erase_Block_Callback (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
	unsigned int i,j,addstring,start_address;
	short int block_number;
	unsigned char page_number,*pagedata_pnt;
	switch (event)
		{
		case EVENT_COMMIT:
			GetCtrlVal(PANEL,PANEL_PHYSICAL_BLOCK_NUMBER,&block_number);
			GetCtrlVal(PANEL,PANEL_PHYSICAL_PAGE_NUMBER,&page_number);
			start_address = block_number * 0x4000 + page_number * 0x200;
			Hw_VccOn();
			SetCtrlVal (PANEL,PANEL_POWER_LED,1);
			Delay(0.2);               // Delay 100ms
			ReadID();
			Delay(0.02);
			if (BlockErase(start_address) != PASS) printf("Erase failure");
			SetCtrlVal (PANEL,PANEL_POWER_LED,0);
			Hw_VccOff();
			break;
		}
	return 0;
}

int CVICALLBACK Erase_All_Callback (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
	unsigned int page_add,max_page_add,i;
	
	switch (event)
		{
		case EVENT_COMMIT:
			Hw_VccOn();
			SetCtrlVal (PANEL,PANEL_POWER_LED,1);
			Delay(0.2);
			ReadID();
            max_page_add = (unsigned int)(info_flash[3]*info_flash[2]);
            Delay(0.01);
            for(page_add=0;page_add<max_page_add; )
               {
               if (BlockErase(page_add<<9) != PASS) printf("Erase failure at %x",(page_add<<8));
               page_add +=0x20;
               }
			SetCtrlVal (PANEL,PANEL_POWER_LED,0);
			Hw_VccOff();
			break;
		}
	return 0;
}

int CVICALLBACK Dos_Format_Callback (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
	switch (event)
		{
		case EVENT_COMMIT:

			break;
		}
	return 0;
}

int CVICALLBACK Read_Prameter_Callback (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
	unsigned char parameter_string[20],line_index;
	unsigned int i;
	switch (event)
		{
		case EVENT_COMMIT:
			Hw_VccOn();
			SetCtrlVal (PANEL,PANEL_POWER_LED,1);
			Delay(0.2);
			ReadID();
			SetCtrlVal (PANEL,PANEL_POWER_LED,0);
			Hw_VccOff();
			for (line_index = 0;line_index < 10;line_index++)
			  {
			  if (line_index == 0) 
			     {
			     switch ( info_flash[0] )
			         {
			         case 0xec: sprintf(parameter_string,"  0x%x -- SAMSUNG",info_flash[line_index]);break;
			         case 0x98: sprintf(parameter_string,"  0x%x -- TOSHIBA",info_flash[line_index]);break;
			         default:   sprintf(parameter_string,"  0x%x -- UNKNOWN",info_flash[line_index]);break;
			         }
			     }
			  else if (line_index == 1) sprintf(parameter_string,"  %d MB NAND FLASH",info_flash[line_index]);
    		  else   sprintf(parameter_string,"  %d",info_flash[line_index]);
			  ReplaceTextBoxLine (PANEL,PANEL_SMC_PARAMETER,(line_index*2+1),parameter_string);
			  }
			break;
		}
	return 0;
}

int CVICALLBACK Read_Physical_Callback (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
	unsigned int i,j,addstring,start_address;
	short int block_number;
	unsigned char page_number,*pagedata_pnt;
	switch (event)
		{
		case EVENT_COMMIT:
			GetCtrlVal(PANEL,PANEL_PHYSICAL_BLOCK_NUMBER,&block_number);
			GetCtrlVal(PANEL,PANEL_PHYSICAL_PAGE_NUMBER,&page_number);
			start_address = block_number * 0x4000 + page_number * 0x200;
			Hw_VccOn();
			SetCtrlVal (PANEL,PANEL_POWER_LED,1);
			Delay(0.2);
			ReadID();
			Delay(0.01);
			PageRead(page_data,start_address);
			SetCtrlVal (PANEL,PANEL_POWER_LED,0);
			Hw_VccOff();
			pagedata_pnt = pagedata_string;
			for (i=0;i < (info_flash[4]/16);i++)             // 528 / 16 Line
			   {
			   if (i == (info_flash[4]/16 - 1)) sprintf (pagedata_pnt,"   SPARE    :     ");
			   else 
			      {
			      addstring = (start_address & 0xfffffe00) + (i<<4);
			      sprintf (pagedata_pnt,"   %.8X :     ",addstring);
			      }
			   pagedata_pnt += 18;
			   for (j=0;j<16;j++)
			      {
			      sprintf (pagedata_pnt,"%.2X ",page_data[i*16+j]);
			      pagedata_pnt +=3;
			      }
			   sprintf (pagedata_pnt,"\n");
			   pagedata_pnt++;
			   }
			ResetTextBox (PANEL,PANEL_SMC_PHY_DATA,pagedata_string);
			SetCtrlAttribute (panelHandle, PANEL_MDY_PHYSICAL_PAGE, ATTR_DIMMED, 0);
			break;
		}
	return 0;
}

int CVICALLBACK Read_Physical_AllBlock_Callback (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
	unsigned int address,i,j,addstring;
	short int block_number;
	unsigned char page_number,pagedata_string[4000],*pagedata_pnt;

	switch (event)
		{
		case EVENT_COMMIT:
			GetCtrlVal(PANEL,PANEL_PHYSICAL_BLOCK_NUMBER,&block_number);
			Hw_VccOn();
			SetCtrlVal (PANEL,PANEL_POWER_LED,1);
			Delay(0.2);
			ResetTextBox (PANEL,PANEL_SMC_PHY_DATA,"");
			ReadID();
			Delay(0.01);
			//info_flash[2]*info_flash[3]*info_flash[5]
			for (address=block_number*0x4000;address < ((block_number+1)*0x4000);address += info_flash[5] )
			   {
			   PageRead(page_data,address);
			   pagedata_pnt = pagedata_string;
			   for (i=0;i < (info_flash[4]/16);i++)
			      {
			      if (i == (info_flash[4]/16 - 1)) sprintf (pagedata_pnt,"   SPARE    :     ");
			      else 
			         {
			         addstring = (address & 0xfffffe00) + (i<<4);
			         sprintf (pagedata_pnt,"   %.8X :     ",addstring);
			         }
			      pagedata_pnt += 18;
			      for (j=0;j<16;j++)
			         {
			         sprintf (pagedata_pnt,"%.2X ",page_data[i*16+j]);
			         pagedata_pnt +=3;
			         }
			      sprintf (pagedata_pnt,"\n");
			      pagedata_pnt++;
			      }
			   SetCtrlVal (PANEL,PANEL_SMC_PHY_DATA,pagedata_string);
			   }
			SetCtrlVal (PANEL,PANEL_POWER_LED,0);
			Hw_VccOff();
			break;
		}
	return 0;
}

int CVICALLBACK Read_Logical_Callback (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
	switch (event)
		{
		case EVENT_COMMIT:

			break;
		}
	return 0;
}

int CVICALLBACK Write_Physical_Callback (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
	unsigned int i,j,addstring,start_address;
	short int block_number;
	unsigned char page_number,pagedata_string[4000],*pagedata_pnt;

	switch (event)
		{
		case EVENT_COMMIT:
			GetCtrlVal(PANEL,PANEL_PHYSICAL_BLOCK_NUMBER,&block_number);
			GetCtrlVal(PANEL,PANEL_PHYSICAL_PAGE_NUMBER,&page_number);
			start_address = block_number * 0x4000 + page_number * 0x200;
			Hw_VccOn();
			SetCtrlVal (PANEL,PANEL_POWER_LED,1);
			Delay(0.2);
			for(i=0;i<528;i++) pagedata_string[i]=(unsigned char)i;
			
			
			PageWrite(pagedata_string,start_address);
			Delay(0.1);
			Hw_VccOff();
			SetCtrlVal (PANEL,PANEL_POWER_LED,0);
			break;
		}
	return 0;
}

int CVICALLBACK Modify_Physical_Callback (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
	unsigned char modify_data[528],data_buff[100],modify_byte1,modify_byte2,page_number;
	short int block_number;
	unsigned int i,row,linep,bytep,start_address,err;
	switch (event)
		{
		case EVENT_COMMIT:
			GetCtrlVal(PANEL,PANEL_PHYSICAL_BLOCK_NUMBER,&block_number);
			GetCtrlVal(PANEL,PANEL_PHYSICAL_PAGE_NUMBER,&page_number);
			start_address = block_number * 0x4000 + page_number * 0x200;
			Hw_VccOn();
			SetCtrlVal (PANEL,PANEL_POWER_LED,1);
			Delay(0.2);
            
/* Transform ASCII data to HEX data */
			err = bytep = 0;
			for(row=0;row<(info_flash[4]/16);row++)
			   {
               GetTextBoxLine (panelHandle,PANEL_SMC_PHY_DATA,row,data_buff);    // Get text from current line
			   for(i=0;i<16;i++)
			      {
			      modify_byte1 = data_buff[18 + i*3];
			      if (0x2F < modify_byte1 && modify_byte1 < 0x3A)      modify_byte1 -= 0x30;
			      else if (0x40 < modify_byte1 && modify_byte1 < 0x47) modify_byte1 -= 0x37;
			      else { printf("Character error"); err = 0xFF; break; }
	      
			      modify_byte2 = data_buff[18 + i*3 + 1];
			      if (0x2F < modify_byte2 && modify_byte2 < 0x3A)      modify_byte2 -= 0x30;
			      else if (0x40 < modify_byte2 && modify_byte2 < 0x47) modify_byte2 -= 0x37;
			      else { printf("Character error"); err = 0xFF; break; }
			      
			      modify_data[bytep++] = modify_byte1 * 16 + modify_byte2;
			      }
			   if (err) break;
			   }
            if (err) break;

			PageWrite(modify_data,start_address);
			Delay(0.1);
			Hw_VccOff();
			SetCtrlVal (PANEL,PANEL_POWER_LED,0);
			SetCtrlAttribute (panelHandle, PANEL_MDY_PHYSICAL_PAGE, ATTR_DIMMED, 1);
			break;
		}
	return 0;
}

⌨️ 快捷键说明

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