Rockbox mail archiveSubject: Re: bootloader hanging early on 80G G5.5 iPod - debugging attempt
Re: bootloader hanging early on 80G G5.5 iPod - debugging attempt
From: Barry Wardell <barry.wardell_at_gmail.com>
Date: Wed, 11 Oct 2006 11:22:15 +0100
I remember having problems with sleep() hanging in the early days of the H10
port. How about replacing sleep(1) with udelay(10000)?
On 10/11/06, Paul Collins <paul_at_briny.ondioline.org> wrote:
> A number of people have succeeded in running Rockbox on their 30G G5.5
> iPods with some trickery: a regular bootloader and rockbox build,
> modified ipod_fw, a fresh 512bps filesystem, and an extra partition
> table entry for Rockbox's benefit, with the start and count multiplied
> by four. However, when I try the same technique on my 80G iPod, I
> find that the bootloader hangs while trying to read the MBR.
> amiconn suggested that I try to debug ATA init somehow, but there
> doesn't seem to be much to it. The value of the IDE control register
> is 0x20150020 - does that sound right?
> ata_device_init() (see firmware/target/arm/ata-pp5020.c) does
> outl(inl(0xc3000028) | (1 << 5), 0xc3000028);
> outl(inl(0xc3000028) & ~0x10000000, 0xc3000028);
> but that just writes back the register twice, unchanged, because
> neither of the bitwise operations alter any of the register's bits.
> This next bit is probably a waste of time if the ATA init is indeed
> the problem, but I got a nice tour through the Rockbox code on the
> way, so I don't mind.
> By adding a bunch of debugging messages, I traced the hang through the
> following call chain:
> [bootloader] main()
> -> disk_init()
> -> ata_read_sectors() (it's reading the MBR)
> -> copy_read_sectors
> status & STATUS_ERR is true
> -> perform_soft_reset() - which hangs
> perform_soft_reset() hangs here:
> static int perform_soft_reset(void)
> int ret;
> int retry_count;
> SET_REG(ATA_SELECT, SELECT_LBA | ata_device );
> SET_REG(ATA_CONTROL, CONTROL_nIEN|CONTROL_SRST );
> sleep(1); /* >= 5us */ <-- *** HANGS HERE ***
> SET_REG(ATA_CONTROL, CONTROL_nIEN);
> sleep(1); /* >2ms */
> lcd_log("sleep #2 done");
> /* This little sucker can take up to 30 seconds */
> retry_count = 8;
> ret = wait_for_rdy();
> } while(!ret && retry_count--);
> /* Massage the return code so it is 0 on success and -1 on failure
> ret = ret?0:-1;
> return ret;
> So that's a bit odd.
> I removed all of my LCD-writing calls from ata_read_sectors() on down,
> leaving just two: one before and one after that first sleep(1) call,
> and that seems to definitely be where it hangs - I see the before
> message, and not the after message.
> Suggestions for more stuff to try are welcome.
> Paul Collins
> Wellington, New Zealand
> Dag vijandelijk luchtschip de huismeester is dood
Received on 2006-10-11