//Pascal &or the FreePascal use of nintendo 2ds, 3ds regime // c file & header origin author (Steveice10) // // Copyright (c) 2013, 2015, 2017 Kenneth Dwayne Lee Bsc. // all rights reserved. // {$ifdef 3dsintf} Type PXIDEV_WaitType = (WAIT_NONE := 0,WAIT_SLEEP := 1,WAIT_IREQ_RETURN := 2, WAIT_IREQ_CONTINUE := 3); {/ Card SPI register deassertion type. } {/< Do not deassert. } {/< Deassert before waiting. } {/< Deassert after waiting. } PXIDEV_DeassertType = (DEASSERT_NONE := 0,DEASSERT_BEFORE_WAIT := 1, DEASSERT_AFTER_WAIT := 2); {/ Card SPI transfer buffer. } {/< Data pointer. } {/< Data size. } {/< Transfer options. See @ref pxiDevMakeTransferOption } {/< Wait operation. See @ref pxiDevMakeWaitOperation } PXIDEV_SPIBuffer = record ptr : pointer; size : u32; transferOption : u8; waitOperation : u64; end; PPXIDEV_SPIBuffer = ^PXIDEV_SPIBuffer; {/ Initializes pxi:dev. } function pxiDevInit:s32;cdecl;external; {/ Shuts down pxi:dev. } procedure pxiDevExit;cdecl;external; {* * @brief Creates a packed card SPI transfer option value. * @param baudRate Baud rate to use when transferring. * @param busMode Bus mode to use when transferring. * @return A packed card SPI transfer option value. } function pxiDevMakeTransferOption(baudRate:FS_CardSpiBaudRate; busMode:FS_CardSpiBusMode):u8; {* * @brief Creates a packed card SPI wait operation value. * @param waitType Type of wait to perform. * @param deassertType Type of register deassertion to perform. * @param timeout Timeout, in nanoseconds, to wait, if applicable. * @return A packed card SPI wait operation value. } function pxiDevMakeWaitOperation(waitType:PXIDEV_WaitType; deassertType: PXIDEV_DeassertType; timeout:u64):u64;cdecl; {* * @brief Performs multiple card SPI writes and reads. * @param header Header to lead the transfers with. Must be, at most, 8 bytes in size. * @param writeBuffer1 Buffer to make first transfer from. * @param readBuffer1 Buffer to receive first response to. * @param writeBuffer2 Buffer to make second transfer from. * @param readBuffer2 Buffer to receive second response to. * @param footer Footer to follow the transfers with. Must be, at most, 8 bytes in size. Wait operation is unused. } function PXIDEV_SPIMultiWriteRead (header:PPXIDEV_SPIBuffer; writeBuffer1:PPXIDEV_SPIBuffer; readBuffer1:PPXIDEV_SPIBuffer; writeBuffer2:PPXIDEV_SPIBuffer; readBuffer2:PPXIDEV_SPIBuffer; footer:PPXIDEV_SPIBuffer):s32;cdecl;external; {* * @brief Performs a single card SPI write and read. * @param bytesRead Pointer to output the number of bytes received to. * @param initialWaitOperation Wait operation to perform before transferring data. * @param writeBuffer Buffer to transfer data from. * @param readBuffer Buffer to receive data to. } function PXIDEV_SPIWriteRead(bytesRead:Pu32; initialWaitOperation:u64; writeBuffer:PPXIDEV_SPIBuffer; readBuffer:PPXIDEV_SPIBuffer):s32;cdecl;external; {$endif 3dsintf} {$ifdef 3dsimpl} function pxiDevMakeTransferOption(baudRate:FS_CardSpiBaudRate; busMode:FS_CardSpiBusMode):u8; begin pxiDevMakeTransferOption:= (baudRate and $3F) or ((busMode and $3) shl 6); end; function pxiDevMakeWaitOperation(waitType:PXIDEV_WaitType; deassertType: PXIDEV_DeassertType; timeout:u64):u64;cdecl; begin pxiDevMakeWaitOperation:= (u32(waitType) and $F) or ((u32(deassertType) and $F) shl 4) or ((timeout and $FFFFFFFFFFFFFF) shl 8); //(waitType & 0xF) | ((deassertType & 0xF) << 4) | ((timeout & 0xFFFFFFFFFFFFFF) << 8); end; {$endif 3dsimpl}