用rtl8139网卡制作的bios编程器(不用并口)
最重要一點,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);
??? }
?*/
}
總結
以上是生活随笔為你收集整理的用rtl8139网卡制作的bios编程器(不用并口)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 条件运算符 JAVA
- 下一篇: 2015/7/28(总结昨天抄底操作失败