最重要一点,8139的4个寄存器只能一次性写入,分开写会出问题。
程序有待改进,判断刷写完成的程序用延时代替的。
编程对象是w39v040。
用plcc32转接座把bios芯片插到网卡。
we脚接到a10
r/c脚接到a9
a10脚接到a11
ic脚接到电源
#include <windows.h>
#include <tchar.h>
#include "winio.h"
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <tchar.h>
#include <stdio.h>
#include "conio.h"
#pragma comment( lib, "WINMM.LIB" )
#pragma comment( lib, "winio.lib")
#include "resource.h"
# define TIMER_ACCURACY 1
DWORD aaa;
UINT wTimerRes_1ms=1;
UINT wAccuracy;
int bbb=0,ccc=0;
HWND hwnd;
DWORD number;
HANDLE hFile;
HANDLE hfile,hfile2;
unsigned long ddd=0,ddd2=0,ddd3=0;
SYSTEMTIME _time1;
bool zhuangtai=0;
int fenzhong=0,miao=0;
int i=0,ii=0,t=0;
BYTE b=0;
int add_base=0xdc00;
int add_data=add_base+0xd7;
int add_add=add_base+0xd4;
int add_add2=add_base+0xd5;
int add_add3=add_base+0xd6;
BYTE addr;
unsigned long num;
DWORD DATA0=0,DATA1=1,buf32=0,tmp=0,tmp2;
char buf[33]="aaaaaaaaaaaaaaaaaaaaaaaa";
DWORD PCIConfBaseAddr=0x80000000;
UCHAR ADDRL=0,ADDRH=0,ADDR8,ADDR9,ADDR10;
DWORD readflash(int addr);
void writeflash(int addr,UCHAR data);
char c_path_recive[260],c_path_send[260];
char c_filename[260]="down";
OPENFILENAME openfilename,openfilename2;
HINSTANCE hInst;
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
hwnd=hWnd;
SetDlgItemText(hwnd,IDC_EDIT3,"c:\\jieshou.txt");
SetDlgItemText(hwnd,IDC_EDIT4,"c:\\fasong");
SetPortVal(add_add ,0xffffffff, 4);
break;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case (READ):
DWORD recivedata;
GetDlgItemText(hwnd,IDC_EDIT3,c_filename,260);
hfile=CreateFile(c_filename, GENERIC_WRITE|GENERIC_READ ,FILE_SHARE_READ|FILE_SHARE_WRITE ,0,CREATE_ALWAYS,0,0);
for(i=0;i<2048;i++)
{
recivedata=readflash(i);
WriteFile(hfile,&recivedata,1,&num,0);
}
CloseHandle(hfile);
SetDlgItemText(hwnd,IDC_EDIT1,"ok");
break;
case (ID):
DWORD recivedata2;
writeflash(0x5555,0xaa);
writeflash(0x2aaa,0x55);
writeflash(0x5555,0x90);
Sleep(100);
recivedata2=readflash(0);
writeflash(0x0,0xf0);//退出id模式
char bufferx[50];
recivedata2=recivedata2&0x000ff;
_gcvt(recivedata2, 20, bufferx );
SetDlgItemText(hwnd,IDC_EDIT2,bufferx);
break;
case (ERASE):
writeflash(0x5555,0xaa);
writeflash(0x2aaa,0x55);
writeflash(0x5555,0x80);
writeflash(0x5555,0xaa);
writeflash(0x2aaa,0x55);
writeflash(0x5555,0x10);
t=60;
SetTimer(hwnd,1,1000,0);
char bufferxx[50];
_gcvt(t, 20, bufferxx );
SetDlgItemText(hwnd,IDC_EDIT2,bufferxx);
break;
case (WRITE):
DWORD readdata;
GetDlgItemText(hwnd,IDC_EDIT4,c_filename,260);
hfile2=CreateFile(c_filename, GENERIC_WRITE|GENERIC_READ ,FILE_SHARE_READ|FILE_SHARE_WRITE ,0,OPEN_ALWAYS,0,0);
for(i=0;i<2048;i++)
{
ReadFile(hfile2,&readdata,1,&num,0);
writeflash(0x5555,0xaa);
writeflash(0x2aaa,0x55);
writeflash(0x5555,0xa0);
writeflash(i,readdata);
Sleep(1);
}
CloseHandle(hfile2);
SetDlgItemText(hwnd,IDC_EDIT1,"writeok");
break;
case (R):
openfilename.lStructSize=sizeof(openfilename);
openfilename.hwndOwner=hwnd;
openfilename.hInstance=hInst;
openfilename.lpstrFilter="all file\0*.*\0\0";
openfilename.lpstrFile=c_path_recive;
openfilename.nMaxFile=260;
openfilename.Flags=OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_LONGNAMES | OFN_EXPLORER | OFN_HIDEREADONLY ;
openfilename.lpstrTitle="recive";
GetOpenFileName(&openfilename);
SetDlgItemText(hwnd,IDC_EDIT3,c_path_recive);
break;
case (S):
openfilename2.lStructSize=sizeof(openfilename2);
openfilename2.hwndOwner=hwnd;
openfilename2.hInstance=hInst;
openfilename2.lpstrFilter="all file\0*.*\0\0";
openfilename2.lpstrFile=c_path_send;
openfilename2.nMaxFile=260;
openfilename2.Flags=OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_LONGNAMES | OFN_EXPLORER | OFN_HIDEREADONLY ;
openfilename2.lpstrTitle="recive";
GetOpenFileName(&openfilename2);
SetDlgItemText(hwnd,IDC_EDIT4,c_path_send);
break;
}
break;
case WM_TIMER:
switch (wParam)
{
case 1:
t--;
if(t<0)KillTimer(hwnd,1);
char bufferxx[50];
_gcvt(t, 20, bufferxx );
SetDlgItemText(hwnd,IDC_EDIT2,bufferxx);
break;
}
break;
case WM_CLOSE:
EndDialog( hwnd,NULL) ;
break;
}
return 0;
}
int APIENTRY _tWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow)
{ hInst=hInstance;
InstallWinIoDriver("winio.dll",0);
if(InitializeWinIo()==0)MessageBox(0,"winio初始化失败","0",0);
DialogBoxParam(hInstance, MAKEINTRESOURCE (IDD_DIALOG1),0, (DLGPROC) WndProc,NULL);
return 0;
}
DWORD readflash(int addr)
{
//低位地址
ADDRL=addr;
ADDRH=addr>>8;
tmp=((ADDRH&0x1)<<12)+((ADDRH&0x2)<<14)+((ADDRH&0x4)<<9);
buf32=0x00080600+ADDRL+tmp;
SetPortVal(add_add, buf32, 4);
buf32=buf32-0x200;
SetPortVal(add_add, buf32, 4);
//高位地址
ADDRL=addr>>11;
ADDRH=addr>>19;
tmp=((ADDRH&0x1)<<12)+((ADDRH&0x2)<<14)+((ADDRH&0x4)<<9);
buf32=0x00080400+ADDRL+tmp;
SetPortVal(add_add, buf32, 4);
buf32=buf32+0x200;
SetPortVal(add_add, buf32, 4);
//读取------------
buf32=0x00000600;
SetPortVal(add_add, buf32, 4);
DWORD data;
GetPortVal(add_data, &data, 1);
buf32=0x00080600;
SetPortVal(add_add, buf32, 4);
return data;
}
void writeflash(int addr,UCHAR data)
{
DWORD data_y=data<<24;
//低位地址
ADDRL=addr;
ADDRH=addr>>8;
tmp=((ADDRH&0x1)<<12)+((ADDRH&0x2)<<14)+((ADDRH&0x4)<<9);
buf32=0x00080600+ADDRL+tmp+data_y;
SetPortVal(add_add, buf32, 4);
buf32=buf32-0x200;
SetPortVal(add_add, buf32, 4);
//高位地址
ADDRL=addr>>11;
ADDRH=addr>>19;
tmp=((ADDRH&0x1)<<12)+((ADDRH&0x2)<<14)+((ADDRH&0x4)<<9);
buf32=0x00080400+ADDRL+tmp+data_y;
SetPortVal(add_add, buf32, 4);
buf32=buf32+0x200;
SetPortVal(add_add, buf32, 4);
//写入------------
buf32=buf32-0x400;
SetPortVal(add_add, buf32, 4);
buf32=buf32+0x400;
SetPortVal(add_add, buf32, 4);
/*
//if((ADDRL%64)==0x5)
{
for(ii=0;ii<32;ii++)
{
if((buf32&(1<<ii))>>ii==1)buf[ii]='1';
else buf[ii]='0';
}
buf[32]=0;
MessageBox(0,buf,0,0);
}
*/
}