用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);
    }
 */
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值