#include "macros.h" #include "PR/os_internal.h" #include "PR/controller.h" #include "PR/siint.h" #ifndef BBPLAYER static OSPifRam __MotorDataBuf[MAXCONTROLLERS] OSALIGNED(8); #endif #define READFORMAT(ptr) ((__OSContRamReadFormat*)(ptr)) s32 __osMotorAccess(OSPfs* pfs, s32 flag) { #ifdef BBPLAYER return PFS_ERR_INVALID; #else int i; s32 ret; u8* ptr = (u8*)&__MotorDataBuf[pfs->channel]; if (!(pfs->status & PFS_MOTOR_INITIALIZED)) { return 5; } __osSiGetAccess(); __MotorDataBuf[pfs->channel].pifstatus = CONT_CMD_EXE; ptr += pfs->channel; for (i = 0; i < BLOCKSIZE; i++) { READFORMAT(ptr)->data[i] = flag; } __osContLastCmd = CONT_CMD_END; __osSiRawStartDma(OS_WRITE, &__MotorDataBuf[pfs->channel]); osRecvMesg(pfs->queue, NULL, OS_MESG_BLOCK); __osSiRawStartDma(OS_READ, &__MotorDataBuf[pfs->channel]); osRecvMesg(pfs->queue, NULL, OS_MESG_BLOCK); ret = READFORMAT(ptr)->rxsize & CHNL_ERR_MASK; if (!ret) { if (!flag) { if (READFORMAT(ptr)->datacrc != 0) { ret = PFS_ERR_CONTRFAIL; } } else { if (READFORMAT(ptr)->datacrc != 0xEB) { ret = PFS_ERR_CONTRFAIL; } } } __osSiRelAccess(); return ret; #endif } #ifndef BBPLAYER static void __osMakeMotorData(int channel, OSPifRam* mdata) { u8* ptr = (u8*)mdata->ramarray; __OSContRamReadFormat ramreadformat; int i; ramreadformat.dummy = CONT_CMD_NOP; ramreadformat.txsize = CONT_CMD_WRITE_PAK_TX; ramreadformat.rxsize = CONT_CMD_WRITE_PAK_RX; ramreadformat.cmd = CONT_CMD_WRITE_PAK; ramreadformat.addrh = CONT_BLOCK_RUMBLE >> 3; ramreadformat.addrl = (u8)(__osContAddressCrc(CONT_BLOCK_RUMBLE) | (CONT_BLOCK_RUMBLE << 5)); if (channel != 0) { for (i = 0; i < channel; i++) { *ptr++ = CONT_CMD_REQUEST_STATUS; } } *READFORMAT(ptr) = ramreadformat; ptr += sizeof(__OSContRamReadFormat); ptr[0] = CONT_CMD_END; } #endif s32 osMotorInit(OSMesgQueue* mq, OSPfs* pfs, int channel) { #ifdef BBPLAYER return PFS_ERR_DEVICE; #else s32 ret; u8 temp[32]; pfs->queue = mq; pfs->channel = channel; pfs->activebank = 0xFF; pfs->status = 0; ret = __osPfsSelectBank(pfs, 0xFE); if (ret == PFS_ERR_NEW_PACK) { ret = __osPfsSelectBank(pfs, 0x80); } if (ret != 0) { return ret; } ret = __osContRamRead(mq, channel, CONT_BLOCK_DETECT, temp); if (ret == PFS_ERR_NEW_PACK) { ret = PFS_ERR_CONTRFAIL; } if (ret != 0) { return ret; } if (temp[31] == 254) { return PFS_ERR_DEVICE; } ret = __osPfsSelectBank(pfs, 0x80); if (ret == PFS_ERR_NEW_PACK) { ret = PFS_ERR_CONTRFAIL; } if (ret != 0) { return ret; } ret = __osContRamRead(mq, channel, CONT_BLOCK_DETECT, temp); if (ret == PFS_ERR_NEW_PACK) { ret = PFS_ERR_CONTRFAIL; } if (ret != 0) { return ret; } if (temp[31] != 0x80) { return PFS_ERR_DEVICE; } if (!(pfs->status & PFS_MOTOR_INITIALIZED)) { __osMakeMotorData(channel, &__MotorDataBuf[channel]); } pfs->status = PFS_MOTOR_INITIALIZED; return 0; #endif }