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