Strawing Blog Archivers

Strawing Blog » Archivers » 利用树莓派SPI刷BIOS Flash(W25Q64)

某同学的笔记本(ASUS K56CM),BIOS里面Restore Default以后保存退出
然后就不亮了
不亮了

玩了这么多年电脑,折腾过这么多主板,还真没见过BIOS Restore Default会死的
莫非这个BIOS自带炸弹? (逃
于是乎开始寻思怎么刷BIOS
首先主板上找到这BIOS的Flash是Winbond W25Q64
Google之,这芯片支持SPI协议读写
小时候刷过BIOS,玩过编程器
可是编程器在家里,没带来学校,我也很无奈啊
上淘宝?
淘宝得3天,也就是说3天没电脑用。
他可等不急。
咦不就是SPI嘛,瞄向身边的东西
单片机?算了吧,折腾太辛苦,速度太慢。
咦树莓派不是有SPI吗?
随手Google(这个网站不存在的)百度了一下Raspberry Pi W25Q64
沃!德!天!有!人!写!了!驱!动!https://github.com/nopnop2002/Raspberry-W25Q64
看到了希望,焊上线。直接飞线,连把芯片吹下来都省了。

测试了一下驱动,能读能写,没毛病
于是Google了一下ASUS K56CM BIOS,下到了一个完整的8MB的BIOS镜像(感谢提供的那位大哥)
然后呢根据那个驱动提供的涵数,YY写了一个读入8MB BINARY文件并写进去的程序。(大概就是写了三个FOR,只做了一点微小的贡献,谢谢大家)

  FILE *fp;
  int  nVal;
  fp = fopen("/home/pi/K56CM.BIN", "r");
  int shanqui = 1;
  int alli = 1;
  for(alli = 1;alli<=2048;alli++){
      n = W25Q64_eraseSector(alli-1,true);
      printf("Erase Sector(%d): n=%d\n",alli-1,n);




    for(shanqui = 1;shanqui<=32;shanqui++){
  int fuckingi = 1;
  for(fuckingi = 1;fuckingi <= 128;fuckingi++){
      nVal = 0;
      fread(&nVal, 1, 1, fp);
            fseek(fp,(((alli*4096)+(shanqui*128)-128)-4096)+fuckingi,SEEK_SET);
            wdata[fuckingi-1]=nVal;
      printf("%02X", wdata[fuckingi-1]);
        }
        n =  W25Q64_pageWrite(alli-1, (shanqui*128)-128, wdata, 128);
        printf("page_write(%d,%d,d,128): n=%d\n",alli-1,(shanqui*128)-128,n);

程序写得乱且不太文明 (逃,各位小妹妹写程序时不要学我这个怪叔叔
走起

看着 Konsole Console 一行行地跳动 简直爽过吸大麻(说得好像我吸过一样)
爽过XXO%^#%^!#%~$#$#%^(*&(*^.....
噢对了提醒下各位小伙伴,华硕K56CM这个BIOS序列号在偏移00230000(十六进制)处,如图

拆线上电

屏幕亮的一瞬间真的爽过吸大麻

改过的程序(写入8MB Binary)放到Github上了,大家只要git clone就能用了
https://github.com/liyafe1997/Raspberry-W25Q64-Write-Binary

查看完整版本:利用树莓派SPI刷BIOS Flash(W25Q64)

© Strawing Blog

Supported by DHL Author:Wolfit