README on the Compact Flash for Card Engines ============================================ There are three challenges in supporting the CF interface of the Card Engines. First, every IO operation must be followed with IO to another memory region. Second, the slot is wired for one-to-one address mapping *and* it is wired for 16 bit access only. Second, the interrupt request line from the CF device isn't wired. The IOBARRIER issue is covered in README.IOBARRIER. This isn't an onerous problem. Enough said here. The addressing issue is solved in the arch/arm/mach-lh7a40x/ide-lpd7a40x.c file with some awkward work-arounds. We implement a special SELECT_DRIVE routine that is called before the IDE driver performs its own SELECT_DRIVE. Our code recognizes that the SELECT register cannot be modified without also writing a command. It send an IDLE_IMMEDIATE command on selecting a drive. The function also prevents drive select to the slave drive since there can be only one. The awkward part is that the IDE driver, even though we have a select procedure, also attempts to change the drive by writing directly the SELECT register. This attempt is explicitly blocked by the OUTB function--not pretty, but effective. The lack of interrupts is a more serious problem. Even though the CF card is fast when compared to a normal IDE device, we don't know that the CF is really flash. A user could use one of the very small hard drives being shipped with a CF interface. The IDE code includes a check for interfaces that lack an IRQ. In these cases, submitting a command to the IDE controller is followed by a call to poll for completion. If the device isn't immediately ready, it schedules a timer to poll again later.