Further explanation of writing a FileCore based filing system.

Read/Writing Sectors

i) Single data transfer in foreground.

You, the filing system, will be given:

r2 = disc address
r3 = start of data in RAM
r4 = length of data

The start may be non-word aligned and the length may be not a whole number of sectors big.

You should transfer the data to/from the disc in foreground, returning to FileCore once the transfer has finished. Even if you discover an error before starting the transfer you should call FileCore's FIQ release code (if you needed FIQs).

ii) Scatter list data transfer in foreground.

You will be given:
r2 = disc address
r3 = pointer to scatter list
r4 = length of transfer

You can assume the scatter list is word-aligned and has entries which cover the full length of the transfer and are each a non-zero whole number of sectors long. This sort of scatter list doesn't wrap in the same way as the background variety. Once again if you discover an error before starting the transfer you should call FileCore's FIQ release code (if you needed FIQs). It may be possible that a non-whole sector transfer is requested - you should cope with this, but the boundaries between scatter-list entries will be on sector boundaries. The scatter list should be updated as each sector gets transfered successfully - this means the caller can retry with the scatter list in the state as returned by the filing system.

iii) Data transfer in background.

You will be given:
r2 = disc address
r3 = pointer to scatter list
r4 = length of transfer

The length of transfer will be the length that should be transfered before returning to FileCore. Having returned to FileCore your data transfer routine should still be actively transfering data. It should stop when it reaches a non-wrapping zero-length address-length pair. In the background it should perform retries as appropriate and, once the operation has finished (by completing the request or getting an error), the process error and process status should be filled out as follows:

Type of finish Filling

complete        process status = 0
                process error can have any value
error           process error = error as described P.1047 PRM
                process status = pointer to failed address,length pair

This short piece of code will find the beginning of a process block. On entry r1 points to any address,length pair in the process block

Loop    LDR     r2, [r1, #8]!
        TEQ     r2, #0
        BPL     Loop
        ADD     r1, r1, r2

On exit r1 points to the start of the process block such that this will work:

        STMDB   r1, {error, status}

Note the DB means error and status are at [r1, #-8] and [r1, #-4] respectively, and that error and status are aliases for two registers where error is a lower numbered register than status.

The background call after routine returned by FileCore should be called even if an error was detected before the operation was started. Also the FIQ release routine should be called as for the other ways of transfering data.