Saturday, November 27, 2010

Blog Moved!

This blog will continue at http://www.davychiu.com!

Wednesday, November 24, 2010

Toshiba Recovery TAF Files 東芝リカバリ

I upgraded a Toshiba TW720LL to Windows 7 and lost all the configuration utilities; plus I also deleted the recovery partition in the process. Fortunately, I created a ghost image of the disk before installing. I wanted to use the setup files on the Windows partition but they were accidentally deleted to make more free space. I didn't want to restore the laptop back to the old windows to recover the setup files so I loaded the disk in VMware and tried to create a recovery CD. However, the program (RDCLcher) to create the CD also was also accidentally removed.

So I resorted to try extract the TAF image files on the hidden, recovery partition. TAF files, I discovered, are proprietary to Toshiba but looking at the decompression executable, it appears to be a wrapper for zlib.

Given more time, I may attempt to reverse engineer the wrapper. I opted to use the decompression tool as is to extract the TAF files. The tool was quite integrated with the recovery process. Being such, it was easier to persuade the recovery process to extract the files for me.

The recovery partition is bootable once it is set active. The recover process begins on boot but will restart when the DMI check does not find Toshiba hardware. There are two files that need to be modified for the recovery to work. The first file is recovery.bat in /bin and the second file is data.ini in /.

Above is what recovery.bat should look like. Edit out all checks like DMI and error returns.

In data.ini, CDNUM and CDMAX should be changed to 1. It should be noted that I extracted the recovery partition and mounted it as a CD. Upon booting the CD, all checks should pass and allow the recovery process to progress.

Here is the RDCLcher and Sonic software in case anyone accidentally removed theirs too.

http://rapidshare.com/files/432796544/toshiba_recovery.zip

*will be taken down upon request

Wednesday, November 17, 2010

Toshiba Laptop TW/720LL CPU Upgrade

The Toshiba TW/720LL laptop came stock with a Dothan Celeron M 1.4GHz CPU (SL8ML). I wanted to upgrade it to a faster Pentium M class CPU so I get the SpeedStep feature along with a minor boost in computation speed. Both the Pentium and Celeron are from the same Dothan architecture; so in theory, the upgrade is a simple switcheroo.

The chipset in the laptop is an ATI Radeon Xpress 200M. I had a difficult time looking for the specs to determine compatible processors. In the end, after looking at other brands with the same chipset with different CPU combination, I was certain chipset would work with both 400FSB and 533FSB CPUs.

I purchased a Pentium M 1.89GHz CPU (SL7S9) for $10 on eBay. A 2GHz+ processor would be ideal but that one was the least expensive.

http://www.irisvista.com/tech/laptops/Toshiba_Satellite_M55/laptop_motherboard_1.htm

The TW/720LL chassis is the same one as the Satellite M50/M55 laptop. Following the dissassembly guide, I replaced the CPU. Once complete, the laptop was able to boot and displayed the Pentium M logo instead of Celeron. =)

東芝 アップグレード

Monday, November 15, 2010

WordPress: Independent Homepage/Separate Home & Posts Page

I wanted to create a custom home/index (non-template) page for WordPress while having it serve other pages under the root directory. To my knowledge, this is not well documented and Google search results are of solutions that are rather "hacked" and require more work than required. There are two main steps to get this working.

1. Create 2 blank pages: home and blog. In wp-admin/settings/reading, set the "front page displays" like this.

2. Go to the folder of your theme and add the custom homepage file named front-page.php. This depends on the theme being used. For mine, it is located in /wp-content/themes/twentyten/front-page.php.

Once done, the home page should render the front-page.php without any templates and the blog at the registered permalink with the template/theme chosen.

Thursday, June 17, 2010

Supermicro X7DAE + Windows 7 = high DPC latency

I recently installed Windows 7 on a system with the Supermicro X7DAE motherboard. Once installed, anytime I tried to play any type of audio the sound would crackle. Initial google searches appeared to blame my Create XFI sound card. However, upon further testing using the Windows performance analysis tool, the motherboard seems to be at fault. The SMBus controller seemed to be saturating the bus for some reason. Once the device is disabled in device manager, DPC latency and audio return to normal.

Sunday, April 25, 2010

Power Supply Woes

In recent power surge and outage, the Seasonic SS-400ET power supply I had for about a year would not boot up. The power led on the motherboard blinked but nothing happened when I pushed the power button.

I knew Seasonic made reliable power supplies but dying over one power surge is unacceptable. Shipping it back for RMA would cost about the same as getting a new one, so I decided to open it up and fix it. I would suspect capacitor problems with cheaper power supplies but nonetheless I checked the capacitors. Low and behold, the standby power capacitor had bulged slightly. It appeared that the surge just stressed it enough to pop it.

Once it was replaced, it booted right up again.

Monday, April 5, 2010

Beagleboard & QNX: GPIO Interrupts

This is a short guide on how to use the GPIO interrupts on the Beagleboard running QNX.

My setup:
Beagleboard C3
512MB SD boot
4-port USB 2.0 hub
linksys USB 1.1 100TX adapter (for debug through momentics IDE)

references required:
  1. Beagleboard technical reference - http://beagleboard.org/resources
  2. OMAP3530 techinical reference manual (TRM) - http://focus.ti.com/docs/prod/folders/print/omap3515.html
steps overview:
  1. change mux to get GPIO signals (/src/hardware/startup/boards/omap3530/init_pinmux.c)
  2. add interrupt triggers (edge/level)
  3. write interrupt handler
For this guide, I will use use GPIO 130 and 131 as interrupt lines. Refer to BB TRM section 8.19.1 for what GPIO lines are available. Refer to section 7.4.4.3 in the TRM for which register the GPIO is muxed on. So in init_pinmux.c, I add:
/* ################GPIO5 SETUP################### */
/* MMC2 CLK */
pad = in32(CONTROL_PADCONF_MMC2_CLK) & 0x0000ffff;
out32(CONTROL_PADCONF_MMC2_CLK, pad | INPUTENABLE1 | PULLTYPE1_UP | PULLUDENABLE1 | MUXMODE1_MODE4);
/* MMC2 CMD */
pad = in32(CONTROL_PADCONF_MMC2_CLK) & 0xffff0000;
out32(CONTROL_PADCONF_MMC2_CLK, pad | INPUTENABLE0 | PULLTYPE0_UP | PULLUDENABLE0 | MUXMODE0_MODE4);

/* GPIO IRQ */
out32(OMAP3530_GPIO5_BASE + OMAP2420_GPIO_RISINGDETECT, (1 << 2)|(1 << 3));
out32(OMAP3530_GPIO5_BASE + OMAP2420_GPIO_FALLINGDETECT, (1 << 2)|(1 << 3));

Create a new QNX project to test the interrupt handler. GPIO5 lines share IRQ 33, so I would need to check the irqstatus of each line if I use more than one interrupt.
#define GPIO5_IRQ 33

int count;
int error;
struct sigevent event;

const struct sigevent *
isr_handler (void *arg, int id)
{
return (&event);
}

void *
int_thread (void *arg)
{
// enable I/O privilege
ThreadCtl (_NTO_TCTL_IO, 0);

// attach the ISR to IRQ
if (InterruptAttach (GPIO5_IRQ, isr_handler, NULL, 0, _NTO_INTR_FLAGS_TRK_MSK) == -1) {
error = 1;
}
while (1)
{
InterruptWait (NULL, NULL);
count++;
}
}

int main(int argc, char *argv[]) {
event.sigev_notify = SIGEV_INTR;

printf("Creating interrupt thread...\n");

pthread_create (NULL, NULL, int_thread, NULL);
delay(5);

while(!error) {
printf("count=%i\n", count);
fflush(stdout);
sleep(1);
}

return EXIT_SUCCESS;
}
In my example you have to reset 2 status registers to have the interrupts trigger again. After count++, add:

out32(omap3530_intc_base + 0xa8, 0x2);
out32(GPIO5 + OMAP35XX_GPIO_IRQSTATUS1, in32(GPIO5 + OMAP35XX_GPIO_IRQSTATUS1) | 0xFFFFFFFF);

I will make a more complete guide later on... feel free to comment or email questions.