BIOS Upgrade ThinkPad X- 시리즈 USB Boot Disk 만들기

BIOS Upgrade ThinkPad X- 시리즈 USB Boot Disk 만들기
저는 X61t Tinkpad 를 쓴지는 몇개월 안되지만 쓸수록 디자인이나 기능에 만족을 하고 있습니다.
전에 LG Xnote를 사용했었는데 그게 더 사양이 좋음에도 불구하고 이눔의 검댕이를 더 선호 하는것은 아마도 씽크패드를 써보신 분들은 공감을 하실 겁니다.
그런데 한가지 불만인 것은 레노버로 씽크패드가 넘어가면서 레노버의 서비스등에 대한 아쉬운 그런 부분일 것이다.
그럼 왜 이 글을 쓰게 되었냐 하면 BIOS 업뎃을 하려고 레노버 홈피에 들어가 보았더니 아주 잘 안내가 되어 있었는데 문제는 VISTA x64 사용자는 올려져 있는 바이오스 업뎃 실행파일로는 업뎃이 안되고 CD 이미지 파일을 다운받아 구워서 해야 된단다. 거기까지는 머 그런가 했습니다. 왜냐면 저는 외장형 ODD(Optical Disk Drive) 를 USB 타입으로 얼마 전 구매를 했기 때문이당
그런데 참고 문서를 읽던 중에 허거덩~~ 업뎃이 가능한 ODD는 DMA를 지원하는 씽크패드 울트라베이용 ODD에서만 가능 하단다. 그럼 난 머양? 한참을 고민하다가 함 CD 구워서 그래도 해 봐야지 하고 만들어 실행을 해보니 역쉬 부팅은 되나 머 없다 안되고, 역쉬 레노버 애덜이 괜히 써놓은 말이 아니구나 하고 좌절…. 그렇다고 바이오스 업뎃을 위해 OS를 다운그레이드 한뒤 다시 비스타 64로 바꾸기도 정말 삽질이고 해서 방법이 없을까하고 인터넷 검색 그러다가 걸린게 USB 메모리로 가상하드 만들어 부팅하기였다. 그래서 다음 같이 시도를 해 보았다.
준비물
- USB 부팅 및 포맷 유틸
- USB 메모리스틱에 OS 만들 Windows 98에서 뽑아낸 Boot 시스템 파일들
- 레노버 싸이트에서 자기 노트북에 맞는 BIOS ISO파일을 다운로드 한다.
http://www-06.ibm.com/jp/domino04/pc/support/beginner.nsf/document/TPAD-MATRIX-KR - USB 메모리 스틱 5Mbytes 이상되는것(저는 2G짜리 사용했음)
-
버추얼 cd 드라이버 프로그램 (데몬시디,매직디스크 등 각자 쓰고 계시는거 아무거나 컴에 깔려 있음됨)
실행절차
- 먼저 USB 부팅 및 포맷 유틸 압축 풀어 인스톨하면 c:\dirvekey 리고 폴더가 생성될 것이다.
- 그리고 제가 올린 windows98 boot files을 다운받아 압축을 풀어 C:\98boot 라고 폴더 만들어 그 폴더에 복사
- 레노버에서 다운 받은 각자의 BIOS 업데이트 이미지 파일을 가상시디에 불러 올린다.(이때 가상시디 드라이브가 D: 인지 E: 인지 머인지 꼭 확인해 둘 것)
- 윈도우 시작버튼 누르고 --> 보조프로그램 --> 명령 프롬프트 선택하면 도스창이 뜬다.
- 그리고 USB 메모리를 꽂는다. (이것도 드라이브 명하고 라벨네임 확인할것)
- 도스창에 "cd c:\drivekeyt" 라고 치고 엔터 그럼 c:\drivekey 디렉토리로 갈 것이당.
- 거기서 "hpusbf.exe G: -B:C:\98boot" 치시고 엔터 그럼 메시지 뜨면서 물어보면 무조건 yes 그리고 저는 USB 드라이브가 G: 여서 G로 명령에 넣었는데 여러분들 각자의 USB드라이브 위치를 넣어 주심됩니다.
- 그리고 중간에 포맷전에 현재 드라이브 label 이 머냐고 물어 봅니다. 거기에 현재 USB 드라이브 라벨을 입력 하심 됩니다. 그런데 이건 미리 윈도우 탐색기를 사용해 스페이스 없이 가급적 짧게 이름을 만들어 주심이 좋습니다.
- 그럼 완료 했다고 나오고 완료되면 "cd c:\98boot" 하고 엔터 치면 98boot 리렉토리로 갑니다.
- 거기서 "copy *.* G:"하고 엔터(아까 설명 드렸듯 G:는 각자의 USB 드라이브 입니다.) 이 명령 실행후 겹치는 파일 다시복사 할까요 나오면 무조건 No 입니다.
- 그리고 "copy E:\*.* G:" 하고 엔터 여기서 E:는 가상시디롬 드라이브 입니다.
- 이렇게 하시고 노트북 다시 시작해서 레노보 고로 뜰때 F12 키 겁나 누르면 화면에 부팅드라이브 순서 정하는 화면 나옵니다. 여기서 "-USB HD" 라고 되어 있는 항목 맨 위로 올립니다. 물론 USB 메모리 꽂은 상태이어야 합니다.
- 잠시 기다리면 도스화면 뜰 겁니다. 그럼 성공한 겁니다.
- 그럼 "UPDTFLSH.EXE" 라고 치면 도스화면 하나 뜰 겁니다. 거기서 질문을 하는데 무조건 yes 랑 엔터 치고 진행하면 마지막 가서 화면 한 1~3분 정도 정지해 있으면서 업데이트 중이라 나옵니다.
-
여기 까지 하면 끝입니다. 확인은 바이오스 셋업가서 확인하시면 됩니다. 가급적 설명을 초보분들도 쉽게 알 수 있도록 설명을 드렸는데 중요한 것은 꼭 전원을 연결해 놓고 하십시오. 중간에 전원나가면 센터로 가셔야 할 겁니다. 그리고 제가 설명해 놓은 것 따라 하시고 발생하는 모든 책임은 각자에게 있다는 걸 명심하십시오. 그럼 즐거운 날 되십시오.
BIOS Upgrade/X Series
Contents
- 1 Approach 1: Use larger boot image and create virtual CD drive
- 1.1 Comments on Approach 1
- 2 Approach 2: Load an USB driver, create RAM disk and copy the files to the RAM disk
- 2.1 Comments on Approach 2
- 3 Approach 3: Alternative method using a USB stick
- 4 Approach 4: Alternative method to the above "alternative method"
- 4.1 Comments on Approach 4
- 5 Approach 5: Free Alternative method to the above "alternative method"
-
X Series Thinkpads do not have an internal drive. If there is no Windows installed, the BIOS must be updated by booting from an USB drive or a drive that is integrated in the docking station. Since a while Lenovo provides BIOS updates in form of bootable CD images. Unfortunately, these images are intended to be used with the docking station's CD drive. If you do not own such a drive, things get complicated.
The problem is that current BIOS updates are quite large, about 3 MB in size. Booting from CDs typically works like booting from a 1.44 MB or 2.88 MB floppy disk. The floppy image is stored on the CD and is referenced in the CD's boot record. Because the BIOS update file are that large, they do not fit on such a floppy image. Thus, they must be stored on the CD outside the virtual floppy image. To access these files a driver for the CD drive has to be loaded. Since Lenovo's CD images are intended to be used with a docking station's CD drive, it is not possible to use them for BIOS updates by booting from an USB CD drive.
Another problem is that older X Series (like the X32) don't have bootable iso images at all. They have only two options: 1. update from Windows, 2. update using a diskette updater, which requires you to have a real floppy disk drive.
But there is hope. This page describes some approaches to solve the problems above.
Here is a brief overview of each approach:
- #Approach 1: Use larger boot image and create virtual CD drive
Requires a USB CD drive. Reported to work on X60s. - #Approach 2: Load an USB driver, create RAM disk and copy the files to the RAM disk
Requires a USB CD drive. People have reported mixed results, with the flash update software freezing, depending on things like CD drive letter and type. Reported to work on X60s. - #Approach 3: Alternative method using a USB stick
Requires a USB flash drive, Microsoft Windows, and some HP software tool. Reported to work on X60s, X61. - #Approach 4: Alternative method to the above "alternative method"
Requires a USB flash drive, Microsoft Windows, and some HP software tool. Seems functionally similar to Approach 3. - #Approach 5: Free Alternative method to the above "alternative method"
Requires a USB flash drive, does not require MS Windows or any proprietary software. -
#Approach 6: Using a USB stick to upgrade BIOS on older X Series Thinkpads
Requires a USB flash drive. Reported to work on X32.Approach 1: Use larger boot image and create virtual CD drive
The CD images provided by Lenovo can be modified such that a BIOS update is possible -- without loading any drivers. I (Joachim Selke) successfully updated my Thinkpad X60s using the following method.
My first idea was to take Lenovo's ISO CD image and modify it such that a USB CD drive can be used instead the CD drive in the docking station. Unfortunately, simply replacing the drivers is not enough. While doing the BIOS update, the USB ports seem to get disabled or something like that. To circumvent this problem I tried to create a RAM disk, copy the needed files to this RAM disk, and then use this RAM disk as some kind of virtual CD drive. However, there were some problems with this approach as reported below. For a description of this old approach see the section "Approach 2: Load an USB driver, create RAM disk and copy the files to the RAM disk" below. I developed a new approach to solve this problem and will describe it here.
The idea is to create a new bootable ISO image that is large enough to hold the original ISO file. This can be done by switching from the virtual floppy drive used by Lenovo's update disk to a virtual hard disk drive (for details, see the El Torito standard). Instead of loading the CD drive driver provided by Lenovo we load the [SHSUCD drivers]. This driver enables us to create a virtual CD drive from Lenovo's original ISO file.
I wrote a script to automate this steps and create a new ISO file from Lenovo's ISO file. This new ISO file can directly be used to update the BIOS. My script takes four arguments:
- the filename of Lenovo's original ISO file (e.g. /home/selke/Desktop/7buj23uc.iso)
- the filename of the new ISO file to be created (e.g. /home/selke/Desktop/out.iso)
- the location of shsucdrd.exe (e.g. /home/selke/Desktop/shsucdrd.exe
-
the location of shsucdx.com (e.g. /home/selke/Desktop/shsucdx.com
Both shsucdrd.exe and shsucdx.com can be downloaded from [1].
To sum up, an example call of the script would be convertlenovo.sh /home/selke/Desktop/7buj23uc.iso /home/selke/Desktop/out.iso /home/selke/Desktop/shsucdrd.exe /home/selke/Desktop/shsucdx.com
Note that you need recent versions of the following tools:
- mkdosfs (for Fedora users: contained in the package dosfstools)
-
mkisofs
The script runs perfectly on my Fedora 8 system (it should also run without problems on Fedora 7 and other popular distributions). If there are problems, please tell me (Joachim Selke).
Further note that the script at some point requires you to enter the root password since it must mount a disk image. As far as I know, this cannot be done without root privileges.
What does the script do? I will give a short overview:
- Extract the boot floppy image from Lenovo's bootable ISO file.
- Create a new boot hard disk image and copy both the boot sector and the files from Lenovo's boot floppy image to the new image.
- Copy Lenovo's ISO image to the new hard disk image.
- Also copy the SHSUCD drivers to the hard disk and change autoexec.bat and config.sys accordingly. When booting this hard disk image a new virtual CD drive will be created by SHSUCD. This virtual CD drive will have Lenovo's original ISO disc "inserted."
-
Create a new ISO file that only consists of the boot image given by the bootable hard disk image just created.
Some additional notes:
- Currently, the script is not able to handle spaces in file names properly. Thus, the file names and directory path names used when calling the script should not contain spaces.
-
The file name of the original ISO file (7buj23uc.iso in the example above) must follow the DOS 8.3 file name conventions; otherwise SHSUCD will not be able to load the ISO image.
Here is the complete script (save it as convertlenovo.sh):
#!/bin/bash
# Written by Joachim Selke (mail@joachim-selke.de), 2007-12-28
# Known bugs:
# - spaces in file names make trouble at the moment (so try to avoid spaces),
# I will fix that later
# - some users seem to have problems with some of the sed statements,
# I currently have no idea what is wrong there ... (please report those bugs)
CDIMAGE=$1 # location of Lenovo's CD image
NEWCDIMAGE=$2 # filename of ISO file to create
SHSUCDRD_EXE=$3 # location of shsucdrd.exe
SHSUCDX_COM=$4 # location of shsucdx.com
MB_HDD=50 # HDD image size in megabyte (base 1000)
TMPDIR=`mktemp -d`
ISODIR=`mktemp -d`
HDDIMG=$ISODIR/hdd.img # filename of HDD image to create
FLOPPYIMG=$TMPDIR/floppy.img # filename of floppy image to create
##############################################################################
# This script extracts the floopy boot image from bootable ISO images
#
# Written by Joachim Selke (mail@joachim-selke.de), 2007-04-07
ISOFILE=$CDIMAGE
IMAGEFILE=$FLOPPYIMG
if [ ! -r $ISOFILE ]; then
echo $ISOFILE: file does not exist or is not readable
exit 1
fi
if [ -z $IMAGEFILE ]; then
echo Error: no image file specified
exit 1
fi
ISOFILESIZE=`stat -c %s $ISOFILE`
# collect El Torito data
# see http://www.phoenix.com/NR/rdonlyres/98D3219C-9CC9-4DF5-B496-A286D893E36A/0/specscdrom.pdf for reference
BOOTCATALOGPOINTERBYTE=$((17 * 0x800 + 0x47))
if [ $ISOFILESIZE -lt $(($BOOTCATALOGPOINTERBYTE + 4)) ]; then
echo ISO file is too short, possibly damaged
exit 1
fi
# absolute pointer to first sector of boot catalog:
BOOTCATALOG=`od -A n -t x4 -N 4 -j $BOOTCATALOGPOINTERBYTE $ISOFILE | tr -d [:blank:]`
BOOTCATALOGBYTE=$((0x$BOOTCATALOG * 0x800))
echo Boot catalog starts at byte $BOOTCATALOGBYTE
if [ $ISOFILESIZE -lt $(($BOOTCATALOGBYTE + 32 + 2)) ]; then
echo ISO file is too short, possibly damaged
exit 1
fi
# media type of boot image
# only floppy disk images are supported by this script
BOOTMEDIATYPE=`od -A n -t x1 -N 1 -j $(($BOOTCATALOGBYTE + 32 + 1)) $ISOFILE | tr -d [:blank:]`
if [ $BOOTMEDIATYPE -eq 1 ]; then
echo Boot media type is 1.2M floppy disk
IMAGEBLOCKS=$((1200 / 2))
elif [ $BOOTMEDIATYPE -eq 2 ]; then
echo Boot media type is 1.44M floppy disk
IMAGEBLOCKS=$((1440 / 2))
elif [ $BOOTMEDIATYPE -eq 3 ]; then
echo Boot media type is 2.88M floppy disk
IMAGEBLOCKS=$((2880 / 2))
else
echo Boot media type is $((0x$BOOTMEDIATYPE)). This type is not supported yet.
exit 1
fi
# absolute pointer to start of boot image
BOOTIMAGE=`od -A n -t x4 -N 4 -j $(($BOOTCATALOGBYTE + 32 + 8)) $ISOFILE | tr -d [:blank:]`
BOOTIMAGEBYTE=$((0x$BOOTIMAGE * 0x800))
echo Boot image starts at byte $BOOTIMAGEBYTE
if [ $ISOFILESIZE -lt $((0x$BOOTIMAGE * 0x800 + $IMAGEBLOCKS * 0x800)) ]; then
echo ISO file is too short, possibly damaged
exit 1
fi
echo Extracting boot image ...
dd if=$ISOFILE of=$IMAGEFILE bs=2K count=$IMAGEBLOCKS skip=$((0x$BOOTIMAGE))
echo Finished
##############################################################################
NO_HEA=16 # heads
NO_SECT=63 # sectors per cylinder/track
B_SECT=512 # bytes per sector
B_CYL=$(($NO_HEA * $NO_SECT * $B_SECT)) # bytes per cylinder/track
NO_CYL=$(($MB_HDD * 1000 * 1000 / $B_CYL)) # cylinders/tracks per head
echo -n -e "Cylinders: $NO_CYL\nHeads: $NO_HEA\nSectors per track: $NO_SECT\nBytes per sector: $B_SECT\n"
echo Creating empty image ...
dd if=/dev/zero of=$HDDIMG bs=$B_CYL count=$NO_CYL >/dev/null 2>&1
echo Creating partition structure ...
echo -n -e "o\n n\n p\n 1\n \n \n t\n 6\n a\n 1\n w\n" | /sbin/fdisk -b $B_SECT -C $NO_CYL -H $NO_HEA -S $NO_SECT $HDDIMG >/dev/null 2>&1
echo Writing master boot record ...
echo -n -e "\
\xFA\xB8\x00\x10\x8E\xD0\xBC\x00\xB0\xB8\x00\x00\x8E\xD8\x8E\xC0\
\xFB\xBE\x00\x7C\xBF\x00\x06\xB9\x00\x02\xF3\xA4\xEA\x21\x06\x00\
\x00\xBE\xBE\x07\x38\x04\x75\x0B\x83\xC6\x10\x81\xFE\xFE\x07\x75\
\xF3\xEB\x16\xB4\x02\xB0\x01\xBB\x00\x7C\xB2\x80\x8A\x74\x01\x8B\
\x4C\x02\xCD\x13\xEA\x00\x7C\x00\x00\xEB\xFE\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x52\xF9\x06\x00\x00\x00\
" | dd of=$HDDIMG bs=1 conv=notrunc >/dev/null 2>&1
echo Creating primary partition ...
# extract partition, create FAT16 filesystem and copy back
PARTFILE=${HDDIMG}-PARTITION
SECT_PARTTABLE=$NO_SECT
B_PARTTABLE=$(($SECT_PARTTABLE * $B_SECT))
dd if=$HDDIMG of=$PARTFILE bs=$B_SECT skip=$SECT_PARTTABLE >/dev/null 2>&1
/sbin/mkdosfs -F 16 -h $NO_SECT $PARTFILE
# Correct physical drive number (set to 0x00, should be 0x80)
echo -n -e "\x80" | dd of=$PARTFILE bs=1 seek=36 conv=notrunc >/dev/null 2>&1
# Correct sectors per track (set to 0x0020, should be $NO_SECT)
NO_SECT_HEX1=$(echo "ibase=10; obase=16; $(($NO_SECT / 256))" | bc)
NO_SECT_HEX2=$(echo "ibase=10; obase=16; $(($NO_SECT % 256))" | bc)
NO_SECT_HEX=$(echo -n -e "\\x$NO_SECT_HEX2\\x$NO_SECT_HEX1")
echo -n -e $NO_SECT_HEX | dd of=$PARTFILE bs=1 seek=24 conv=notrunc >/dev/null 2>&1
dd if=$PARTFILE of=$HDDIMG bs=$B_SECT seek=$SECT_PARTTABLE >/dev/null 2>&1
rm -f $PARTFILE
# transfer floppy boot sector code
B_BOOTSECPARAM=62 # length of parameter block in boot sector
B_BOOTSECCODE=$(($B_SECT - B_BOOTSECPARAM)) # length of code block in boot sector
echo Copying boot sector ...
dd if=$FLOPPYIMG of=$HDDIMG bs=1 count=$B_BOOTSECCODE skip=$B_BOOTSECPARAM seek=$(($B_PARTTABLE + $B_BOOTSECPARAM)) conv=notrunc >/dev/null 2>&1
echo Copying DOS files ...
CDIMAGE_BASENAME=$(basename $CDIMAGE)
HDDDIR=$TMPDIR/hdd
FLOPPYDIR=$TMPDIR/floppy
su --command="\
mkdir $HDDDIR;\
mkdir $FLOPPYDIR;\
mount -oloop $FLOPPYIMG $FLOPPYDIR;\
mount -t msdos -oloop,offset=$(($SECT_PARTTABLE * $B_SECT)) $HDDIMG $HDDDIR;\
cp --preserve $FLOPPYDIR/ibmbio.com $HDDDIR;\
cp --preserve $FLOPPYDIR/ibmdos.com $HDDDIR;\
cp --preserve -u $FLOPPYDIR/* $HDDDIR;\
cp --preserve=timestamps $CDIMAGE $HDDDIR;\
cp --preserve=timestamps $SHSUCDRD_EXE $HDDDIR;\
cp --preserve=timestamps $SHSUCDX_COM $HDDDIR;\
cat $FLOPPYDIR/config.sys | \
sed -e 's/A:\\\/C:\\\/' | \
grep -v IBMTPCD.SYS >$HDDDIR/config.sys;\
cat $FLOPPYDIR/autoexec.bat | \
sed -e 's/LOADHIGH MSCDEX.EXE \/D:TPCD001/shsucdrd.exe \/f:$CDIMAGE_BASENAME\r\nshsucdx.com \/d:SHSU-CDR,R/' >$HDDDIR/autoexec.bat;\
umount $FLOPPYDIR;\
umount $HDDDIR;\
rm -rf $FLOPPYDIR;\
rm -rf $HDDDIR"
echo Creating ISO image ...
mkisofs -input-charset default -hard-disk-boot -b $(basename $HDDIMG) -hide boot.cat -hide $(basename $HDDIMG) -o $NEWCDIMAGE $ISODIR
rm -rf $TMPDIR
rm -rf $ISODIR
echo Completed!If you have any questions, feel free to ask. :-)
BTW: It would be much simpler if I simply could put the new ISO images for download somewhere. But I guess for legal reasons this will not be possible.
Comments on Approach 1
- Reported to work on:
- ThinkPad X60s (1702-55G) with Plextor PX-608CU USB DVD recorder
- ThinkPad X60 (1702-55G) with Plextor PX-608CU USB DVD recorder, upgraded BIOS from version 2.14 to 2.16
- ThinkPad X60 (1706-GMG) with Plextor PX-608CU USB DVD recorder, upgraded BIOS from version 2.03 to 2.14
-
ThinkPad X61s (7666-36G) with Freecom FS-50 USB DVD recorder, upgraded BIOS from version 1.10 to 2.07
Approach 2: Load an USB driver, create RAM disk and copy the files to the RAM disk
I ( Joachim Selke) successfully updated my Thinkpad X60s using the following method.
My first idea was to take Lenovo's ISO CD image and modify it such that a USB CD drive can be used instead the CD drive in the docking station. Unfortunately, simply replacing the drivers is not enough. While doing the BIOS update, the USB ports seem to get disabled or something like that. To circumvent this problem I tried to create a RAM disk, copy the needed files to this RAM disk, and then use this RAM disk as some kind of virtual CD drive. However, there were some problems with this approach as reported below.
- Download the ISO image style BIOS update from Lenovo's website. This file will be refered to as /tmp/bios-lenovo.iso.
- Extract the floppy image from this ISO image. You can use the following shell script for this task (or an alternative one from [2]). Simply save this code into the file /tmp/extractbootimage.sh, set the x-flag (chmod +x /tmp/extractbootimage.sh) and call it using the command /tmp/extractbootimage.sh /tmp/bios-lenovo.iso /tmp/bios-lenovo.img. The floppy image contained in the ISO image will then be saved to /tmp/bios-lenovo.img. Here is the code of the shell script:
#!/bin/bash
# This script extracts the floopy boot image from bootable ISO images
#
# Written by Joachim Selke (mail@joachim-selke.de), 2007-04-07
ISOFILE=$1
IMAGEFILE=$2
if [ ! -r $ISOFILE ]; then
echo $ISOFILE: file does not exist or is not readable
exit 1
fi
if [ -z $IMAGEFILE ]; then
echo Error: no image file specified
exit 1
fi
ISOFILESIZE=`stat -c %s $ISOFILE`
# collect El Torito data
# see http://www.phoenix.com/NR/rdonlyres/98D3219C-9CC9-4DF5-B496-A286D893E36A/0/specscdrom.pdf for reference
BOOTCATALOGPOINTERBYTE=$((17 * 0x800 + 0x47))
if [ $ISOFILESIZE -lt $(($BOOTCATALOGPOINTERBYTE + 4)) ]; then
echo ISO file is too short, possibly damaged
exit 1
fi
# absolute pointer to first sector of boot catalog:
BOOTCATALOG=`od -A n -t x4 -N 4 -j $BOOTCATALOGPOINTERBYTE $ISOFILE | tr -d [:blank:]`
BOOTCATALOGBYTE=$((0x$BOOTCATALOG * 0x800))
echo Boot catalog starts at byte $BOOTCATALOGBYTE
if [ $ISOFILESIZE -lt $(($BOOTCATALOGBYTE + 32 + 2)) ]; then
echo ISO file is too short, possibly damaged
exit 1
fi
# media type of boot image
# only floppy disk images are supported by this script
BOOTMEDIATYPE=`od -A n -t x1 -N 1 -j $(($BOOTCATALOGBYTE + 32 + 1)) $ISOFILE | tr -d [:blank:]`
if [ $BOOTMEDIATYPE -eq 1 ]; then
echo Boot media type is 1.2M floppy disk
IMAGEBLOCKS=$((1200 / 2))
elif [ $BOOTMEDIATYPE -eq 2 ]; then
echo Boot media type is 1.44M floppy disk
IMAGEBLOCKS=$((1440 / 2))
elif [ $BOOTMEDIATYPE -eq 3 ]; then
echo Boot media type is 2.88M floppy disk
IMAGEBLOCKS=$((2880 / 2))
else
echo Boot media type is $((0x$BOOTMEDIATYPE)). This type is not supported yet.
exit 1
fi
# absolute pointer to start of boot image
BOOTIMAGE=`od -A n -t x4 -N 4 -j $(($BOOTCATALOGBYTE + 32 + 8)) $ISOFILE | tr -d [:blank:]`
BOOTIMAGEBYTE=$((0x$BOOTIMAGE * 0x800))
echo Boot image starts at byte $BOOTIMAGEBYTE
if [ $ISOFILESIZE -lt $((0x$BOOTIMAGE * 0x800 + $IMAGEBLOCKS * 0x800)) ]; then
echo ISO file is too short, possibly damaged
exit 1
fi
echo Extracting boot image ...
dd if=$ISOFILE of=$IMAGEFILE bs=2K count=$IMAGEBLOCKS skip=$((0x$BOOTIMAGE))
echo Finished - Mount the floppy image as root using the loop device:
# mkdir /tmp/bios-lenovo.img-mnt
# mount -o loop /tmp/bios-lenovo.img /tmp/bios-lenovo.img-mnt
The image is now mounted as /tmp/bios-lenovo.img-mnt. - Download needed drivers. First download some USB drivers from Panasonic Japan. Save the file to /tmp/f2h_usb.exe This file is a self-extracting EXE file, that can be executed under Linux using Wine:
$ wine /tmp/f2h_usb.exe
You will be asked where to save the extracted files. Choose /tmp. A new directory /tmp/F2h containing the needed drivers will be created. Additionally, you will need drivers for the RAM disk mentioned. Download them from the ReSizeable RAMDisk project. Unzip them to /tmp/srdisk. - Let's modify the floppy image:
$ cp /tmp/F2h/Usbaspi.sys /tmp/bios-lenovo.img-mnt/
$ cp /tmp/F2h/USBCD.SYS /tmp/bios-lenovo.img-mnt/
$ cp /tmp/F2h/RAMFD.SYS /tmp/bios-lenovo.img-mnt/
$ cp /tmp/srdisk/srdxms.sys /tmp/bios-lenovo.img-mnt/
$ cp /tmp/srdisk/srdisk.exe /tmp/bios-lenovo.img-mnt/
Now add the following lines to /tmp/bios-lenovo.img-mnt/config.sys replacing the line DEVICE = A:\IBMTPCD.SYS /R /C:
DEVICE = A:\SRDXMS.SYS
DEVICE = A:\RAMFD.SYS
DEVICE = A:\USBASPI.SYS /V
DEVICE = A:\USBCD.SYS /D:TPCD001
Finally, edit the file /tmp/bios-lenovo.img-mnt/autoexec.bat replacing the last line (saying COMMAND.COM) by the following:
A:\SRDISK 10000
COPY *.* D:
D:
COMMAND.COM
Maybe the RAM disk gets a drive letter different from D: on your system. In this case, you have to change the above lines accordingly. - Unmount the floppy image (as root):
# umount /tmp/bios-lenovo.img-mnt - Copy the content of the original CD image to a new directory and create a new ISO file:
# mkdir /tmp/bios-lenovo.iso-mnt
# mount -o loop /tmp/bios-lenovo.iso /tmp/bios-lenovo.iso-mnt
$ mkdir /tmp/bios-new.iso-mnt
$ cp /tmp/bios-lenovo.iso-mnt/* /tmp/bios-new.iso-mnt
$ cp /tmp/bios-lenovo.img /tmp/bios-new.iso-mnt/boot.img
# umount /tmp/bios-lenovo.iso-mnt
$ mkisofs -relaxed-filenames -b boot.img -o /tmp/bios-new.iso /tmp/bios-new.iso-mnt/ -
The file /tmp/bios-new.iso is the modified ISO file. Just burn it to CD and use this CD for updating your BIOS (boot from it using your USB drive). Please give some comments here if it worked for you.
Comments on Approach 2
- I have followed your excellent instructions. The CD booted, the update program ran but stopped working and responding while updating. Luckily the BIOS was not destroyed. Since destroying the BIOS is a very high risk, I am going to recover the original Windows on an old HD and will run the update exe update program from there.
- I followed these clear instructions, and like the comment above I ended up with a CD that booted but the update program stopped working and responding. An ALT-CTRL-DELETE rebooted my x60s, and it works so the BIOS must not have been damaged. I was trying to upgrade from version 2.08 to 2.11, I wonder if these instructions are somehow particular to certain versions? Latch 01:22, 14 June 2007 (UTC)
- After following the above instructions, the program also stopped working while updating the BIOS. But after changing the drive letter from D: to C: (see code below), it everything worked fine. However, I had some trouble figuring out, which letter to choose over D: at first, as the BIOS Upgrade program started right away.
A:\SRDISK 10000
COPY *.* C:
C:
COMMAND.COM
Mtx, 1 August 2007, Thinkpad X61s- Flashing the bios (2.12) works for me on a X60s (using drive c). Using the DVD-R on an USB-Hub did not work.
Ra 00:15, 21 August 2007 (UTC)Flashing BIOS 2.14 works for me on a X60s (using drive c). 25-02-2008Approach 3: Alternative method using a USB stick
Note: none of the above methods worked on my X60s. This method worked for me, however. PhilipPaeps 16:41, 24 August 2007 (UTC)
This method was surprisingly painless once I convinced my ThinkPad X60s to boot DOS from a USB stick. I used VMWare and some mystical tool to get DOS on the stick. If you can find another way to get a bootable DOS stick, please update this section!
- Tell VMWare to create a virtual floppy image for you and format it under Microsoft Windows and tell it to create a system disk. You can do this by clicking into "My Computer", then right-clicking on the "Floppy" icon and selecting "Format". In the box that pops up, you need to check the box that says "Create an MS-DOS startup disk" and then click "Start".
- When you've done that, get this tool: http://www.techpowerup.com/downloads/330/mirrors.php and install it. The tool is apparantly something HP once wrote, but I have been unable to find a link to it anywhere on the HP website.
- In a command prompt again: C:\DriveKey\HPUSBF.EXE E: -Q -B:A:\, replacing the E: with the "drive letter" associated with your USB stick (you can find this letter in "My Computer" under "Removable Storage"). WARNING: this wipes anything on the USB stick. You will end up with a USB stick which appears empty at this point, but there is DOS on it somewhere.
Now mount the BIOS update ISO image from Lenovo as a virtual CDROM using VMWare again and copy the files from it to the USB stick: copy D:\*.* E:\.At this point, you may want to fiddle with the splash image, as described elsewhere on ThinkWiki.
- Reboot and press F12, tell the BIOS to boot from your USB stick.
cd flash ; updtflsh.exeThink happy thoughts. The ThinkPad will beep quite ominously (and loudly!) a couple of times. Do not let this worry you too much. After about three minutes, the program will ask you to press enter to restart and hopefully all will be well.
Approach 4: Alternative method to the above "alternative method"
This is based on the above "Alternative Method" and works on my X60.
1. Download the BIOS Update iso image and the USB Stick Formatter.
2. Now get access to Windows -- be it in an emulator, or a colleague's PC. Steps 3, 4, 5 needs Windows to complete.
3. Install the HP USB Stick Formatter.
4. Go to the directory where you installed the tool: e.g. C:\DriveKey and extract HPUSBF.EXE to a new directory HPUSBF\ (using WinRAR, 7zip or similar).
5. Run the HPUSBFW.EXE utility, selecting the location of system files as C:\DriveKey\HPUSBF, and let it format the USB stick.
6. Extract the iso image to the USB stick, for example to K:\7buj22us (K: being the USB stick).
7. On the target computer, boot with the USB stick and issue the commands "cd 7buj22us" then "command.com"
This brings up the BIOS flash interface and you can update your BIOS from here.
Comments on Approach 4
- I (Martin Aulbach) followed these clear instructions and updated my X61t (from BIOS v1.08 to v1.10) without any problems and with a nice graphic splash screen. It is not necessary to let Windows format the USB stick as a MS-DOS startup disk, as outlined in Approach 3. The HP format tool will take care of this (in Step 5) and the USB stick will boot sucessfully at startup (correct boot order provided).
This update to BIOS 2.14 worked on a brand-new X61s, 2008-06-27. (adsmith)Approach 5: Free Alternative method to the above "alternative method"
This is functionally equivalent to the above two "alternative methods", yet does not depend on MS Windows or any other proprietary software. It updates the BIOS through a bootable USB stick, and depends upon the FreeDOS, SYSLINUX, and AdvanceMAME projects. A detailed description is provided at [3].
Approach 6: Using a USB stick to upgrade BIOS on older X Series Thinkpads
This method has been successfully applied for upgrading an X32 Thinkpad. The previous BIOS version was 3.00d, and it was upgraded to 3.02 . Below are the steps:
1. Download the new BIOS and EC Diskette-type upgrades.
2. Make a DOS-bootable USB stick. See the section above for instructions on how to do this.
3. Copy the upgrade programs to the USB stick.
4. Make two zero-files (using dd), each with the size of a floppy disk.
5. Boot up the USB stick using QEMU, with the USB stick as hda, and the two floppy disk images as A: and B: .
6. Run the BIOS upgrade program, and select the first diskette as its destination. This will not actually upgrade the BIOS; it will only fill up the disk image.
7. Run the EC upgrade program, with the second diskette as target. Again, this will only fill up the disk image, not upgrade the EC.
8. Make two directories, C:\1 and C:\2 .
9. Copy the contents of the first diskette to C:\1 and the second diskette to C:\2 .
10. Exit QEMU, use the USB stick to boot the Thinkpad which BIOS we are going to upgrade.
11. cd into C:\1 and run command.com inside it. This will bring up the BIOS update interface, so update the BIOS.
12. After updating the BIOS, the machine will turn off by itself. Now boot again, with the same USB stick.
13. cd into C:\2 and run command.com inside it. This will bring up the EC update interface. Update the EC and wait for the machine to shut down completely.
14. Remove the USB stick. Now boot into the machine and go into BIOS setup. Right now you should see the new BIOS and EC version. If not, then something is wrong; make sure you have followed the above steps properly. Please also discuss this.
- Flashing the bios (2.12) works for me on a X60s (using drive c). Using the DVD-R on an USB-Hub did not work.
HP_USB_Boot_Utility.zip
Prev
Rss Feed