mirror of
https://github.com/IllusionMan1212/vitasdk-odin.git
synced 2026-10-24 02:12:38 +00:00
added kernel libraries bindings and cleaned up todos
This commit is contained in:
+181
@@ -4,6 +4,7 @@ import "core:c"
|
||||
import sce "../common"
|
||||
|
||||
foreign import usbd "system:SceUsbd_stub"
|
||||
foreign import usbdkern "system:SceUsbdForDriver_stub"
|
||||
|
||||
@(link_prefix = "sceUsbd")
|
||||
foreign usbd {
|
||||
@@ -277,3 +278,183 @@ foreign usbd {
|
||||
*/
|
||||
AttachCompositeLdd :: proc(uid: sce.UID, param: ^SceUsbdAttachCompositeParam) -> c.int ---
|
||||
}
|
||||
|
||||
foreign usbdkern {
|
||||
/**
|
||||
* Register USB driver
|
||||
*
|
||||
* @return 0 on success, < 0 on error
|
||||
*
|
||||
* @param driver driver struct
|
||||
*
|
||||
*/
|
||||
ksceUsbdRegisterDriver :: proc(#by_ptr driver: SceUsbdDriver) -> c.int ---
|
||||
|
||||
/**
|
||||
* Register USB driver for composite devices
|
||||
*
|
||||
* @return 0 on success, < 0 on error
|
||||
*
|
||||
* @param driver driver struct
|
||||
*
|
||||
*/
|
||||
ksceUsbdRegisterCompositeLdd :: proc(#by_ptr driver: SceUsbdCompositeDriver) -> c.int ---
|
||||
|
||||
/**
|
||||
* De-register USB driver
|
||||
*
|
||||
* @return 0 on success, < 0 on error
|
||||
*
|
||||
* @param driver driver struct
|
||||
*
|
||||
*/
|
||||
ksceUsbdUnregisterDriver :: proc(#by_ptr driver: SceUsbdDriver) -> c.int ---
|
||||
|
||||
/**
|
||||
* De-register USB driver for composite devices
|
||||
*
|
||||
* @return 0 on success, < 0 on error
|
||||
*
|
||||
* @param driver driver struct
|
||||
*
|
||||
*/
|
||||
ksceUsbdUnregisterCompositeLdd :: proc(#by_ptr driver: SceUsbdCompositeDriver) -> c.int ---
|
||||
|
||||
|
||||
/**
|
||||
* Return usb descriptor
|
||||
*
|
||||
* @return descriptor data on success, NULL on error
|
||||
*
|
||||
* @param device_id device id
|
||||
* @param start pointer to descriptor to start scanning from (may be NULL)
|
||||
* @param type descriptor type
|
||||
*
|
||||
*/
|
||||
ksceUsbdScanStaticDescriptor :: proc(device_id: sce.UID, start: rawptr, type: SceUsbdDescriptorType) -> rawptr ---
|
||||
|
||||
/**
|
||||
* Open communication pipe to endpoint
|
||||
*
|
||||
* @return pipe uid on success, < 0 on error
|
||||
*
|
||||
* @param device_id device id
|
||||
* @param endpoint endpoint (may be null for default configuration endpoint)
|
||||
*
|
||||
*/
|
||||
ksceUsbdOpenPipe :: proc(device_id: c.int, endpoint: ^SceUsbdEndpointDescriptor) -> sce.UID ---
|
||||
|
||||
/**
|
||||
* Close communication pipe to endpoint
|
||||
*
|
||||
* @return 0 on success, < 0 on error
|
||||
*
|
||||
* @param pipe_id pipe id
|
||||
*
|
||||
*/
|
||||
ksceUsbdClosePipe :: proc(pipe_id: sce.UID) -> c.int ---
|
||||
|
||||
/**
|
||||
* Transfer data to/from endpoint
|
||||
*
|
||||
* @return 0 on success, < 0 on error
|
||||
*
|
||||
* @param pipe_id pipe id
|
||||
* @param req transfer request
|
||||
* @param buffer data
|
||||
* @param cb transfer callback
|
||||
* @param user_data userdata to pass to callback
|
||||
*
|
||||
*/
|
||||
ksceUsbdControlTransfer :: proc(pipe_id: sce.UID, #by_ptr req: SceUsbdDeviceRequest, buffer: [^]c.uchar, cb: ksceUsbdDoneCallback, user_data: rawptr) -> c.int ---
|
||||
|
||||
/**
|
||||
* Transfer data to/from interrupt endpoint
|
||||
*
|
||||
* @return 0 on success, < 0 on error
|
||||
*
|
||||
* @param pipe_id pipe id
|
||||
* @param buffer data
|
||||
* @param length data length
|
||||
* @param cb transfer callback
|
||||
* @param user_data userdata to pass to callback
|
||||
*
|
||||
*/
|
||||
ksceUsbdInterruptTransfer :: proc(pipe_id: sce.UID, buffer: [^]c.uchar, length: sce.Size, cb: ksceUsbdDoneCallback, user_data: rawptr) -> c.int ---
|
||||
|
||||
/**
|
||||
* Transfer isochronous data to/from endpoint
|
||||
*
|
||||
* @return 0 on success, < 0 on error
|
||||
*
|
||||
* @param pipe_id pipe id
|
||||
* @param transfer transfer request
|
||||
* @param cb transfer callback
|
||||
* @param user_data userdata to pass to callback
|
||||
*
|
||||
*/
|
||||
ksceUsbdIsochronousTransfer :: proc(pipe_id: sce.UID, transfer: ^ksceUsbdIsochTransfer, cb: ksceUsbdIsochDoneCallback, user_data: rawptr) -> c.int ---
|
||||
|
||||
/**
|
||||
* Transfer data to/from endpoint
|
||||
*
|
||||
* @return 0 on success, < 0 on error
|
||||
*
|
||||
* @param pipe_id pipe id
|
||||
* @param buffer data
|
||||
* @param length data length
|
||||
* @param cb transfer callback
|
||||
* @param user_data userdata to pass to callback
|
||||
*
|
||||
* @note buffer pointer must be 64b aligned
|
||||
*/
|
||||
ksceUsbdBulkTransfer :: proc(pipe_id: sce.UID, buffer: [^]c.uchar, length: c.uint, cb: ksceUsbdDoneCallback, user_data: rawptr) -> c.int ---
|
||||
|
||||
/**
|
||||
* Transfer data to/from endpoint
|
||||
*
|
||||
* @return 0 on success, < 0 on error
|
||||
*
|
||||
* @param pipe_id pipe id
|
||||
* @param buffer data
|
||||
* @param length data length
|
||||
* @param cb transfer callback
|
||||
* @param user_data userdata to pass to callback
|
||||
*
|
||||
* @note buffer pointer must be 64b aligned
|
||||
*/
|
||||
ksceUsbdBulkTransfer2 :: proc(pipe_id: c.int, buffer: [^]c.uchar, length: c.uint, cb: ksceUsbdDoneCallback, user_data: rawptr) -> c.int ---
|
||||
|
||||
|
||||
/**
|
||||
* Get device location
|
||||
*
|
||||
* @return 0 on success, < 0 on error
|
||||
*
|
||||
* @param device_id device id
|
||||
* @param[out] location device location data (port)
|
||||
*
|
||||
*/
|
||||
ksceUsbdGetDeviceLocation :: proc(device_id: sce.UID, location: ^c.uint8_t) -> c.int ---
|
||||
|
||||
ksceUsbdSuspend :: proc(port: c.int) -> c.int ---
|
||||
ksceUsbdSuspendPhase2 :: proc(port: c.int, flag: c.int) -> c.int ---
|
||||
ksceUsbdResume :: proc(port: c.int) -> c.int ---
|
||||
|
||||
ksceUsbdHostStop :: proc(port: c.int) -> c.int ---
|
||||
ksceUsbdHostStart :: proc(port: c.int) -> c.int ---
|
||||
|
||||
/**
|
||||
* Get device speed
|
||||
*
|
||||
* @return 0 on success, < 0 on error
|
||||
*
|
||||
* @param device_id device id
|
||||
* @param[out] speed device speed
|
||||
*
|
||||
*/
|
||||
ksceUsbdGetDeviceSpeed :: proc(device_id: c.int, speed: ^c.uint8_t) -> c.int ---
|
||||
|
||||
ksceUsbd_05073925 :: proc(device_id: sce.UID, unk1: ^c.int, unk2: ^c.int) -> c.int ---
|
||||
ksceUsbd_7938DAC7 :: proc(pipe_id: sce.UID) -> c.int --- // clear halt?
|
||||
}
|
||||
|
||||
+115
-1
@@ -52,7 +52,6 @@ SCE_USBD_DEVICE_SPEED_LS :: 0
|
||||
SCE_USBD_DEVICE_SPEED_FS :: 1
|
||||
SCE_USBD_DEVICE_SPEED_HS :: 2
|
||||
|
||||
// TODO:
|
||||
SceUsbdErrorCode :: enum c.uint {
|
||||
ERROR_NOT_INITIALIZED = 0x80240001,
|
||||
ERROR_ALREADY_INITIALIZED = 0x80240002,
|
||||
@@ -241,3 +240,118 @@ SceUsbdIsochTransferStatus :: struct {
|
||||
unk2: ^c.uintptr_t, // ret up to 0x28 buff. 10 * 4 bytes. or 8*5 bytes
|
||||
unk3: c.uint32_t, // ret 4. ptr?
|
||||
}
|
||||
|
||||
SCE_USBD_PROBE_SUCCEEDED :: (0)
|
||||
SCE_USBD_PROBE_FAILED :: (-1)
|
||||
SCE_USBD_ATTACH_SUCCEEDED :: (0)
|
||||
SCE_USBD_ATTACH_FAILED :: (-1)
|
||||
SCE_USBD_DETACH_SUCCEEDED :: (0)
|
||||
SCE_USBD_DETACH_FAILED :: (-1)
|
||||
|
||||
SCE_USBD_MAX_LS_CONTROL_PACKET_SIZE :: 8
|
||||
SCE_USBD_MAX_FS_CONTROL_PACKET_SIZE :: 64
|
||||
SCE_USBD_MAX_ISOCHRONOUS_PACKET_SIZE :: 1023
|
||||
SCE_USBD_MAX_LS_INTERRUPT_PACKET_SIZE :: 8
|
||||
SCE_USBD_MAX_FS_INTERRUPT_PACKET_SIZE :: 64
|
||||
SCE_USBD_MAX_BULK_PACKET_SIZE :: 64
|
||||
|
||||
SCE_USBD_FEATURE_ENDPOINT_HALT :: 0x00
|
||||
SCE_USBD_FEATURE_DEVICE_REMOTE_WAKEUP :: 0x01
|
||||
|
||||
SceUsbdDriver :: struct {
|
||||
name: cstring,
|
||||
probe: #type ^proc "c" (device_id: c.int) -> c.int,
|
||||
attach: #type ^proc "c" (device_id: c.int) -> c.int,
|
||||
detach: #type ^proc "c" (device_id: c.int) -> c.int,
|
||||
}
|
||||
|
||||
SceUsbdCompositeDriver :: struct {
|
||||
name: cstring,
|
||||
probe: #type ^proc "c" (device_id: c.int, desc: ^SceUsbdEndpointDescriptor) -> c.int, // endpoint descriptor should be interface one
|
||||
attach: #type ^proc "c" (device_id: c.int) -> c.int,
|
||||
detach: #type ^proc "c" (device_id: c.int) -> c.int,
|
||||
}
|
||||
|
||||
SceUsbdDeviceRequest :: struct {
|
||||
bmRequestType: c.uint8_t,
|
||||
bRequest: c.uint8_t,
|
||||
wValue: c.uint16_t,
|
||||
wIndex: c.uint16_t,
|
||||
wLength: c.uint16_t,
|
||||
}
|
||||
#assert(size_of(SceUsbdDeviceRequest) == 8)
|
||||
|
||||
SceUsbdReqtype :: enum c.int {
|
||||
DIR_BITS = 0x80,
|
||||
DIR_TO_DEVICE = 0x00,
|
||||
DIR_TO_HOST = 0x80,
|
||||
TYPE_BITS = 0x60,
|
||||
TYPE_STANDARD = 0x00,
|
||||
TYPE_CLASS = 0x20,
|
||||
TYPE_VENDOR = 0x40,
|
||||
TYPE_RESERVED = 0x60,
|
||||
RECIP_BITS = 0x1f,
|
||||
RECIP_DEVICE = 0x00,
|
||||
RECIP_INTERFACE = 0x01,
|
||||
RECIP_ENDPOINT = 0x02,
|
||||
RECIP_OTHER = 0x03,
|
||||
}
|
||||
|
||||
SceUsbdRequest :: enum c.int {
|
||||
GET_STATUS = 0x00,
|
||||
CLEAR_FEATURE = 0x01,
|
||||
SET_FEATURE = 0x03,
|
||||
SET_ADDRESS = 0x05,
|
||||
GET_DESCRIPTOR = 0x06,
|
||||
SET_DESCRIPTOR = 0x07,
|
||||
GET_CONFIGURATION = 0x08,
|
||||
SET_CONFIGURATION = 0x09,
|
||||
GET_INTERFACE = 0x0a,
|
||||
SET_INTERFACE = 0x0b,
|
||||
SYNCH_FRAME = 0x0c
|
||||
}
|
||||
|
||||
ksceUsbdIsochPswLen :: bit_field c.uint16_t {
|
||||
len: c.uint16_t | 12,
|
||||
PSW: c.uint16_t | 4,
|
||||
}
|
||||
#assert(size_of(ksceUsbdIsochPswLen) == 2)
|
||||
|
||||
ksceUsbdIsochTransfer :: struct {
|
||||
buffer_base: rawptr,
|
||||
relative_start_frame: c.int32_t,
|
||||
num_packets: c.int32_t,
|
||||
packets: [8]ksceUsbdIsochPswLen,
|
||||
}
|
||||
|
||||
ksceUsbdDoneCallback :: #type ^proc "c" (result: c.int32_t, count: c.int32_t, arg: rawptr)
|
||||
ksceUsbdIsochDoneCallback :: #type ^proc "c" (result: c.int32_t, req: ^ksceUsbdIsochTransfer, arg: rawptr)
|
||||
|
||||
// OHCI/EHCI completion codes
|
||||
OHCI_CC_NO_ERROR :: 0x0
|
||||
OHCI_CC_CRC :: 0x1
|
||||
OHCI_CC_BIT_STUFFING :: 0x2
|
||||
OHCI_CC_DATA_TOGGLE_MISMATCH :: 0x3
|
||||
OHCI_CC_STALL :: 0x4
|
||||
OHCI_CC_DEVICE_NOT_RESPONDING :: 0x5
|
||||
OHCI_CC_PID_CHECK_FAILURE :: 0x6
|
||||
OHCI_CC_UNEXPECTED_PID :: 0x7
|
||||
OHCI_CC_DATA_OVERRUN :: 0x8
|
||||
OHCI_CC_DATA_UNDERRUN :: 0x9
|
||||
OHCI_CC_BUFFER_OVERRUN :: 0xc
|
||||
OHCI_CC_BUFFER_UNDERRUN :: 0xd
|
||||
OHCI_CC_NOT_ACCESSED1 :: 0xe
|
||||
OHCI_CC_NOT_ACCESSED2 :: 0xf
|
||||
EHCI_CC_MISSED_MICRO_FRAME :: 0x10
|
||||
EHCI_CC_XACT :: 0x20
|
||||
EHCI_CC_BABBLE :: 0x30
|
||||
EHCI_CC_DATABUF :: 0x40
|
||||
EHCI_CC_HALTED :: 0x50
|
||||
|
||||
// Isochronous transfer(PSW) completion codes
|
||||
USBD_CC_NOERR :: 0x0
|
||||
USBD_CC_MISSED_MICRO_FRAME :: 0x1
|
||||
USBD_CC_XACTERR :: 0x2
|
||||
USBD_CC_BABBLE :: 0x4
|
||||
USBD_CC_DATABUF :: 0x8
|
||||
|
||||
|
||||
Reference in New Issue
Block a user