I think this is what I am looking for:
‘devb-eide eide nomaster’
Based on your suggestion to use .altboot I played around with that approach (rather, multiple images on a qnx6 fs) and stopped staring at driver options. Works fine, but I would prefer to avoid the extra delay associated with the boot image selection menu timeout.
Once my attention was shifted away from driver options, I found the simple driver option I should have found in the first place.
Rather than looking for an option to force the slave device name to be fixed regardless of the presence of a master, I should be looking for an option to force the controller to ignore the master so the slave is always found first, regardless of the presence of a master. This is the ‘eide nomaster’ option.
I set the BIOS boot order to Slave first, Master second. For production, and testing, the system will always boot from the CF drive, with or w/o a master attached, and the CF drive will always be hd0, so my CF drive boot script can explicitly map hd0 to /. Like this:
‘devb-eide eide ioport=0x1f0,irq=14,pio=4,nomaster blk automount=hd0t179:/’
If I do attach my ext HD (dev system)to the master channel, and override the boot order (fortunately, my BIOS has a hotkey for this), I can boot to the ext HD and a generic QNX install. The CF drive will now be mapped to hd1, but I don’t care when booting a development system.
For those who got here desperately searching for any help with boot scripts and all things bootable, here is what I learned:
‘devb-eide eide ioport=0x1f0,irq=14’
‘ioport=0x1f0’ forces the eide driver to scan only the primary EIDE controller (at legacy address 0x1f0). ‘devb-eide eide’ will scan both the primary and secondary controller (even if the secondary controller is disabled in BIOS). Scanning for the secondary controller takes time. This option reduces the boot time a bit (I don’t have any measurements).
I though ‘devb-eide eide chnl=0’ would do this, but based on slog inspection I suspect either a) chnl refers to something other than 'primary/secondary (like master/slave or some PCI stuff), or b) ‘chnl=’ is an assignment (or override) rather than a restriction (like ‘ioport=’). Don’t really care any more.
I also found that specifying the irq is necessary if you specify an ioport. I thought that if I only specify an ioport, a default irq would be used. Not.
‘devb-eide eide pio=4’
Maybe this is not necessary. It’s just the right value for the CF drive I use. Found it in BIOS and slog inspection.
‘devb-eide eide nomaster’
The point of this post. Force the eide driver to ignore any device on the master channel of the controller, so that a device on the slave channel will always be the first device found (and always be named hd0).
‘devb-eide blk automount=hd0t179:/’
By telling the blk driver to mount hd0t179 as /, I do not have to include the ‘mount’ binary in the boot image. Every little bit counts (a smaller image loads faster). Otherwise, I would have to include ‘mount -t qnx6 /dev/hd0t179 /’ in the boot script, and the ‘mount’ binary in the image.
Incidentally, the mounting is the only real obstacle in the problem I described. If I do not know the name of the CF drive (because there may or may not be another device on the master channel when this boot script executes), then I can not mount the CF drive. Rather, a script would have to iterate through all detected devices, mount them, and look for a clue indicating it is the device that contains the fs to mount as /. Mounting and un-mounting increases boot time ( a little bit).