Site Tools


documentation:ode_interface_description

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.

  • on 0x83 report mfg_id=MEI (0x10), dev_num=CDROM (0x1) no DRV bit in status!
  • on 0x8e for simple ode report status command error, for full featured, follow the ROMTAGs structure for dipir.
  • new cmd :
    • 0xc0 [l3] [l2] [l1] [l0] - change current TOC root to L (L=0 - root) - status[0]=error code, selects either devlist if more than one device or partition present. example :
      • only sd is mounted with 1 partition : “/ = root of the sdcard”.
      • sd mounted with 2 partitions : “/sd0 /sd1”.
      • usb is mounted with 1 partition : “/ = root of usb device”
      • usb with 2 partitions, sd with 1 partitions : “/sd /usb0 /usb1”
      • list index starts from 0x00000001 !!!!
    • 0xc1 [t3] [t2] [t1] [t0] [X1] [X0] - read TOC entries starting from T. status[0]=error code, status[1]=last entry flag. status - 16bytes of entry, starting from offset X
    • 0xc2 [t3] [t2] [t1] [t0] [X1] [X0] - read description for given TOC entry. status[0] = error code. status are 16bit of entry, starting from offset X
    • 0xc3 - clear current playlist. status[0] = error code
    • 0xc4 [t3] [t2] [t1] [t0] - add TOC to the playlist, status[0] = error code, status[1][2][3][4] = current playlist count
    • 0xc5 - launch playlist. status[0] = error code
    • 0xc6 [t3] [t2] [t1] [t0] [op] - open toc id (file) for operation : op= 0x1 – read, op=0x2 –write, op=0x3- create (get ascii-z filename from generic buffer), returns toc id for created.
    • 0xc7 [o3][o2][o1][o0] [se] - file seek operation (se) to offset OO
    • 0xc8 [l1][l0] - set buffer size for file operations, tells byte count is IN the buffer for write op, or byte count for READ op to read. This completes the operation immediately – as if calling read/write. status [1][2] = bytes written/read;
    • 0xc9 [o1][o0] [b0][b1][b2][b3] – write 4 bytes to file buffer at offset OOOO.
    • 0xca [o1][o0] [ct] - reads ct bytes (up to 16) from file buffer at offset OOOO. bytes are returned in status.

XPort ODE:

3 devices on the XBUS Bus:

  • dev 1 = MEI CDRom (read above)
  • dev 2 = RAM Depot : on 0x83 report mfg_id=3DO (0x1000), dev_num=Depot (0x30) no DRV bit in status! Make sure to include depot driver into the boot.iso!
  • dev 3 = Nicky

RAM Depot:

  • CMD Read 0x20 xx xx xx xx LL LL : read LLLL bytes from XXXXXXXX address
  • CMD Write 0x21 xx xx xx xx LL LL : write LLLL bytes to XXXXXXXX address

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;
documentation/ode_interface_description.txt · Last modified: by 127.0.0.1