summaryrefslogtreecommitdiff
path: root/arm9/lib/include/CARD_common.h
diff options
context:
space:
mode:
Diffstat (limited to 'arm9/lib/include/CARD_common.h')
-rw-r--r--arm9/lib/include/CARD_common.h173
1 files changed, 147 insertions, 26 deletions
diff --git a/arm9/lib/include/CARD_common.h b/arm9/lib/include/CARD_common.h
index 9cedac4f..051923ce 100644
--- a/arm9/lib/include/CARD_common.h
+++ b/arm9/lib/include/CARD_common.h
@@ -1,5 +1,34 @@
-#ifndef NITRO_CARD_COMMON_H_
-#define NITRO_CARD_COMMON_H_
+#ifndef POKEDIAMOND_CARD_COMMON_H
+#define POKEDIAMOND_CARD_COMMON_H
+
+#include "nitro/types.h"
+#include "OS_thread.h"
+#include "MI_dma.h"
+
+#define CARD_THREAD_PRIORITY_DEFAULT 4
+
+#define CARD_BACKUP_TYPE_DEVICE_SHIFT 0
+#define CARD_BACKUP_TYPE_DEVICE_EEPROM 1
+#define CARD_BACKUP_TYPE_DEVICE_FLASH 2
+#define CARD_BACKUP_TYPE_DEVICE_FRAM 3
+#define CARD_BACKUP_TYPE_SIZEBIT_SHIFT 8
+#define CARD_BACKUP_TYPE_VENDER_SHIFT 16
+#define CARD_BACKUP_TYPE_DEFINE(type, size, vender) \
+ (((CARD_BACKUP_TYPE_DEVICE_ ## type) << CARD_BACKUP_TYPE_DEVICE_SHIFT) | \
+ ((size) << CARD_BACKUP_TYPE_SIZEBIT_SHIFT) | \
+ ((vender) << CARD_BACKUP_TYPE_VENDER_SHIFT))
+
+typedef enum
+{
+ CARD_BACKUP_TYPE_EEPROM_4KBITS = CARD_BACKUP_TYPE_DEFINE(EEPROM, 9, 0),
+ CARD_BACKUP_TYPE_EEPROM_64KBITS = CARD_BACKUP_TYPE_DEFINE(EEPROM, 13, 0),
+ CARD_BACKUP_TYPE_EEPROM_512KBITS = CARD_BACKUP_TYPE_DEFINE(EEPROM, 16, 0),
+ CARD_BACKUP_TYPE_FLASH_2MBITS = CARD_BACKUP_TYPE_DEFINE(FLASH, 18, 0),
+ CARD_BACKUP_TYPE_FLASH_4MBITS = CARD_BACKUP_TYPE_DEFINE(FLASH, 19, 0),
+ CARD_BACKUP_TYPE_FLASH_8MBITS = CARD_BACKUP_TYPE_DEFINE(FLASH, 20, 0),
+ CARD_BACKUP_TYPE_FRAM_256KBITS = CARD_BACKUP_TYPE_DEFINE(FRAM, 15, 0),
+ CARD_BACKUP_TYPE_NOT_USE = 0
+} CARDBackupType;
typedef enum
{
@@ -11,41 +40,133 @@ typedef enum
CARD_RESULT_ERROR,
CARD_RESULT_NO_RESPONSE,
CARD_RESULT_CANCELED
-}
-CARDResult;
+} CARDResult;
typedef enum
{
- CARD_REQ_INIT = 0, /* initialize (setting from ARM9)*/
- CARD_REQ_ACK, /* request done (acknowledge from ARM7)*/
- CARD_REQ_IDENTIFY, /* CARD_IdentifyBackup*/
- CARD_REQ_READ_ID, /* CARD_ReadRomID (TEG && ARM9)*/
- CARD_REQ_READ_ROM, /* CARD_ReadRom (TEG && ARM9)*/
- CARD_REQ_WRITE_ROM, /* (reserved)*/
- CARD_REQ_READ_BACKUP, /* CARD_ReadBackup*/
- CARD_REQ_WRITE_BACKUP, /* CARD_WriteBackup*/
- CARD_REQ_PROGRAM_BACKUP, /* CARD_ProgramBackup*/
- CARD_REQ_VERIFY_BACKUP, /* CARD_VerifyBackup*/
- CARD_REQ_ERASE_PAGE_BACKUP, /* CARD_EraseBackupPage*/
- CARD_REQ_ERASE_SECTOR_BACKUP, /* CARD_EraseBackupSector*/
- CARD_REQ_ERASE_CHIP_BACKUP, /* CARD_EraseBackupChip*/
+ CARD_TARGET_NONE,
+ CARD_TARGET_ROM,
+ CARD_TARGET_BACKUP
+} CARDTargetMode;
+
+typedef enum
+{
+ CARD_REQ_INIT = 0,
+ CARD_REQ_ACK,
+ CARD_REQ_IDENTIFY,
+ CARD_REQ_READ_ID,
+ CARD_REQ_READ_ROM,
+ CARD_REQ_WRITE_ROM,
+ CARD_REQ_READ_BACKUP,
+ CARD_REQ_WRITE_BACKUP,
+ CARD_REQ_PROGRAM_BACKUP,
+ CARD_REQ_VERIFY_BACKUP,
+ CARD_REQ_ERASE_PAGE_BACKUP,
+ CARD_REQ_ERASE_SECTOR_BACKUP,
+ CARD_REQ_ERASE_CHIP_BACKUP,
CARD_REQ_MAX
-}
-CARDRequest;
+} CARDRequest;
typedef enum
{
- CARD_REQUEST_MODE_RECV, /* Data reception*/
- CARD_REQUEST_MODE_SEND, /* Send data (Including single verify)*/
- CARD_REQUEST_MODE_SEND_VERIFY, /* Send data + verify*/
- CARD_REQUEST_MODE_SPECIAL /* special operations like sector deletion*/
-}
-CARDRequestMode;
+ CARD_REQUEST_MODE_RECV,
+ CARD_REQUEST_MODE_SEND,
+ CARD_REQUEST_MODE_SEND_VERIFY,
+ CARD_REQUEST_MODE_SPECIAL
+} CARDRequestMode;
+
+enum
+{
+ CARD_STAT_INIT = (1 << 0),
+ CARD_STAT_INIT_CMD = (1 << 1),
+ CARD_STAT_BUSY = (1 << 2),
+ CARD_STAT_TASK = (1 << 3),
+ CARD_STAT_RECV = (1 << 4),
+ CARD_STAT_REQ = (1 << 5),
+ CARD_STAT_CANCEL = (1 << 6)
+};
+
+typedef s32 CARDiOwner;
+
+typedef struct CARDiCommandArg
+{
+ CARDResult result;
+ CARDBackupType type;
+ u32 id;
+ u32 src;
+ u32 dest;
+ u32 len;
+
+ struct
+ {
+ u32 total_size;
+ u32 sect_size;
+ u32 page_size;
+ u32 addr_width;
+ u32 program_page;
+ u32 write_page;
+ u32 write_page_total;
+ u32 erase_chip;
+ u32 erase_chip_total;
+ u32 erase_sector;
+ u32 erase_sector_total;
+ u32 erase_page;
+ u8 initial_status;
+ u8 padding1[3];
+ u32 caps;
+ u8 padding2[16];
+ } spec;
+} CARDiCommandArg;
+
+typedef struct CARDiCommon
+{
+ CARDiCommandArg *cmd;
+ s32 command;
+
+ volatile CARDiOwner lock_owner;
+ volatile s32 lock_ref;
+ OSThreadQueue lock_queue[1];
+ CARDTargetMode lock_target;
+
+ u32 src;
+ u32 dst;
+ u32 len;
+ u32 dma;
+ CARDRequest req_type;
+ s32 req_retry;
+ CARDRequestMode req_mode;
+ MIDmaCallback callback;
+ void *callback_arg;
+ void (*task_func) (struct CARDiCommon *);
+
+ OSThread thread[1];
+ OSThread *cur_th;
+
+ u32 priority;
+ OSThreadQueue busy_q[1];
+
+ volatile u32 flag;
+
+ u8 dummy[8];
+
+ u8 backup_cache_page_buf[256] ALIGN(32);
+} CARDiCommon;
+void CARDi_SetTask(void (*task) (CARDiCommon *));
+void CARDi_InitCommon(void);
+BOOL CARD_IsEnabled(void);
+void CARD_CheckEnabled(void);
+void CARD_Enable(BOOL enable);
+BOOL CARDi_WaitAsync(void);
+BOOL CARDi_TryWaitAsync(void);
CARDResult CARD_GetResultCode(void);
+void CARD_LockRom(u16 lock_id);
+void CARD_UnlockRom(u16 lock_id);
+void CARD_LockBackup(u16 lock_id);
+void CARD_UnlockBackup(u16 lock_id);
#define CARD_RETRY_COUNT_MAX 10
void CARD_Init(void);
-#endif //NITRO_CARD_COMMON_H_
+#endif //POKEDIAMOND_CARD_COMMON_H