SceUsbSerial: Difference between revisions

From Vita Development Wiki
Jump to navigation Jump to search
(Swapped Module <-> Library, see revision 1.1 under "Revision History" of "Vita SDK specifications" (https://wiki.henkaku.xyz/vita/File:Vita_SDK_specifications.pdf))
No edit summary
Line 3: Line 3:
=== Known NIDs ===
=== Known NIDs ===
{| class="wikitable"
{| class="wikitable"
|-
! Version !! Name !! World !! Privilege !! NID
! Version !! Name !! World !! Privilege !! NID
|-
|-
| 1.69 || SceUsbSerial || Non-secure || Kernel || 0xF8D9930F
| 1.69 || SceUsbSerial || Non-secure || Kernel || 0xF8D9930F
|-
| 3.60 || SceUsbSerial || Non-secure || Kernel || 0xB3C543D4
|}
|}


Line 12: Line 13:


=== Known NIDs ===
=== Known NIDs ===
{| class="wikitable"
{| class="wikitable"
|-
! Version !! Name !! World !! Visibility !! NID
! Version !! Name !! World !! Visibility !! NID
|-
|-
| 1.69 || [[SceUsbSerial#SceUsbSerialForDriver|SceUsbSerialForDriver]] || Non-secure || Kernel || 0x8829C2F3
| 1.69 || [[SceUsbSerial#SceUsbSerialForDriver|SceUsbSerialForDriver]] || Non-secure || Kernel || 0x8829C2F3
|-
| 3.60 || [[SceUsbSerial#SceUsbSerialForDriver|SceUsbSerialForDriver]] || Non-secure || Kernel || removed
|-
|-
| 1.69 || [[SceUsbSerial#SceUsbSerial|SceUsbSerial]] || Non-secure || User || 0x2820117D
| 1.69 || [[SceUsbSerial#SceUsbSerial|SceUsbSerial]] || Non-secure || User || 0x2820117D
|-
| 3.60 || [[SceUsbSerial#SceUsbSerial|SceUsbSerial]] || Non-secure || User || 0x2820117D
|}
|}


== SceUsbSerialForDriver ==
== SceUsbSerialForDriver ==


=== Activate USB serial device ===
This library does not exist anymore as of FW 3.60.
 
=== sceUsbSerialStartForDriver ===
{| class="wikitable"
{| class="wikitable"
! Version !! NID
|-
|-
! Version
| 1.69 || 0xFEE7F4BA
! NID
|-
| 1.69
| 0xFEE7F4BA
|}
|}
The user is responsible for making sure no other UDC driver is active. This activates UDC as a <code>"PS Vita" Type D</code> device.


<source lang="c">int SceUsbSerialForDriver_0xFEE7F4BA_start(void);</source>
<source lang="c">
/**
* Activate USB serial device
*
* @return 0 on success, < 0 on error
*
* @note The user is responsible for making sure no other UDC driver is active. This activates UDC as a "PS Vita" Type D device.
*/
int sceUsbSerialStartForDriver(void);
</source>


=== Setup USB serial device ===
=== sceUsbSerialSetupForDriver ===
{| class="wikitable"
{| class="wikitable"
! Version !! NID
|-
|-
! Version
| 1.69 || 0x590B8F97
! NID
|-
| 1.69
| 0x590B8F97
|}
|}


<source lang="c">int SceUsbSerialForDriver_0x590B8F97_setup(int unk);</source>
<source lang="c">
/**
* Setup USB serial device
*
* @return 0 on success, < 0 on error
*
* @param unk Unknown
*/
int sceUsbSerialSetupForDriver(int unk);
</source>


=== Get Device Status ===
=== sceUsbSerialStatusForDriver ===
{| class="wikitable"
{| class="wikitable"
! Version !! NID
|-
|-
! Version
| 1.69 || 0x8C426906
! NID
|-
| 1.69
| 0x8C426906
|}
|}
Returns 1 when device is ready.


<source lang="c">int SceUsbSerialForDriver_0x8C426906_status(void);</source>
<source lang="c">
/**
* Get USB device status
*
* @return Returns 1 when serial port is open
*/
int sceUsbSerialStatusForDriver(void);</source>


=== Close USB serial device ===
=== sceUsbSerialCloseForDriver ===
{| class="wikitable"
{| class="wikitable"
! Version !! NID
|-
|-
! Version
| 1.69 || 0xE6B1E64F
! NID
|-
| 1.69
| 0xE6B1E64F
|}
|}


<source lang="c">int SceUsbSerialForDriver_0xE6B1E64F_close(void);</source>
<source lang="c">
/**
* Close USB serial device
*/
int sceUsbSerialCloseForDriver(void);
</source>


=== Get receive buffer length ===
=== sceUsbSerialGetRecvBufferSizeForDriver ===
{| class="wikitable"
{| class="wikitable"
! Version !! NID
|-
|-
! Version
| 1.69 || 0xF531B5AE
! NID
|-
| 1.69
| 0xF531B5AE
|}
|}


<source lang="c">unsigned int SceUsbSerialForDriver_0xF531B5AE_get_len(void);</source>
<source lang="c">
/**
* Get receive buffer length
*
* @return Returns length of USB rx buffer
*/
unsigned int sceUsbSerialGetRecvBufferSizeForDriver(void);
</source>


=== Send Data ===
=== sceUsbSerialSendForDriver ===
{| class="wikitable"
{| class="wikitable"
! Version !! NID
|-
|-
! Version
| 1.69 || 0x0C2E73C0
! NID
|-
| 1.69
| 0x0C2E73C0
|}
|}


<source lang="c">unsigned int SceUsbSerialForDriver_0x0C2E73C0_send(const void *buffer, unsigned int len, int unk1, int unk2);</source>
<source lang="c">
/**
* Send data
*
* @param[in] *buffer data to send over usb
* @param[in] len int len of serial buffer data
* @param unk1 Unknown
* @param unk2 Unknown
* @note max send length is 0x10000
*/
unsigned int sceUsbSerialSendForDriver(const void *buffer, unsigned int len, int unk1, int unk2);
</source>


=== Receive Data ===
=== sceUsbSerialRecvForDriver ===
{| class="wikitable"
{| class="wikitable"
! Version !! NID
|-
|-
! Version
| 1.69 || 0x6B5E296F
! NID
|-
| 1.69
| 0x6B5E296F
|}
|}


<source lang="c">unsigned int SceUsbSerialForDriver_0x6B5E296F_recv(void *buffer, unsigned int max_len, int unk1, int unk2);</source>
<source lang="c">
/**
* Receive Data
*
* @param[out] *buffer buffer for incoming data
* @param[in] max_len max data length to receive
* @param unk1 Unknown
* @param unk2 Unknown
* @note max recv length is 0x10000
*/
unsigned int sceUsbSerialRecvForDriver(void *buffer, unsigned int max_len, int unk1, int unk2);
</source>


== SceUsbSerial ==
== SceUsbSerial ==


=== Activate USB serial device ===
=== sceUsbSerialStart ===
{| class="wikitable"
{| class="wikitable"
! Version !! NID
|-
|-
! Version
| 1.69 || 0xE3BEC18C
! NID
|-
|-
| 1.69
| 3.60 || 0xE3BEC18C
| 0xE3BEC18C
|}
|}
User wrapper for <code>0xFEE7F4BA</code>. Must have correct permissions to call.


=== Setup USB serial device ===
User wrapper for <code>sceUsbSerialStartForDriver</code>. Must have correct permissions to call.
 
<source lang="c">
/**
* Activate USB serial device
*
* @return 0 on success, < 0 on error
*
* @note The user is responsible for making sure no other UDC driver is active. This activates UDC as a "PS Vita" Type D device.
*
* @note Wrapper for kernel function sceUsbSerialStartForDriver()
*/
int sceUsbSerialStart(void);
</source>
 
=== sceUsbSerialSetup ===
{| class="wikitable"
{| class="wikitable"
! Version !! NID
|-
|-
! Version
| 1.69 || 0x290E08B4
! NID
|-
|-
| 1.69
| 3.60 || 0x290E08B4
| 0x290E08B4
|}
|}
User wrapper for <code>0x590B8F97</code>. Must have correct permissions to call.


=== Get Device Status ===
User wrapper for <code>sceUsbSerialSetupForDriver</code>. Must have correct permissions to call.
 
<source lang="c">
/**
* Setup USB serial device
*
* @return 0 on success, < 0 on error
*
* @param unk Unknown
*
* @note Wrapper for kernel function sceUsbSerialSetupForDriver()
*/
int sceUsbSerialSetup(int unk);
</source>
 
=== sceUsbSerialStatus ===
{| class="wikitable"
{| class="wikitable"
! Version !! NID
|-
|-
! Version
| 1.69 || 0xA6A2F5DE
! NID
|-
|-
| 1.69
| 3.60 || 0xA6A2F5DE
| 0xA6A2F5DE
|}
|}
User wrapper for <code>0x8C426906</code>. Must have correct permissions to call.


=== Close USB serial device ===
User wrapper for <code>sceUsbSerialStatusForDriver</code>. Must have correct permissions to call.
 
<source lang="c">
/**
* Close USB serial device
*
* @return Returns 1 when serial port is open
*
* @note Wrapper for kernel function sceUsbSerialStatusForDriver()
*/
int sceUsbSerialStatus(void);
</source>
 
=== sceUsbSerialClose ===
{| class="wikitable"
{| class="wikitable"
! Version !! NID
|-
|-
! Version
| 1.69 || 0xF2415853
! NID
|-
|-
| 1.69
| 3.60 || 0xF2415853
| 0xF2415853
|}
|}
User wrapper for <code>0xE6B1E64F</code>. Must have correct permissions to call.


=== Get receive buffer length ===
User wrapper for <code>sceUsbSerialCloseForDriver</code>. Must have correct permissions to call.
 
<source lang="c">
/**
* Close USB serial device
*
* @note Wrapper for kernel function sceUsbSerialCloseForDriver()
*/
int sceUsbSerialClose(void);
</source>
 
=== sceUsbSerialGetRecvBufferSize ===
{| class="wikitable"
{| class="wikitable"
! Version !! NID
|-
|-
! Version
| 1.69 || 0xE8567A87
! NID
|-
|-
| 1.69
| 3.60 || 0xE8567A87
| 0xE8567A87
|}
|}
User wrapper for <code>0xF531B5AE</code>. Must have correct permissions to call.


=== Send Data ===
User wrapper for <code>sceUsbSerialGetRecvBufferSizeForDriver</code>. Must have correct permissions to call.
 
<source lang="c">
/**
* Get receive buffer length
*
* @return Returns length of USB rx buffer
*
* @note Wrapper for kernel function sceUsbSerialGetLenForDriver()
*/
unsigned int sceUsbSerialGetRecvBufferSize(void);
</source>
 
=== sceUsbSerialSend ===
{| class="wikitable"
{| class="wikitable"
! Version !! NID
|-
|-
! Version
| 1.69 || 0x89E71202
! NID
|-
|-
| 1.69
| 3.60 || 0x89E71202
| 0x89E71202
|}
|}
User wrapper for <code>0x0C2E73C0</code>. Must have correct permissions to call. Max length is <code>0x10000</code>.


=== Receive Data ===
User wrapper for <code>sceUsbSerialSendForDriver</code>. Must have correct permissions to call. Max length is <code>0x10000</code>.
 
<source lang="c">
/**
* Send data
* @param[in] *buffer data to send over usb
* @param len int len of serial buffer data
* @param unk1 Unknown
* @param unk2 Unknown
* @note max send length is 0x10000
* @note Wrapper for kernel function sceUsbSerialSendForDriver()
*/
unsigned int sceUsbSerialSend(const void *buffer, unsigned int len, int unk1, int unk2);
</source>
 
=== sceUsbSerialRecv ===
{| class="wikitable"
{| class="wikitable"
! Version !! NID
|-
|-
! Version
| 1.69 || 0xF26DC8D8
! NID
|-
|-
| 1.69
| 3.60 || 0xF26DC8D8
| 0xF26DC8D8
|}
|}
User wrapper for <code>0x6B5E296F</code>. Must have correct permissions to call. Max length is <code>0x10000</code>.


== Sample Usage ==
User wrapper for <code>sceUsbSerialRecvForDriver</code>. Must have correct permissions to call. Max length is <code>0x10000</code>.


<source lang="c">
<source lang="c">
int usb_serial_connect(void)
/**
{
* Receive Data
*
* @param[out] *buffer buffer for incoming data
* @param max_len max data length to receive
* @param unk1 Unknown
* @param unk2 Unknown
* @note max recv length is 0x10000
* @note Wrapper for kernel function sceUsbSerialRecvForDriver()
*/
unsigned int sceUsbSerialRecv(void *buffer, unsigned int max_len, int unk1, int unk2);
</source>
 
== Sample Kernel Usage ==
 
<source lang="c">
int usb_serial_connect(void) {
     int ret;
     int ret;


     ret = SceUsbSerialForDriver_0x8C426906_status();
     ret = sceUsbSerialStatusForDriver();
     printf("SceUsbSerialForDriver_0x8C426906_status: 0x%08X\n", ret);
     printf("sceUsbSerialStatusForDriver: 0x%08X\n", ret);
     if (ret != 0x80244401)
     if (ret != 0x80244401) {
    {
         printf("already connected\n");
         printf("already connected\n");
         return 0;
         return 0;
     }
     }


     ret = SceUsbSerialForDriver_0xFEE7F4BA_start();
     ret = sceUsbSerialStartForDriver();
     printf("SceUsbSerialForDriver_0xFEE7F4BA_start: 0x%08X\n", ret);
     printf("sceUsbSerialStartForDriver: 0x%08X\n", ret);
     ret = SceUsbSerialForDriver_0x590B8F97_setup(1);
     ret = sceUsbSerialSetupForDriver(1);
     printf("SceUsbSerialForDriver_0x590B8F97_setup: 0x%08X\n", ret);
     printf("sceUsbSerialSetupForDriver: 0x%08X\n", ret);


     if (ret == 0x80244403)
     if (ret == 0x80244403) {
    {
         ret = SceUsbSerialForDriver_0x6AA4EFA4();
         ret = SceUsbSerialForDriver_0x6AA4EFA4();
         printf("SceUsbSerialForDriver_0x6AA4EFA4: 0x%08X\n", ret);
         printf("SceUsbSerialForDriver_0x6AA4EFA4: 0x%08X\n", ret);
         ret = SceUsbSerialForDriver_0x590B8F97_setup(1);
         ret = sceUsbSerialSetupForDriver(1);
         printf("SceUsbSerialForDriver_0x590B8F97_setup: 0x%08X\n", ret);
         printf("sceUsbSerialSetupForDriver: 0x%08X\n", ret);
     }
     }


     while (SceUsbSerialForDriver_0x8C426906_status() != 1); // wait for ready
     while (sceUsbSerialStatusForDriver() != 1); // wait for ready


     return 0;
     return 0;
}
}


int usb_serial_close(void)
int usb_serial_close(void) {
{
     int ret;
     int ret;


     ret = SceUsbSerialForDriver_0x6AA4EFA4();
     ret = SceUsbSerialForDriver_0x6AA4EFA4();
     printf("SceUsbSerialForDriver_0x6AA4EFA4: 0x%08X\n", ret);
     printf("SceUsbSerialForDriver_0x6AA4EFA4: 0x%08X\n", ret);
     ret = SceUsbSerialForDriver_0xE6B1E64F_close();
     ret = sceUsbSerialCloseForDriver();
     printf("SceUsbSerialForDriver_0xE6B1E64F_close: 0x%08X\n", ret);
     printf("sceUsbSerialCloseForDriver: 0x%08X\n", ret);


     return 0;
     return 0;
}
}


int usb_serial_send(const void *data, unsigned int len)
int usb_serial_send(const void *data, unsigned int len) {
{
     int ret;
     int ret;


     ret = SceUsbSerialForDriver_0x0C2E73C0_send(data, len, 0, -1);
     ret = sceUsbSerialSendForDriver(data, len, 0, -1);
     printf("SceUsbSerialForDriver_0x0C2E73C0_send: 0x%08X\n");
     printf("sceUsbSerialSendForDriver: 0x%08X\n");


     return ret;
     return ret;
}
}


int usb_serial_recv(void *data, unsigned int len)
int usb_serial_recv(void *data, unsigned int len) {
{
     int ret;
     int ret;


     while (SceUsbSerialForDriver_0xF531B5AE_get_len() < len)
     while (sceUsbSerialGetRecvBufferSizeForDriver() < len) {
    {
         if (sceUsbSerialStatusForDriver() != 1)
         if (SceUsbSerialForDriver_0x8C426906_status() != 1)
        {
             return 0;
             return 0;
        }
     }
     }


     ret = SceUsbSerialForDriver_0x6B5E296F_recv(data, len, 0, -1);
     ret = sceUsbSerialRecvForDriver(data, len, 0, -1);
     printf("SceUsbSerialForDriver_0x6B5E296F_recv: 0x%08X\n");
     printf("sceUsbSerialRecvForDriver: 0x%08X\n");


     return ret;
     return ret;
}
}
</source>
</source>


[[Category:Modules]]
[[Category:Modules]]
[[Category:Kernel]]
[[Category:Kernel]]

Revision as of 13:16, 12 August 2018

Module

Known NIDs

Version Name World Privilege NID
1.69 SceUsbSerial Non-secure Kernel 0xF8D9930F
3.60 SceUsbSerial Non-secure Kernel 0xB3C543D4

Libraries

Known NIDs

Version Name World Visibility NID
1.69 SceUsbSerialForDriver Non-secure Kernel 0x8829C2F3
3.60 SceUsbSerialForDriver Non-secure Kernel removed
1.69 SceUsbSerial Non-secure User 0x2820117D
3.60 SceUsbSerial Non-secure User 0x2820117D

SceUsbSerialForDriver

This library does not exist anymore as of FW 3.60.

sceUsbSerialStartForDriver

Version NID
1.69 0xFEE7F4BA
/**
 * Activate USB serial device
 *
 * @return 0 on success, < 0 on error
 *
 * @note The user is responsible for making sure no other UDC driver is active. This activates UDC as a "PS Vita" Type D device.
 */
int sceUsbSerialStartForDriver(void);

sceUsbSerialSetupForDriver

Version NID
1.69 0x590B8F97
/**
 * Setup USB serial device
 *
 * @return 0 on success, < 0 on error
 *
 * @param unk Unknown
 */
int sceUsbSerialSetupForDriver(int unk);

sceUsbSerialStatusForDriver

Version NID
1.69 0x8C426906
/**
 * Get USB device status
 *
 * @return Returns 1 when serial port is open
 */
int sceUsbSerialStatusForDriver(void);

sceUsbSerialCloseForDriver

Version NID
1.69 0xE6B1E64F
/**
 * Close USB serial device
 */
int sceUsbSerialCloseForDriver(void);

sceUsbSerialGetRecvBufferSizeForDriver

Version NID
1.69 0xF531B5AE
/**
 * Get receive buffer length
 *
 * @return Returns length of USB rx buffer
 */
unsigned int sceUsbSerialGetRecvBufferSizeForDriver(void);

sceUsbSerialSendForDriver

Version NID
1.69 0x0C2E73C0
/**
 * Send data
 *
 * @param[in] *buffer data to send over usb
 * @param[in] len int len of serial buffer data
 * @param unk1 Unknown
 * @param unk2 Unknown
 * @note max send length is 0x10000
 */
unsigned int sceUsbSerialSendForDriver(const void *buffer, unsigned int len, int unk1, int unk2);

sceUsbSerialRecvForDriver

Version NID
1.69 0x6B5E296F
/**
 * Receive Data
 *
 * @param[out] *buffer buffer for incoming data
 * @param[in] max_len max data length to receive
 * @param unk1 Unknown
 * @param unk2 Unknown
 * @note max recv length is 0x10000
 */
unsigned int sceUsbSerialRecvForDriver(void *buffer, unsigned int max_len, int unk1, int unk2);

SceUsbSerial

sceUsbSerialStart

Version NID
1.69 0xE3BEC18C
3.60 0xE3BEC18C

User wrapper for sceUsbSerialStartForDriver. Must have correct permissions to call.

/**
 * Activate USB serial device
 *
 * @return 0 on success, < 0 on error
 *
 * @note The user is responsible for making sure no other UDC driver is active. This activates UDC as a "PS Vita" Type D device.
 *
 * @note Wrapper for kernel function sceUsbSerialStartForDriver()
 */
int sceUsbSerialStart(void);

sceUsbSerialSetup

Version NID
1.69 0x290E08B4
3.60 0x290E08B4

User wrapper for sceUsbSerialSetupForDriver. Must have correct permissions to call.

/**
 * Setup USB serial device
 *
 * @return 0 on success, < 0 on error
 *
 * @param unk Unknown
 *
 * @note Wrapper for kernel function sceUsbSerialSetupForDriver()
 */
int sceUsbSerialSetup(int unk);

sceUsbSerialStatus

Version NID
1.69 0xA6A2F5DE
3.60 0xA6A2F5DE

User wrapper for sceUsbSerialStatusForDriver. Must have correct permissions to call.

/**
 * Close USB serial device
 *
 * @return Returns 1 when serial port is open
 *
 * @note Wrapper for kernel function sceUsbSerialStatusForDriver()
 */
int sceUsbSerialStatus(void);

sceUsbSerialClose

Version NID
1.69 0xF2415853
3.60 0xF2415853

User wrapper for sceUsbSerialCloseForDriver. Must have correct permissions to call.

/**
 * Close USB serial device
 *
 * @note Wrapper for kernel function sceUsbSerialCloseForDriver()
 */
int sceUsbSerialClose(void);

sceUsbSerialGetRecvBufferSize

Version NID
1.69 0xE8567A87
3.60 0xE8567A87

User wrapper for sceUsbSerialGetRecvBufferSizeForDriver. Must have correct permissions to call.

/**
 * Get receive buffer length
 *
 * @return Returns length of USB rx buffer
 *
 * @note Wrapper for kernel function sceUsbSerialGetLenForDriver()
 */
unsigned int sceUsbSerialGetRecvBufferSize(void);

sceUsbSerialSend

Version NID
1.69 0x89E71202
3.60 0x89E71202

User wrapper for sceUsbSerialSendForDriver. Must have correct permissions to call. Max length is 0x10000.

/**
 * Send data
 * @param[in] *buffer data to send over usb
 * @param len int len of serial buffer data
 * @param unk1 Unknown
 * @param unk2 Unknown
 * @note max send length is 0x10000
 * @note Wrapper for kernel function sceUsbSerialSendForDriver()
 */
unsigned int sceUsbSerialSend(const void *buffer, unsigned int len, int unk1, int unk2);

sceUsbSerialRecv

Version NID
1.69 0xF26DC8D8
3.60 0xF26DC8D8

User wrapper for sceUsbSerialRecvForDriver. Must have correct permissions to call. Max length is 0x10000.

/**
 * Receive Data
 *
 * @param[out] *buffer buffer for incoming data
 * @param max_len max data length to receive
 * @param unk1 Unknown
 * @param unk2 Unknown
 * @note max recv length is 0x10000
 * @note Wrapper for kernel function sceUsbSerialRecvForDriver()
 */
unsigned int sceUsbSerialRecv(void *buffer, unsigned int max_len, int unk1, int unk2);

Sample Kernel Usage

int usb_serial_connect(void) {
    int ret;

    ret = sceUsbSerialStatusForDriver();
    printf("sceUsbSerialStatusForDriver: 0x%08X\n", ret);
    if (ret != 0x80244401) {
        printf("already connected\n");
        return 0;
    }

    ret = sceUsbSerialStartForDriver();
    printf("sceUsbSerialStartForDriver: 0x%08X\n", ret);
    ret = sceUsbSerialSetupForDriver(1);
    printf("sceUsbSerialSetupForDriver: 0x%08X\n", ret);

    if (ret == 0x80244403) {
        ret = SceUsbSerialForDriver_0x6AA4EFA4();
        printf("SceUsbSerialForDriver_0x6AA4EFA4: 0x%08X\n", ret);
        ret = sceUsbSerialSetupForDriver(1);
        printf("sceUsbSerialSetupForDriver: 0x%08X\n", ret);
    }

    while (sceUsbSerialStatusForDriver() != 1); // wait for ready

    return 0;
}

int usb_serial_close(void) {
    int ret;

    ret = SceUsbSerialForDriver_0x6AA4EFA4();
    printf("SceUsbSerialForDriver_0x6AA4EFA4: 0x%08X\n", ret);
    ret = sceUsbSerialCloseForDriver();
    printf("sceUsbSerialCloseForDriver: 0x%08X\n", ret);

    return 0;
}

int usb_serial_send(const void *data, unsigned int len) {
    int ret;

    ret = sceUsbSerialSendForDriver(data, len, 0, -1);
    printf("sceUsbSerialSendForDriver: 0x%08X\n");

    return ret;
}

int usb_serial_recv(void *data, unsigned int len) {
    int ret;

    while (sceUsbSerialGetRecvBufferSizeForDriver() < len) {
        if (sceUsbSerialStatusForDriver() != 1)
            return 0;
    }

    ret = sceUsbSerialRecvForDriver(data, len, 0, -1);
    printf("sceUsbSerialRecvForDriver: 0x%08X\n");

    return ret;
}