Major NOTES:

All ints are big endian, pre-converted by the firmware

ODE expects boot.iso to be present on the root dir of at least one medium. If no “boot.iso” present, the ODE will just blink LEDs. /USB takes priority if both are present.

ODE includes base boot.iso in flash. If any of mounted partitions (sd or usb or all) contains boot.iso, the one with freshest built FS prevails. ODE uses label→dl_VolumeUniqueIdentifier as unix timestamp.

boot.iso must have bootable, signed image, containing ode driver (signed with 3do keys, priority set) and menu app.

FZ1 ODE (xport dev1):

No ID on the bus present, don't implement XBUS Dev proxy in FPGA.

XPort ODE:

3 devices on the XBUS Bus:

RAM Depot:

0x0c000000 : register base

0x80000000 : ram base. 256kbytes

0x00000000 : rom base : 512kbytes

ODE Limitations :

RFIFO - ode to 3do data fifo, 2048 bytes (refill required for CDDA/CDXA)

WFIFO - 3do to ode data fifo, 512 bytes (pre-fill before issuing the command, mind W flags)

CMDFIFO - 7 bytes precisely. Abort is handled as soon as it arrives.

STATFIFO - 16 bytes


Nicky :

TBD

Typical SD navigation process :

0xc0 0 0 0 0 (change to device root).

0xc1 0 0 0 0 (start from local root) :

0x10 0 0 0 0 0 0 = read 2048 bytes of TOCs. indexed by “MSF” .

assuming got back:

[0] .flags=TOC_FLAG_DIR, .toc_id=0x1, .name=“usb”;

[1] .flags=TOC_FLAG_DIR, .toc_id=0x2, .name=“sd”;

[2] .flags=TOC_FLAG_INVALID


listing is : /usb (dir or mountpoint), /sd (dir or mountpoint).

user selected “/sd” :

0xc0 00 00 00 02 change to new TOC 0xc1 00 00 00 00 start reading from local root

0x10 0 0 0 0 0 0 = read 2048 bytes of TOCs. indexed by “MSF” .

assuming got back:

[0] .flags=TOC_FLAG_FILE, .toc_id=0x1, .name=“test.iso”;

[1] .flags=TOC_FLAG_DIR, .toc_id=0x2, .name=“some dir”;

[2] .flags=TOC_FLAG_INVALID


listing is : /sd/test.iso (file), /sd/some dir (dir).

user selected “/sd/some dir”

0xc0 00 00 00 02 change to new TOC 0xc1 00 00 00 00 start reading from local root

0x10 0 0 0 0 0 0 = read 2048 bytes of TOCs. indexed by “MSF” .

assuming got back:

[0] .flags=TOC_FLAG_FILE, .toc_id=0x1, .name=“test2.iso”;

[1] .flags=TOC_FLAG_INVALID


listing is : /sd/some dir/test2.iso (file).

user selected “..” – level up

0xc0 ff ff ff ff change to new TOC (return to previous) 0xc1 00 00 00 00 start reading from local root

0x10 0 0 0 0 0 0 = read 2048 bytes of TOCs. indexed by “MSF” .

[0] .flags=TOC_FLAG_FILE, .toc_id=0x1, .name=“test.iso”;

[1] .flags=TOC_FLAG_DIR, .toc_id=0x2, .name=“some dir”;

[2] .flags=TOC_FLAG_INVALID

user selected “test.iso” as quick launch:

0xc3

0xc4 00 00 00 01

0xc5



#define TOC_FLAG_FILE      0x1
#define TOC_FLAG_DIR       0x2
#define TOC_FLAG_INVALID   0xffffffff

typedef struct{
    uint32_t flags;
    uint32_t toc_id;  //local toc id
    uint32_t name_length; //strlen
    char name[name_length+1] ; //0 terminated
}toc_entry;

#define FLAG_DESC_PRESENT         1
#define FLAG_BANNER_PRESENT       2
#define FLAG_TYPE_MASK            0xff00
#define FLAG_TYPE_OPERA_DISC      0x0100
#define FLAG_TYPE_CDDA            0x0200
#define FLAG_TYPE_CDXA_PHOTO      0x0300
#define FLAG_TYPE_CDXA_VIDEO      0x0400
#define FLAG_TYPE_OPERA_UNSIGNED  0x0500

typedef struct{
    uint32_t flags;

    uint32_t desc_len; //if FLAG_DESC_PRESENT is set
    char description[desc_len+1]; //0 terminated

    uint32_t banner_len; //if FLAG_BANNER_PRESENT is set
    char banner[banner_len]; //actual banner CEL with proper CCB
}toc_description;