Implement Partner CTR StartCaptureDma

This commit is contained in:
Lorenzooone
2026-01-11 02:24:49 +01:00
parent 7b8b17a0e4
commit a536d05629
2 changed files with 147 additions and 8 deletions

View File

@@ -22,8 +22,7 @@ int GetNumCyPartnerCTRDeviceDesc(void);
const cypart_device_usb_device* GetCyPartnerCTRDeviceDesc(int index);
const cy_device_usb_device* get_cy_usb_info(const cypart_device_usb_device* usb_device_desc);
std::string read_serial_ctr_capture(cy_device_device_handlers* handlers, const cypart_device_usb_device* device);
int capture_init(cy_device_device_handlers* handlers, const cypart_device_usb_device* device, std::string &serial);
int capture_start(cy_device_device_handlers* handlers, const cypart_device_usb_device* device);
int capture_start(cy_device_device_handlers* handlers, const cypart_device_usb_device* device, std::string &serial);
int StartCaptureDma(cy_device_device_handlers* handlers, const cypart_device_usb_device* device);
int capture_end(cy_device_device_handlers* handlers, const cypart_device_usb_device* device);
int ReadFrame(cy_device_device_handlers* handlers, uint8_t* buf, int length, const cypart_device_usb_device* device_desc);

View File

@@ -299,7 +299,7 @@ static int capture_start_first_unknown_write_and_read_0x1000_0x1002(cy_device_de
}
// Various unknown reads and writes from registers...
int capture_init(cy_device_device_handlers* handlers, const cypart_device_usb_device* device, std::string &serial) {
int capture_start(cy_device_device_handlers* handlers, const cypart_device_usb_device* device, std::string &serial) {
int ret = 0;
uint32_t status = 0;
uint32_t unk32 = 0;
@@ -310,6 +310,8 @@ int capture_init(cy_device_device_handlers* handlers, const cypart_device_usb_de
if(ret < 0)
return ret;
default_sleep(30);
serial = read_serial_ctr_capture(handlers, device);
ret = read_fw_info_partner_ctr(handlers, device, 0, unk32);
@@ -398,12 +400,150 @@ int capture_init(cy_device_device_handlers* handlers, const cypart_device_usb_de
return 0;
}
int capture_start(cy_device_device_handlers* handlers, const cypart_device_usb_device* device) {
return 0;
}
int StartCaptureDma(cy_device_device_handlers* handlers, const cypart_device_usb_device* device) {
int ret = 0;
uint32_t status = 0;
uint32_t unk32 = 0;
uint16_t unk16 = 0;
uint8_t buffer_in[16];
// Stop capture, if one already ongoing...
ret = write_u32_to_address_partner_ctr(handlers, device, 0xF0000010, 0x80000000);
if(ret < 0)
return ret;
default_sleep(30);
ret = write_u32_to_address_partner_ctr(handlers, device, 0xF0000010, 0x00000004);
if(ret < 0)
return ret;
ret = write_u32_to_address_partner_ctr(handlers, device, 0xF0000010, 0x00000008);
if(ret < 0)
return ret;
ret = read_u32_from_address_partner_ctr(handlers, device, 0xF8002010, unk32);
if(ret < 0)
return ret;
ret = read_u32_from_address_partner_ctr(handlers, device, 0xF8002010, unk32);
if(ret < 0)
return ret;
ret = read_u32_from_address_partner_ctr(handlers, device, 0xF800200C, unk32);
if(ret < 0)
return ret;
default_sleep(50);
ret = read_u32_from_address_partner_ctr(handlers, device, 0xF800200C, unk32);
if(ret < 0)
return ret;
default_sleep(180);
ret = write_u16_to_address_partner_ctr(handlers, device, 0xF8002004, 0x0000);
if(ret < 0)
return ret;
ret = write_u16_to_address_partner_ctr(handlers, device, 0xF8002004, 0x0001);
if(ret < 0)
return ret;
ret = read_u32_from_address_partner_ctr(handlers, device, 0xF800200C, unk32);
if(ret < 0)
return ret;
ret = read_u64_plus_from_address_partner_ctr(handlers, device, 0x01F00000, buffer_in, 16);
if(ret < 0)
return ret;
ret = write_u16_to_address_partner_ctr(handlers, device, 0xF8002004, 0x0000);
if(ret < 0)
return ret;
ret = read_partner_ctr_status(handlers, device, status);
if(ret < 0)
return ret;
// Act based on status...?
ret = write_u32_to_address_partner_ctr(handlers, device, 0xF0000010, 0x00000008);
if(ret < 0)
return ret;
ret = write_u16_to_address_partner_ctr(handlers, device, 0xF8002005, 0x0000);
if(ret < 0)
return ret;
ret = write_u16_to_address_partner_ctr(handlers, device, 0xF8002005, 0x0000);
if(ret < 0)
return ret;
ret = read_u32_from_address_partner_ctr(handlers, device, 0xF8002010, unk32);
if(ret < 0)
return ret;
ret = read_u32_from_address_partner_ctr(handlers, device, 0xF8002010, unk32);
if(ret < 0)
return ret;
ret = read_u32_from_address_partner_ctr(handlers, device, 0xF800200C, unk32);
if(ret < 0)
return ret;
default_sleep(50);
ret = read_u32_from_address_partner_ctr(handlers, device, 0xF800200C, unk32);
if(ret < 0)
return ret;
ret = write_u16_to_address_partner_ctr(handlers, device, 0xF8002004, 0x0078);
if(ret < 0)
return ret;
ret = write_u16_to_address_partner_ctr(handlers, device, 0xF8002004, 0x007A);
if(ret < 0)
return ret;
default_sleep(12);
ret = write_u16_to_address_partner_ctr(handlers, device, 0xF8002004, 0x7778);
if(ret < 0)
return ret;
default_sleep(70);
ret = write_u16_to_address_partner_ctr(handlers, device, 0xF8002004, 0x0078);
if(ret < 0)
return ret;
ret = write_u16_to_address_partner_ctr(handlers, device, 0xF8002004, 0x0079);
if(ret < 0)
return ret;
ret = read_u32_from_address_partner_ctr(handlers, device, 0xF800200C, unk32);
if(ret < 0)
return ret;
ret = read_u64_plus_from_address_partner_ctr(handlers, device, 0x02800000, buffer_in, 16);
if(ret < 0)
return ret;
ret = write_u16_to_address_partner_ctr(handlers, device, 0xF8002004, 0x0078);
if(ret < 0)
return ret;
ret = read_partner_ctr_status(handlers, device, status);
if(ret < 0)
return ret;
// Act based on status...?
ret = write_u32_to_address_partner_ctr(handlers, device, 0xF0000010, 0x00000008);
if(ret < 0)
return ret;
default_sleep(180);
return 0;
}