added kernel libraries bindings and cleaned up todos

This commit is contained in:
2024-05-12 16:16:15 +02:00
parent e9824cbd95
commit 8a5e2870f6
68 changed files with 3278 additions and 92 deletions
+181
View File
@@ -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
View File
@@ -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