In memory of Ben “bushing” Byer, who passed away on Monday, February 8th, 2016.

Difference between revisions of "Nsysccr.rpl"

From WiiUBrew
Jump to navigation Jump to search
(Finished core CCR functions, more to come for HID/CDC)
m (CRC16 with 0x8408 poly)
Line 90: Line 90:
 
     COSInfo(6, "%s() depricated, no need to call\n", "CCRHIDTeardown"); //Typo in binary
 
     COSInfo(6, "%s() depricated, no need to call\n", "CCRHIDTeardown"); //Typo in binary
 
     return 0;
 
     return 0;
 +
}
 +
</syntaxhighlight>
 +
 +
===CCRCDC - Gamepad Communications Device Class API===
 +
<syntaxhighlight lang="C">
 +
uint16_t CCRCDCCalcCRC16(uint32_t *data, uint32_t size) //02002EAC
 +
{
 +
    uint16_t crc = 0xFFFF;
 +
    if (size > 0)
 +
    {
 +
        for (int j = 0; j < size; j++)
 +
        {
 +
            crc = (uint16_t)(crc ^ data[j]); //load in new byte
 +
            for (int i = 0; i < 8; i++)
 +
            {
 +
                if ((crc & 0x0001) == 1) //if LSB is set, do xor
 +
                    crc = (uint16_t)((crc >> 1) ^ 0x8408);
 +
                else //just cycle 1
 +
                    crc >>= 1;
 +
            }
 +
        }
 +
    }
 +
    return crc;
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>

Revision as of 02:44, 18 April 2016

nsysccr is Nintendo System CCR which interfaces with the IOS-PAD part of IOSU through various /dev nodes. See the IOSU wiki page for a list.

Reverse Engineered (Pseudo)Code

CCR - Misc. Gamepad

#define CCR_CDC_Handle 0x10000618
#define CCR_IPCBufPool 0x10000620

#define CCR_ERROR_BASE 0xFFEE0000
#define CCR_ERROR_NO_BUFPOOL (CCR_ERROR_BASE + 2)

int CCR_IPCBufPoolAllocate(void) //020038AC
{
    return IPCBufPoolAllocate(&CCR_IPCBufPool, 0x3A4);
}

void CCR_IPCBufPoolFree(int handle) //020038BC
{
    return IPCBufPoolFree(&CCR_IPCBufPool, handle);
}

int CCREnableDrhCheck(int value) //02002D14
{
    int handle = CCR_IPCBufPoolAllocate();
    if (!handle)
        return CCR_ERROR_NO_BUFPOOL;
    handle[0] = value;
    handle[0x80/4] = handle;
    handle[0x84/4] = 4;
    int ret = IOS_Ioctlv(&CCR_CDC_Handle, 0x385, 1, 0, handle + 0x80);
    CCR_IPCBufPoolFree(handle);
    return ret;
}

int CCREnablePowerButton(int value) //02002D9C
{
    int handle = CCR_IPCBufPoolAllocate();
    if (!handle)
        return CCR_ERROR_NO_BUFPOOL;
    handle[0] = value;
    handle[0x80/4] = handle;
    handle[0x84/4] = 4;
    int ret = IOS_Ioctlv(&CCR_CDC_Handle, 0x386, 1, 0, handle + 0x80);
    CCR_IPCBufPoolFree(handle);
    return ret;
}

int CCRSetCompatMode(int value) //02002E24
{
    int handle = CCR_IPCBufPoolAllocate();
    if (!handle)
        return CCR_ERROR_NO_BUFPOOL;
    handle[0] = value;
    handle[0x80/4] = handle;
    handle[0x84/4] = 4;
    int ret = IOS_Ioctlv(&CCR_CDC_Handle, 0x387, 1, 0, handle + 0x80);
    CCR_IPCBufPoolFree(handle);
    return ret;
}

void CCREnableFwUpdateMode(void) //020038CC
{
    if(bspWrite("CCRH", 0, "Reset") == 0) //bspWrite in coreinit, interfaces with IOS-BSP
        COSWarn(1, "Successfully reset host and ENabled fw update\n");
    else
        COSWarn(1, "FAILED to reset host and enable fw update\n");
    COSWarn(1, "Wait 3 seconds for HOST to deatach and attach\n"); //Typo in binary
    OSSleepTicks((int64_t)3 * (OSGetSystemInfo()->busClockSpeed / 4));
}

void CCRDisableFwUpdateMode(void) //02003970
{
    if(bspWrite("CCRH", 0, "Reset") == 0) //bspWrite in coreinit, interfaces with IOS-BSP
        COSWarn(1, "Successfully reset host and DISabled fw update\n");
    else
        COSWarn(1, "FAILED to reset host and disable fw update\n");
    COSWarn(1, "Wait 3 seconds for HOST to deatach and attach\n"); //Typo in binary
    OSSleepTicks((int64_t)3 * (OSGetSystemInfo()->busClockSpeed / 4));
}

CCRHID - Gamepad Human Interface Device API

void CCRHIDSetup(void) //02000498
{
    COSInfo(6, "%s() depricated, no need to call\n", "CCRHIDSetup"); //Typo in binary
    return 0;
}

void CCRHIDTeardown(void) //020004D4
{
    COSInfo(6, "%s() depricated, no need to call\n", "CCRHIDTeardown"); //Typo in binary
    return 0;
}

CCRCDC - Gamepad Communications Device Class API

uint16_t CCRCDCCalcCRC16(uint32_t *data, uint32_t size) //02002EAC
{
    uint16_t crc = 0xFFFF;
    if (size > 0)
    {
        for (int j = 0; j < size; j++)
        {
            crc = (uint16_t)(crc ^ data[j]); //load in new byte
            for (int i = 0; i < 8; i++)
            {
                if ((crc & 0x0001) == 1) //if LSB is set, do xor
                    crc = (uint16_t)((crc >> 1) ^ 0x8408);
                else //just cycle 1
                    crc >>= 1;
            }
        }
    }
    return crc;
}