// File: /workspace/github_cpp_makefile_star2_O3/goodix[P]gdix_hid_firmware_update/gtx8/gtx8.cpp
// Function: GTx8Device::SetBasicProperties()
int GTx8Device::SetBasicProperties()
{
	int ret;
	unsigned char fw_info[72] = {0};
	m_firmwareVersionMajor = 20;
	m_firmwareVersionMinor = 20;
	m_sensorID = 0xF;
	unsigned char cfg_ver = 0;
	int retry = 10;
	unsigned char chksum;

	if (!m_deviceOpen) {
		gdix_err("Please open device first\n");
		return -1;
	}
	do {
		ret = Read(CFG_START_ADDR, &cfg_ver, 1);
		if (ret < 0) {
			gdix_dbg("Failed read cfg VERSION, retry=%d\n", retry);
			continue;
		}
		gdix_dbg("cfg ver:%d\n", cfg_ver);
		ret = Read(VER_ADDR, fw_info, sizeof(fw_info));
		if (ret < 0)
			gdix_dbg("Failed read VERSION, retry=%d\n", retry);
		else
			break;
	} while (--retry);
	gdix_dbg("Fw_info array\n");
	gdix_dbg("0x%02x,0x%02x,0x%02x,0x%02x,0x%02x\n", fw_info[0], fw_info[1],
			 fw_info[2], fw_info[3], fw_info[4]);
	gdix_dbg("0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,0x%02x\n", fw_info[5],
			 fw_info[6], fw_info[7], fw_info[8], fw_info[9], fw_info[10]);
	gdix_dbg("0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,0x%02x\n", fw_info[11],
			 fw_info[12], fw_info[13], fw_info[14], fw_info[15], fw_info[16]);
	gdix_dbg("0x%02x,0x%02x,0x%02x,0x%02x,0x%02x\n", fw_info[17], fw_info[18],
			 fw_info[19], fw_info[20], fw_info[21]);
	if (!retry)
		return -1;

	/*check fw version*/
	chksum = ChecksumU8(fw_info, sizeof(fw_info));
	if (chksum) {
		gdix_err("fw version check sum error:%d\n", chksum);
		return -2;
	}

	memcpy(m_pid, &fw_info[9], 4);
	m_pid[4] = '\0';
	gdix_dbg("pid:%s\n", m_pid);
	m_sensorID = fw_info[21] & 0x0f;
	gdix_dbg("sensorID:%d\n", m_sensorID);

	m_firmwareVersionMajor = fw_info[18];
	m_firmwareVersionMinor =
		((fw_info[19] << 16) | (fw_info[20]) << 8) | cfg_ver;

	gdix_dbg("version:0x%x,0x%x\n", m_firmwareVersionMajor,
			 m_firmwareVersionMinor);

	return 0;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x58, %rsp
xorps %xmm0, %xmm0
movaps %xmm0, 0x40(%rsp)
movaps %xmm0, 0x30(%rsp)
movaps %xmm0, 0x20(%rsp)
movaps %xmm0, 0x10(%rsp)
movq $0x0, 0x50(%rsp)
movabsq $0x1400000014, %rax     # imm = 0x1400000014
movq %rax, 0x10(%rdi)
movl $0xf, 0x18(%rdi)
movb $0x0, 0xf(%rsp)
cmpb $0x1, 0x8(%rdi)
jne 0xe7b0
movq %rdi, %rbx
movl $0xa, %ebp
leaq 0xf(%rsp), %r14
leaq 0x12bab(%rip), %r13     # 0x21291
leaq 0x856c(%rip), %r12      # 0x16c59
leaq 0x10(%rsp), %r15
movq (%rbx), %rax
movq %rbx, %rdi
movl $0x60dc, %esi           # imm = 0x60DC
movq %r14, %rdx
movl $0x1, %ecx
callq *0x20(%rax)
movb (%r13), %cl
testl %eax, %eax
js 0xe778
testb %cl, %cl
je 0xe73a
movq 0x1289d(%rip), %rax     # 0x20fb8
movq (%rax), %rdi
movzbl 0xf(%rsp), %r8d
leaq 0x85d8(%rip), %rsi      # 0x16d03
movq %r12, %rdx
movl $0x30, %ecx
xorl %eax, %eax
callq 0x5180
movq (%rbx), %rax
movq %rbx, %rdi
movl $0x452c, %esi           # imm = 0x452C
movq %r15, %rdx
movl $0x48, %ecx
callq *0x20(%rax)
movb (%r13), %cl
testl %eax, %eax
jns 0xe7cf
testb $0x1, %cl
je 0xe79f
movq 0x12854(%rip), %rax     # 0x20fb8
movq (%rax), %rdi
leaq 0x85b2(%rip), %rsi      # 0x16d20
movq %r12, %rdx
movl $0x33, %ecx
jmp 0xe795
testb %cl, %cl
je 0xe79f
movq 0x12835(%rip), %rax     # 0x20fb8
movq (%rax), %rdi
leaq 0x8542(%rip), %rsi      # 0x16ccf
movq %r12, %rdx
movl $0x2d, %ecx
movl %ebp, %r8d
xorl %eax, %eax
callq 0x5180
decl %ebp
jne 0xe6f2
movb (%r13), %cl
movb $0x1, %r14b
jmp 0xe7d2
leaq 0x12ada(%rip), %rax     # 0x21291
movl $0xffffffff, %ebp       # imm = 0xFFFFFFFF
cmpb $0x1, (%rax)
jne 0xea76
callq 0x5bc6
jmp 0xea76
xorl %r14d, %r14d
testb $0x1, %cl
je 0xe7ff
movq 0x127da(%rip), %rax     # 0x20fb8
movq (%rax), %rdi
leaq 0x8568(%rip), %rsi      # 0x16d50
leaq 0x846a(%rip), %rdx      # 0x16c59
movl $0x37, %ecx
xorl %eax, %eax
callq 0x5180
movb (%r13), %cl
testb $0x1, %cl
je 0xe858
movq 0x127ad(%rip), %rax     # 0x20fb8
movq (%rax), %rdi
movzbl 0x10(%rsp), %r8d
movzbl 0x11(%rsp), %r9d
movzbl 0x12(%rsp), %r10d
movzbl 0x13(%rsp), %r11d
movzbl 0x14(%rsp), %r15d
subq $0x8, %rsp
leaq 0x8539(%rip), %rsi      # 0x16d70
leaq 0x841b(%rip), %rdx      # 0x16c59
movl $0x39, %ecx
xorl %eax, %eax
pushq %r15
pushq %r11
pushq %r10
callq 0x5180
addq $0x20, %rsp
movb (%r13), %cl
testb $0x1, %cl
je 0xe8b5
movq 0x12754(%rip), %rax     # 0x20fb8
movq (%rax), %rdi
movzbl 0x15(%rsp), %r8d
movzbl 0x16(%rsp), %r9d
movzbl 0x17(%rsp), %r10d
movzbl 0x18(%rsp), %r11d
movzbl 0x19(%rsp), %r15d
movzbl 0x1a(%rsp), %r12d
leaq 0x8513(%rip), %rsi      # 0x16da5
leaq 0x83c0(%rip), %rdx      # 0x16c59
movl $0x3b, %ecx
xorl %eax, %eax
pushq %r12
pushq %r15
pushq %r11
pushq %r10
callq 0x5180
addq $0x20, %rsp
movb (%r13), %cl
testb $0x1, %cl
je 0xe912
movq 0x126f7(%rip), %rax     # 0x20fb8
movq (%rax), %rdi
movzbl 0x1b(%rsp), %r8d
movzbl 0x1c(%rsp), %r9d
movzbl 0x1d(%rsp), %r10d
movzbl 0x1e(%rsp), %r11d
movzbl 0x1f(%rsp), %r15d
movzbl 0x20(%rsp), %r12d
leaq 0x84b6(%rip), %rsi      # 0x16da5
leaq 0x8363(%rip), %rdx      # 0x16c59
movl $0x3d, %ecx
xorl %eax, %eax
pushq %r12
pushq %r15
pushq %r11
pushq %r10
callq 0x5180
addq $0x20, %rsp
movb (%r13), %cl
testb $0x1, %cl
je 0xe967
movq 0x1269a(%rip), %rax     # 0x20fb8
movq (%rax), %rdi
movzbl 0x21(%rsp), %r8d
movzbl 0x22(%rsp), %r9d
movzbl 0x23(%rsp), %r10d
movzbl 0x24(%rsp), %r11d
movzbl 0x25(%rsp), %r15d
subq $0x8, %rsp
leaq 0x8426(%rip), %rsi      # 0x16d70
leaq 0x8308(%rip), %rdx      # 0x16c59
movl $0x3f, %ecx
xorl %eax, %eax
pushq %r15
pushq %r11
pushq %r10
callq 0x5180
addq $0x20, %rsp
movl $0xffffffff, %ebp       # imm = 0xFFFFFFFF
testb %r14b, %r14b
jne 0xea76
leaq 0x10(%rsp), %rsi
movq %rbx, %rdi
movl $0x48, %edx
callq 0xdb8a
testb %al, %al
je 0xe9a8
movl $0xfffffffe, %ebp       # imm = 0xFFFFFFFE
cmpb $0x1, (%r13)
jne 0xea76
movzbl %al, %edi
callq 0x5be8
jmp 0xea76
movl 0x19(%rsp), %eax
movl %eax, 0x1c(%rbx)
movb $0x0, 0x20(%rbx)
movb (%r13), %al
cmpb $0x1, %al
jne 0xe9e7
leaq 0x1c(%rbx), %r8
movq 0x125f2(%rip), %rax     # 0x20fb8
movq (%rax), %rdi
leaq 0x8449(%rip), %rsi      # 0x16e19
leaq 0x8282(%rip), %rdx      # 0x16c59
movl $0x4c, %ecx
xorl %eax, %eax
callq 0x5180
movb (%r13), %al
movzbl 0x25(%rsp), %r8d
andl $0xf, %r8d
movl %r8d, 0x18(%rbx)
testb $0x1, %al
je 0xea21
movq 0x125b8(%rip), %rax     # 0x20fb8
movq (%rax), %rdi
leaq 0x8428(%rip), %rsi      # 0x16e32
leaq 0x8248(%rip), %rdx      # 0x16c59
movl $0x4e, %ecx
xorl %eax, %eax
callq 0x5180
movb (%r13), %al
movzbl 0x22(%rsp), %r8d
movl %r8d, 0x10(%rbx)
movzbl 0x23(%rsp), %ecx
shll $0x10, %ecx
movzbl 0x24(%rsp), %edx
shll $0x8, %edx
orl %ecx, %edx
movzbl 0xf(%rsp), %r9d
orl %edx, %r9d
movl %r9d, 0x14(%rbx)
xorl %ebp, %ebp
testb $0x1, %al
je 0xea76
movq 0x12561(%rip), %rax     # 0x20fb8
movq (%rax), %rdi
leaq 0x83ef(%rip), %rsi      # 0x16e50
leaq 0x81f1(%rip), %rdx      # 0x16c59
xorl %ebp, %ebp
movl $0x55, %ecx
xorl %eax, %eax
callq 0x5180
movl %ebp, %eax
addq $0x58, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
nop