From 4d372ffa074b7683dad13f854be6a9583c2fa3b8 Mon Sep 17 00:00:00 2001 From: dborth Date: Tue, 19 Aug 2008 16:28:37 +0000 Subject: [PATCH] Add libdi to project for easier compiling --- include/di.h | 121 +++++++++++++++++++++++++++++++++++++++++++++++++++ lib/libdi.a | Bin 0 -> 44412 bytes 2 files changed, 121 insertions(+) create mode 100644 include/di.h create mode 100644 lib/libdi.a diff --git a/include/di.h b/include/di.h new file mode 100644 index 0000000..d6aff03 --- /dev/null +++ b/include/di.h @@ -0,0 +1,121 @@ +/*------------------------------------------------------------- + +di.h -- Drive Interface library + +Team Twiizers +Copyright (C) 2008 + +Erant +marcan + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any +damages arising from the use of this software. + +Permission is granted to anyone to use this software for any +purpose, including commercial applications, and to alter it and +redistribute it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you +must not claim that you wrote the original software. If you use +this software in a product, an acknowledgment in the product +documentation would be appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and +must not be misrepresented as being the original software. + +3. This notice may not be removed or altered from any source +distribution. + +-------------------------------------------------------------*/ + + + +/* +All buffers in this document need to be 32-byte aligned! +*/ + +#ifndef __DI_H__ +#define __DI_H__ + +#include +#include +/* +DEFINES GO HERE! +*/ + +#define DVD_IDENTIFY 0x12 +#define DVD_READ_DISCID 0x70 +#define DVD_LOW_READ 0x71 +#define DVD_WAITFORCOVERCLOSE 0x79 +#define DVD_READ_PHYSICAL 0x80 +#define DVD_READ_COPYRIGHT 0x81 +#define DVD_READ_DISCKEY 0x82 +#define DVD_GETCOVER 0x88 +#define DVD_RESET 0x8A +#define DVD_OPEN_PARTITION 0x8B +#define DVD_CLOSE_PARTITION 0x8C +#define DVD_READ_UNENCRYPTED 0x8D +#define DVD_REPORTKEY 0xA4 +#define DVD_READ 0xD0 +#define DVD_READ_CONFIG 0xD1 +#define DVD_GET_ERROR 0xE0 +#define DVD_SET_MOTOR 0xE3 + +#define DVD_READY 0x1 +#define DVD_INIT 0x2 +#define DVD_UNKNOWN 0x4 +#define DVD_NO_DISC 0x8 +#define DVD_IOS_ERROR 0x10 +#define DVD_D0 0x20 +#define DVD_A8 0x40 + +#define MAX_RETRY 16 +/* +TYPEDEFS GO HERE! +*/ + +typedef struct{ + uint16_t rev; + uint16_t dev_code; + uint32_t rel_date; +}DI_DriveID; + +typedef int(*di_callback)(uint32_t status, uint32_t error); +typedef int(*read_func)(void*,uint32_t,uint32_t); +typedef int(*read_func_async)(void*,uint32_t,uint32_t,ipccallback); +/* +FUNCTION PROTOTYPES GO HERE! +*/ + +int DI_Init(); +void DI_Mount(); +void DI_Close(); +int DI_GetStatus(); + +int DI_Identify(DI_DriveID* id); +int DI_ReadDiscID(u64 *id); +int DI_GetError(uint32_t* error); +int DI_GetCoverRegister(uint32_t* status); +int DI_Reset(); + +int DI_StopMotor(); +int DI_Eject(); +int DI_KillDrive(); + +int DI_ReadDVD(void* buf, uint32_t len, uint32_t lba); +int DI_ReadDVDAsync(void* buf, uint32_t len, uint32_t lba, ipccallback ipc_cb); + +int DI_Read(void *buf, u32 size, u32 offset); +int DI_UnencryptedRead(void *buf, u32 size, u32 offset); + +int DI_ReadDVDConfig(uint32_t* val, uint32_t flag); +int DI_ReadDVDCopyright(uint32_t* copyright); +int DI_ReadDVDDiscKey(void* buf); +int DI_ReadDVDPhysical(void* buf); +int DI_ReportKey(int keytype, uint32_t lba, void* buf); + +int DI_OpenPartition(u32 offset); +int DI_ClosePartition(void); + +#endif diff --git a/lib/libdi.a b/lib/libdi.a new file mode 100644 index 0000000000000000000000000000000000000000..f2649869d466adaed61ae736d5bcf62445f2131e GIT binary patch literal 44412 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