/*
 *  F i l e N a m e  :  l e o a p p l i . h
 *
 ****************************************************************************
 *                   (C) Copyright ALPS Electric Co., Ltd. 1995-1997
 ****************************************************************************
 *  Version
 *
 *  ver     Date
 *  ----  --------
 *  1.01  '97-11-18  Add MOTOR BRAKE definition for control bit.
 ****************************************************************************
*/
/*-----------------------------------*/
/*   DRIVE PARAMETER                 */
/*-----------------------------------*/
#define  LEO_DISK_TYPE_MIN    0
#define  LEO_DISK_TYPE_MAX    6

#define  LEO_LBA_MIN          0
#define  LEO_LBA_MAX          4291

#define  LEO_LBA_ROM_TOP      LEO_LBA_MIN
#define  LEO_LBA_ROM_END0     1417
#define  LEO_LBA_ROM_END1     1965
#define  LEO_LBA_ROM_END2     2513
#define  LEO_LBA_ROM_END3     3061
#define  LEO_LBA_ROM_END4     3609
#define  LEO_LBA_ROM_END5     4087
#define  LEO_LBA_ROM_END6     LEO_LBA_MAX
#define  LEO_LBA_RAM_TOP0     (LEO_LBA_ROM_END0+1)
#define  LEO_LBA_RAM_TOP1     (LEO_LBA_ROM_END1+1)
#define  LEO_LBA_RAM_TOP2     (LEO_LBA_ROM_END2+1)
#define  LEO_LBA_RAM_TOP3     (LEO_LBA_ROM_END3+1)
#define  LEO_LBA_RAM_TOP4     (LEO_LBA_ROM_END4+1)
#define  LEO_LBA_RAM_TOP5     (LEO_LBA_ROM_END5+1)
#define  LEO_LBA_RAM_TOP6     (LEO_LBA_ROM_END6+1)
#define  LEO_LBA_RAM_END6     LEO_LBA_MAX

/*-----------------------------------*/
/*   LEO FUNCTION DEFINITIONS        */
/*-----------------------------------*/
extern void leoInitialize(OSPri PRI_WRK, OSPri PRI_INT, OSMesg *command_que_buf, u32 cmd_buff_size);
extern void leoCommand(void *CDB);
extern void LeoReset(void);
extern s32  LeoResetClear(void);

/*-----------------------------------*/
/*   THREAD PRIORITY                 */
/*-----------------------------------*/
#define  LEO_PRIORITY_WRK   (OS_PRIORITY_PIMGR-1)
#define  LEO_PRIORITY_INT   OS_PRIORITY_PIMGR

/*-----------------------------------*/
/*   COMMAND CODE                    */
/*-----------------------------------*/
#define LEO_COMMAND_CLEAR_QUE         0x01
#define LEO_COMMAND_INQUIRY           0x02
#define LEO_COMMAND_TEST_UNIT_READY   0x03
#define LEO_COMMAND_REZERO            0x04
#define LEO_COMMAND_READ              0x05
#define LEO_COMMAND_WRITE             0x06
#define LEO_COMMAND_SEEK              0x07
#define LEO_COMMAND_START_STOP        0x08
#define LEO_COMMAND_READ_CAPACITY     0x09
#define LEO_COMMAND_TRANSLATE         0x0a
#define LEO_COMMAND_MODE_SELECT       0x0b
#define LEO_COMMAND_READ_DISK_ID      0x0c
#define LEO_COMMAND_READ_TIMER        0x0d
#define LEO_COMMAND_SET_TIMER         0x0e

/*-----------------------------------*/
/* CONTROL BIT                       */
/*-----------------------------------*/
#define LEO_CONTROL_POST              0x80   /* ENABLE POST QUEUE */
#define LEO_CONTROL_START             0x01   /* START COMMAND */
#define LEO_CONTROL_STBY              0x02   /* STAND-BY MODE(NOT SLEEP MODE) */
#define LEO_CONTROL_WRT               0x01   /* READ RE-WRITE-ABLE CAPACITY */
#define LEO_CONTROL_TBL               0x01   /* TRANSLATE BYTE TO LBA */
#define LEO_CONTROL_BRAKE             0x04   /* SLEEP MODE(BRAKE ON) */

/*-----------------------------------*/
/* BIT FIELD PARAMETER               */
/*-----------------------------------*/
#define LEO_TEST_UNIT_MR              0x01   /* MEDIUM REMOVED */
#define LEO_TEST_UNIT_RE              0x02   /* HEAD RETRACTED */
#define LEO_TEST_UNIT_SS              0x04   /* SPINDLE STOPPED */

/*-----------------------------------*/
/* STATUS                            */
/*-----------------------------------*/
#define LEO_STATUS_GOOD               0x00
#define LEO_STATUS_CHECK_CONDITION    0x02
#define LEO_STATUS_BUSY               0x08

/*-----------------------------------*/
/* SENSE CODE                        */
/*-----------------------------------*/
#define LEO_SENSE_NO_ADDITIONAL_SENSE_INFOMATION   00
#define LEO_SENSE_DRIVE_NOT_READY                  01
#define LEO_SENSE_DIAGNOSTIC_FAILURE               02
#define LEO_SENSE_COMMAND_PHASE_ERROR              03
#define LEO_SENSE_DATA_PHASE_ERROR                 04
#define LEO_SENSE_REAL_TIME_CLOCK_FAILURE          05
#define LEO_SENSE_INCOMPATIBLE_MEDIUM_INSTALLED    11
#define LEO_SENSE_UNKNOWN_FORMAT                   11
#define LEO_SENSE_NO_SEEK_COMPLETE                 21
#define LEO_SENSE_WRITE_FAULT                      22
#define LEO_SENSE_UNRECOVERED_READ_ERROR           23
#define LEO_SENSE_NO_REFERENCE_POSITION_FOUND      24 
#define LEO_SENSE_TRACK_FOLLOWING_ERROR            25
#define LEO_SENSE_TRACKING_OR_SPDL_SERVO_FAILURE   25
#define LEO_SENSE_INVALID_COMMAND_OPERATION_CODE   31
#define LEO_SENSE_LBA_OUT_OF_RANGE                 32
#define LEO_SENSE_WRITE_PROTECT_ERROR              33
#define LEO_SENSE_COMMAND_TERMINATED               34
#define LEO_SENSE_QUEUE_FULL                       35
#define LEO_SENSE_ILLEGAL_TIMER_VALUE              36
#define LEO_SENSE_WAITING_NMI                      37
#define LEO_SENSE_DEVICE_COMMUNICATION_FAILURE     41
#define LEO_SENSE_MEDIUM_NOT_PRESENT               42
#define LEO_SENSE_POWERONRESET_DEVICERESET_OCCURED 43
#define LEO_SENSE_MEDIUM_MAY_HAVE_CHANGED          47
#define LEO_SENSE_EJECTED_ILLEGALLY_RESUME         49

/*-----------------------------------*/
/* Command Block Header              */
/*-----------------------------------*/
typedef struct{
    u8    command;
    u8    reserve1;
    u8    control;
    u8    reserve3;
    u8    status;
    u8    sense;
    u8    reserve6;
    u8    reserve7;
    OSMesgQueue  *post;
} LEOCmdHeader;

/*-----------------------------------*/
/* CLEAR QUEUE(01H) command          */
/*-----------------------------------*/
typedef struct {
    LEOCmdHeader  header;
} LEOCmdClearQue;

/*-----------------------------------*/
/* INQUIRY(02H) command              */
/*-----------------------------------*/
typedef struct {
    LEOCmdHeader  header;
    u8            dev_type;
    u8            version;
    u8            dev_num;
    u8            leo_bios_ver;
    u32           reserve5;
} LEOCmdInquiry;

/*-----------------------------------*/
/* TEST UNIT READY(03H) command      */
/*-----------------------------------*/
typedef struct {
    LEOCmdHeader  header;
    u8            test;
    u8            reserve2;
    u8            reserve3;
    u8            reserve4;
} LEOCmdTestUnitReady;

/*-----------------------------------*/
/* REZERO(04H) command               */
/*-----------------------------------*/
typedef struct {
    LEOCmdHeader  header;
} LEOCmdRezero;

/*-----------------------------------*/
/* READ(05H) command                 */
/*-----------------------------------*/
typedef struct {
    LEOCmdHeader  header;
    u32           lba;
    u32           xfer_blks;
    void         *buff_ptr;
    u32           rw_bytes;
} LEOCmdRead;

/*-----------------------------------*/
/* WRITE(06H) command                */
/*-----------------------------------*/
typedef LEOCmdRead LEOCmdWrite;

/*-----------------------------------*/
/* SEEK(07H) command                 */
/*-----------------------------------*/
typedef struct {
    LEOCmdHeader  header;
    u32           lba;
} LEOCmdSeek;

/*-----------------------------------*/
/* START/STOP(08H) command           */
/*-----------------------------------*/
typedef struct {
    LEOCmdHeader  header;
} LEOCmdStartStop;

/*-----------------------------------*/
/* READ CAPACITY(09H) command        */
/*-----------------------------------*/
typedef struct {
    LEOCmdHeader  header;
    u32           start_lba;
    u32           end_lba;
    u32           capa_bytes;
} LEOCmdReadCapacity;

/*-----------------------------------*/
/* TRANSLATE(0AH) command            */
/*-----------------------------------*/
typedef struct {
    LEOCmdHeader  header;
    u32           start_lba;
    u32           in_param;
    u32           out_param;
} LEOCmdTranslate;

/*-----------------------------------*/
/* MODE SELECT(0BH) command          */
/*-----------------------------------*/
typedef struct {
    LEOCmdHeader  header;
    u8            page_code;
    u8            reserve1;
    u8            standby_time;
    u8            sleep_time;
    u8            led_on_time;
    u8            led_off_time;
    u8            reserve18;
    u8            reserve19;
} LEOCmdModeSelect;

/*-----------------------------------*/
/* READ DISK ID(0CH) command         */
/*-----------------------------------*/
typedef struct {
    LEOCmdHeader  header;
    void         *buffer_pointer;
} LEOCmdReadDiskId;

/*-----------------------------------*/
/* READ TIMER(0DH) command           */
/*-----------------------------------*/
typedef struct {
    LEOCmdHeader  header;
    u8            reserve12;
    u8            reserve13;
    u8            year;
    u8            month;
    u8            day;
    u8            hour;
    u8            minute;
    u8            second;
} LEOCmdReadTimer;

/*-----------------------------------*/
/* SET TIMER(0EH) command            */
/*-----------------------------------*/
typedef LEOCmdReadTimer LEOCmdSetTimer;

/*-------end of leoappli.h--------------------------*/