Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //spi.bin RE by xerpi
- struct spi_msg_old {
- uint32_t baudrate; //0
- uint32_t buffer; //4 // buffer
- uint32_t size; //8 // size
- uint8_t device; //C // device
- };
- // sub_102290 spi.bin
- // SPI service 0x50040
- // SpiWriteDevice
- void spi_write_msg_old_ds(struct spi_msg_old *msg)
- {
- uint8_t *spi_data;
- uint8_t *spi_cnt;
- uint32_t device = msg->device;
- if (msg->device >= 3) { // CS
- device -= 3;
- spi_cnt = 0x1EC42000; // SPI_CNT0
- sign_ext16(r2);
- } else { //CC
- spi_cnt = 0x1EC60000; // spi_data
- }
- if (msg->device >= 3)
- spi_data = 0x1EC60002; // SPI_DATA0
- else
- spi_data = 0x1EC42002; // SPI_DATA1
- uint32_t foo = (device << 8) | (msg->baudrate & 0xFF);
- // Chipselect hold (keep selected), SPI bus enable
- *(uint16_t *)spi_cnt = (foo | 0x8800);
- int idx = 0; // buffer idx
- if (msg->size > 0) {
- do {
- *spi_data = msg->buffer[idx];
- while (*(uint16_t *)spi_cnt & 0x80)
- ;
- idx++;
- } while (idx <= msg->size);
- }
- // 1 byte left
- *(uint16_t *)spi_cnt = r4;
- *spi_data = msg->buffer[idx];
- while (*(uint16_t *)spi_cnt & 0x80)
- ;
- return;
- }
- // spi initialized?
- static u8 byte_105018[1] = {0};
- // Bus on/off
- static u8 byte_105019[3] = {0, 0, 0};
- // [0-5]:Device status, [6-11]: on/off?
- static u8 dword_10501C[4 * 3] = {0};
- static u8 dword_1050CC[9] = {0};
- // initializes spi global vars, reads PDN_SPI_CNT status
- void sub_1006F0()
- {
- if (byte_105018[0] != 0) {
- return;
- }
- byte_105018[0] = 1;
- int i;
- for (i = 0; i < 6; i++)
- dword_10501C[6 + i] = 0;
- r5 = dword_1050CC;
- r4 = 0;
- do {
- r0 = r4 + (r4 << 1); //0, 3, 6, 9..
- r0 = &dword_1050CC[r0 * 4];
- { //sub_101DE0();
- r4 = r0;
- sub_101A48(); // stores 1 to r0
- r0 = 0;
- *(uint32_t *)(r4 + 4) = r0;
- *(uint32_t *)(r4 + 8) = r0;
- }
- r4 = r4 + 1;
- } while (r4 < 3);
- r3 = *(uint16_t *)(0x1EC401C0);
- if (r3 & 1) {
- byte_105019[0] = 1;
- } else {
- byte_105019[0] = 0;
- }
- r3 = *(uint16_t *)(0x1EC401C0);
- r3 = r3 << 30;
- if (r3 < 0) {
- byte_105019[1] = 1;
- } else {
- byte_105019[1] = 0;
- }
- r2 = *(uint16_t *)(0x1EC401C0);
- r2 = r2 << 29;
- if (r2 < 0) {
- byte_105019[2] = 1;
- } else {
- byte_105019[2] = 0;
- }
- }
- // r0 = this??
- // r1 = device
- int SpiWriteDevice(int r0, int device, int r2, int r3)
- {
- if (r3 > 4) {
- // error
- r0 = 0xE0E03FFD;
- return;
- }
- STMFD SP!, {R4-R7,LR}
- uint8_t bus;
- if (device < 6) {
- if (device >= 0 && device <= 2) {
- bus = 0;
- } else if (device >= 3 && device <= 5) {
- bus = 1;
- }
- } else {
- bus = 2;
- }
- r5 = dword_1050CC;
- r6 = byte_105019 + 9;
- r12 = byte_105019 + 3;
- r0 = 0xC8A03FF8;
- r6 = *(int8_t *)(r6 + device);
- r12 = *(uint8_t *)(r12 + device);
- if (byte_105019[bus] == 0) {
- goto loc_101390;
- }
- *(uint8_t *)var_1C = r1;
- if (r6 == 0) {
- goto loc_101388;
- }
- r0 = r4 + (r4 << 1);
- *(uint32_t *)var_28 = r12;
- r4 = r5 + (r0 << 2);
- r0 = r4;
- *(uint64_t *)var_24 = [r2:r3];
- sub_101DA8();
- r0 = SP;
- spi_write_msg_new(r0);
- r0 = r4;
- sub_101D88();
- loc_101384:
- r0 = 0;
- loc_101388:
- sp += 14;
- LDMFD SP!, {R4-R7,PC}
- loc_101390:
- *(uint8_t *)var_1C = r1;
- if (r6 == 0) {
- goto loc_101388;
- }
- *(uint32_t *)var_28 = r12;
- r4 = r5 + (r0 << 2);
- r0 = r4;
- *(uint64_t *)var_24 = [r2:r3];
- sub_101DA8();
- r0 = SP;
- spi_write_msg_old_ds();
- r0 = r4;
- sub_101D88();
- goto loc_101384;
- }
- // r0 = this
- // r1 = device
- // r2 = on/off
- // r3 = status
- // SPI service 0x80040
- // sub_101428
- void SpiEnableSpiBus(int r0, int device, int onoff, int r3)
- {
- int bus;
- if (device >= 0 && device <= 2)
- bus = 0;
- else if (device >= 3 && device <= 5)
- bus = 1;
- else
- bus = 2;
- byte_105019[bus] = onoff;
- u16 old = *(uint16_t *)(0x1EC401C0); // PDN_SPI_CNT
- u16 new = 1 << bus;
- if (onoff == 0) {
- new = old & ~new;
- } else {
- new = old | new;
- }
- *(uint16_t *)(0x1EC401C0) = new;
- dword_10501C[device] = r3;
- return 0;
- }
- // SPI service 0x10040
- // sub_1012B4
- int SpiSetDeviceState(int r0, int device, int status, int r3)
- {
- dword_10501C[device] = status;
- dword_10501C[device + 6] = 1;
- return 0;
- }
- // SPI service 0x30440
- void sub_1014DC()
- {
- // TODO
- }
- // SPI service 0x90040
- // enables 3rd bus
- // sub_1014B8
- int SpiEnableTwlSpiBus(int r0, int onoff)
- {
- u16 data = *(uint16_t *)(0x101401C0);
- if (onoff == 0)
- data = data & ~0b100;
- else
- data = data | 0b100;
- *(uint16_t *)(0x101401C0) = data;
- return 0;
- }
- struct spi_msg_out {
- uint32_t baudrate; //0
- uint32_t buffer; //4 // buffer
- uint32_t size; //8 // size
- uint8_t device; //C // device
- };
- // sub_102340: spi.bin
- // SPI service 0x50040
- // SpiWriteDevice
- void spi_write_msg_new(struct spi_msg_out *msg)
- {
- uint8_t device_id = msg->device;
- uint32_t reg_cnt = 0x1EC60800; // SPI_NEW_CNT2
- if (device_id < 7) {
- if (device_id >= 3 && device_id <= 5) {
- reg_cnt = 0x1EC42800; // SPI_NEW_CNT0
- } else if (device_id == 6) {
- reg_cnt = 0x1EC43800; // SPI_NEW_CNT1
- }
- }
- uint32_t reg_fifo = 0x1EC6080C; // SPI_NEW_FIFO2
- if (device_id < 7) {
- if (device_id >= 3 && device_id <= 5) {
- reg_fifo = 0x1EC4280C; // SPI_NEW_FIFO0
- } else if (device_id == 6) {
- reg_fifo = 0x1EC4380C; // SPI_NEW_FIFO1
- }
- }
- uint32_t device_bits;
- if (device_id < 6) {
- if (device_id == 0 || device_id == 3) {
- device_bits = 0;
- } else if (device_id == 1 || device_id == 4) {
- device_bits = 0x40;
- } else if (device_id == 2 || device_id == 5) {
- device_bits = 0x80;
- }
- } else {
- device_bits = 0;
- }
- // while busy...
- while (*(uint32_t *)reg_cnt & 0x8000)
- ;
- *(uint32_t *)(reg_cnt + 8) = msg->size; // SPI_NEW_BLKLEN
- //0xA000 = xfer dir: out, enable = 1
- *(uint32_t *)reg_cnt = (msg->baudrate & 0xFF) | device_bits | 0xA000;
- if (msg->size > 0) {
- uint32_t count = 0;
- do {
- if ((count & 0x1F) == 0) {
- // SPI_NEW_STATUS, FIFO busy
- while (*(uint32_t *)(reg_cnt + 0x10) & 1)
- ;
- }
- uint32_t buffer_idx = count & ~0b11;
- count = count + 4;
- *(uint32_t *)reg_fifo = *(uint32_t *)(msg->buffer + buffer_idx);
- } while (count < msg->size);
- }
- // while busy...
- while (*(uint32_t *)reg_cnt & 0x8000)
- ;
- *(uint32_t *)(reg_cnt + 4) = 0; // SPI_NEW_???
- }
- struct spi_msg_inout {
- uint32_t e0; //0x00 baudrate?
- uint32_t out_buffer; //0x04
- uint32_t out_size; //0x08
- uint32_t in_buffer; //0x0C
- uint32_t in_size; //0x10
- uint8_t device; //0x14
- };
- //wtf is this shit?
- static void sub_101CD8(int r0, int r1)
- {
- r2 = r0 - 0x3477;
- if (r2 >= 0) {
- r2 = r1 - (r0 > r2);
- } else if (r2 < 0) {
- goto loc_101CEC;
- }
- SleepThread([r1:r0]); //ns
- loc_101CEC:
- r2 = 0x44A2FA85;
- r3 = lo(r0 * r2);
- r0 = hi(r0 * r2);
- r1 = lo(r1 * r2);
- r2 = hi(r1 * r2);
- r0 = r0 + r1;
- // Crappy delay
- while (r0 > 0)
- r0 -= 2;
- }
- // sub_1028A8
- // SPI Service: 0x60042
- // ReadWriteDeviceArray
- void spi_write_msg_inout_new(struct spi_msg_inout *msg)
- {
- uint8_t device_id = msg->device;
- uint32_t reg_cnt = 0x1EC60800; // SPI_NEW_CNT2
- if (device_id < 7) {
- if (device_id >= 3 && device_id <= 5) {
- reg_cnt = 0x1EC42800; // SPI_NEW_CNT0
- } else if (device_id == 6) {
- reg_cnt = 0x1EC43800; // SPI_NEW_CNT1
- }
- }
- uint32_t reg_fifo = 0x1EC6080C; // SPI_NEW_FIFO2
- if (device_id < 7) {
- if (device_id >= 3 && device_id <= 5) {
- reg_fifo = 0x1EC4280C; // SPI_NEW_FIFO0
- goto loc_102928;
- } else if (device_id == 6) {
- reg_fifo = 0x1EC4380C; // SPI_NEW_FIFO1
- }
- }
- uint8_t device_bits;
- if (device_id < 6) {
- if (device_id == 1 || device_id == 4) {
- device_bits = 0x40;
- } else if (device_id == 2 || device_id == 5) {
- device_bits = 0x80;
- } else {
- device_bits = 0;
- }
- } else {
- device_bits = 0;
- }
- // while busy...
- while (*(uint32_t *)reg_cnt & 0x8000)
- ;
- *(uint32_t *)(reg_cnt + 8) = msg->size; // SPI_NEW_BLKLEN
- uint32_t cnt_in_flags = (msg->e0 & 0xFF) | device_bits | 0x8000; //enable, in
- uint32_t cnt_out_flags = cnt_in_flags | 0x2000; //enable, out
- *(uint32_t *)reg_cnt = cnt_out_flags;
- r0 = msg->e0 & 0xFF;
- if (r0 < 6) {
- if (r0 == 0) {
- r7 = 0x83400;
- } else if (r0 == 1) {
- r7 = 0x41A00;
- } else if (r0 == 2) {
- r7 = 0x20D00;
- } else if (r0 == 3) {
- r7 = 0x10680;
- } else if (r0 == 4) {
- r7 = 0x8340;
- } else if (r0 == 5) {
- r7 = 0x41A0;
- } else {
- r7 = 0x83400;
- }
- } else {
- r7 = 0x83400;
- }
- r8 = 0;
- uint32_t out_count = 0;
- if (msg->out_size > 0) {
- do {
- if ((out_count & 0x1F) == 0) {
- // SPI_NEW_STATUS, FIFO busy
- while (*(uint32_t *)(reg_cnt + 0x10) & 1)
- ;
- }
- uint32_t buffer_idx = out_count & ~0b11;
- out_count = out_count + 4;
- *(uint32_t *)reg_fifo = *(uint32_t *)(msg->out_buffer + buffer_idx);
- } while (out_count < msg->out_size);
- }
- // while busy...
- while (*(uint32_t *)reg_cnt & 0x8000)
- ;
- *(uint32_t *)(reg_cnt + 8) = msg->in_size; // SPI_NEW_BLKLEN
- *(uint32_t *)reg_cnt = cnt_in_flags;
- uint32_t in_count = 0;
- if (msg->in_size > 0) {
- do {
- if ((in_count & 0x1F) == 0) {
- while (*(uint32_t *)(reg_cnt + 0x10) & 1) //SPI_NEW_STATUS, FIFO busy
- ;
- if (msg->in_size >= 0x40) {
- sub_101CD8(r7, r8);
- }
- }
- uint32_t buffer_idx = in_count & ~0b11;
- in_count = in_count + 4;
- *(uint32_t *)(msg->in_buffer + buffer_idx) = *(uint32_t *)reg_fifo;
- } while (in_count < msg->in_size);
- }
- // while busy...
- while (*(uint32_t *)reg_cnt & 0x8000)
- ;
- *(uint32_t *)(reg_cnt + 4) = 0;
- }
- struct spi_msg_out_2 {
- uint32_t baudrate; //0x00 baudrate?
- uint32_t buffer1; //0x04
- uint32_t size1; //0x08
- uint32_t buffer2; //0x0C
- uint32_t size2; //0x10
- uint8_t device; //0x14
- };
- // sub_102AF8
- // SPI service: 0x70042
- // ReadWriteDevice2Array
- void spi_write_msg_out_2_new(struct spi_msg_out_2 *msg)
- {
- uint8_t device_id = msg->device;
- uint32_t reg_cnt = 0x1EC60800; // SPI_NEW_CNT2
- if (device_id < 7) {
- if (device_id >= 3 && device_id <= 5) {
- reg_cnt = 0x1EC42800;
- } else if (device_id == 6) {
- reg_cnt = 0x1EC43800;
- }
- }
- uint32_t reg_fifo = 0x1EC6080C; // SPI_NEW_FIFO2
- if (device_id < 7) {
- if (device_id >= 3 && device_id <= 5) {
- reg_fifo = 0x1EC4280C;
- } else if (device_id == 6) {
- reg_fifo = 0x1EC4380C;
- }
- }
- uint8_t device_bits;
- if (device_id < 6) {
- if (device_id == 0 || device_id == 3) {
- device_bits = 0;
- } else if (device_id == 1 || device_id == 4) {
- device_bits = 0x40;
- } else if (device_id == 2 || device_id == 5) {
- device_bits = 0x80;
- }
- } else {
- device_bits = 0;
- }
- while (*(uint32_t *)reg_cnt & 0x8000)
- ;
- uint32_t cnt_flags = (msg->baudrate & 0xFF) | device_bits | 0x8000;
- *(uint32_t *)(reg_cnt + 0x8) = msg->size1;
- *(uint32_t *)reg_cnt = cnt_flags | 0x2000;
- uint32_t count1 = 0;
- if (msg->size1 > 0) {
- do {
- if ((count1 & 0x1F) == 0) {
- while (*(uint32_t *)(reg_cnt + 0x10) & 1)
- ;
- }
- uint32_t buffer_idx = count1 & ~0b11;
- count1 = count1 + 4;
- *(uint32_t *)reg_fifo = *(uint32_t *)(msg->buffer1 + buffer_idx);
- } while (count1 < msg->size1);
- }
- while (*(uint32_t *)reg_cnt & 0x8000)
- ;
- *(uint32_t *)(reg_cnt + 0x8) = msg->size2;
- *(uint32_t *)reg_cnt = cnt_flags | 0x2000;
- uint32_t count2 = 0;
- if (msg->size2 > 0) {
- do {
- if ((count2 & 0x1F) == 0) {
- while (*(uint32_t *)(reg_cnt + 0x10) & 1)
- ;
- }
- uint32_t buffer_idx = count2 & ~3;
- count2 = count2 + 4;
- *(uint32_t *)reg_fifo = *(uint32_t *)(msg->buffer2 + buffer_idx);
- } while (count2 < msg->size2);
- }
- while (*(uint32_t *)reg_cnt & 0x8000)
- ;
- *(uint32_t *)(reg_cnt + 0x4) = 0;
- }
- /******** HID RE *********/
- // r0 = i2c handle pointer
- void sub_103EEC(int r0, int r1, int r2, int r3)
- {
- //Read Thread ID Privileged Read Write only Register
- asm("mrc p15, 0, r4, c13, c0, 3\n");
- //r4 = TLS
- // WriteRegister8 (u8 devid, u8 regid, u8 regdata)
- r1 = 0x500C0;
- *(uint32_t *)(r4 + 0x80) = r1;
- r1 = *(uint8_t *)(&var_14);
- *(uint8_t *)(r4 + 0x84) = r1; // devid
- r1 = *(uint8_t *)(&var_10);
- *(uint8_t *)(r4 + 0x88) = r1; // regid
- r1 = *(uint8_t *)(&var_C);
- *(uint8_t *)(r4 + 0x8C) = r1; // regdata
- // Handle i2c session
- r0 = *(uint32_t *)r0;
- // Result SendSyncRequest(Handle session)
- asm("svc 0x32\n");
- if (r0 >= 0) {
- r0 = *(uint32_t *)(r4 + 0x4);
- }
- return r0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement