Advertisement
SDL2

decompress SYSkey via C

Jul 15th, 2020
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.19 KB | None | 0 0
  1. #include "drivers/bus/qspi.h"
  2.  
  3. #define CS_LOW(self) mp_hal_pin_write(self->cs, 0)
  4. #define CS_HIGH(self) mp_hal_pin_write(self->cs, 1)
  5.  
  6. #ifdef MICROPY_HW_SOFTQSPI_SCK_LOW
  7.  
  8. // Use externally provided functions for SCK control and IO reading
  9. #define SCK_LOW(self) MICROPY_HW_SOFTQSPI_SCK_LOW(self)
  10. #define SCK_HIGH(self) MICROPY_HW_SOFTQSPI_SCK_HIGH(self)
  11. #define NIBBLE_READ(self) MICROPY_HW_SOFTQSPI_NIBBLE_READ(self)
  12.  
  13. #else
  14.  
  15. // Use generic pin functions for SCK control and IO reading
  16. #define SCK_LOW(self) mp_hal_pin_write(self->clk, 0)
  17. #define SCK_HIGH(self) mp_hal_pin_write(self->clk, 1)
  18. #define NIBBLE_READ(self) ( \
  19.     mp_hal_pin_read(self->io0) \
  20.     | (mp_hal_pin_read(self->io1) << 1) \
  21.     | (mp_hal_pin_read(self->io2) << 2) \
  22.     | (mp_hal_pin_read(self->io3) << 3))
  23.  
  24. #endif
  25.  
  26. STATIC void nibble_write(mp_soft_qspi_obj_t *self, uint8_t v) {
  27.     mp_hal_pin_write(self->io0, v & 1);
  28.     mp_hal_pin_write(self->io1, (v >> 1) & 1);
  29.     mp_hal_pin_write(self->io2, (v >> 2) & 1);
  30.     mp_hal_pin_write(self->io3, (v >> 3) & 1);
  31. }
  32.  
  33. STATIC int mp_soft_qspi_ioctl(void *self_in, uint32_t cmd) {
  34.     mp_soft_qspi_obj_t *self = (mp_soft_qspi_obj_t*)self_in;
  35.  
  36.     switch (cmd) {
  37.         case MP_QSPI_IOCTL_INIT:
  38.             mp_hal_pin_high(self->cs);
  39.             mp_hal_pin_output(self->cs);
  40.  
  41.             // Configure pins
  42.             mp_hal_pin_write(self->clk, 0);
  43.             mp_hal_pin_output(self->clk);
  44.             //mp_hal_pin_write(self->clk, 1);
  45.             mp_hal_pin_output(self->io0);
  46.             mp_hal_pin_input(self->io1);
  47.             mp_hal_pin_write(self->io2, 1);
  48.             mp_hal_pin_output(self->io2);
  49.             mp_hal_pin_write(self->io3, 1);
  50.             mp_hal_pin_output(self->io3);
  51.             break;
  52.     }
  53.  
  54.     return 0; // success
  55. }
  56.  
  57. STATIC void mp_soft_qspi_transfer(mp_soft_qspi_obj_t *self, size_t len, const uint8_t *src, uint8_t *dest) {
  58.     // Will run as fast as possible, limited only by CPU speed and GPIO time
  59.     mp_hal_pin_input(self->io1);
  60.     mp_hal_pin_output(self->io0);
  61.     if (self->io3) {
  62.         mp_hal_pin_write(self->io2, 1);
  63.         mp_hal_pin_output(self->io2);
  64.         mp_hal_pin_write(self->io3, 1);
  65.         mp_hal_pin_output(self->io3);
  66.     }
  67.     if (src) {
  68.         for (size_t i = 0; i < len; ++i) {
  69.             uint8_t data_out = src[i];
  70.             uint8_t data_in = 0;
  71.             for (int j = 0; j < 8; ++j, data_out <<= 1) {
  72.                 mp_hal_pin_write(self->io0, (data_out >> 7) & 1);
  73.                 mp_hal_pin_write(self->clk, 1);
  74.                 data_in = (data_in << 1) | mp_hal_pin_read(self->io1);
  75.                 mp_hal_pin_write(self->clk, 0);
  76.             }
  77.             if (dest != NULL) {
  78.                 dest[i] = data_in;
  79.             }
  80.         }
  81.     } else {
  82.         for (size_t i = 0; i < len; ++i) {
  83.             uint8_t data_in = 0;
  84.             for (int j = 0; j < 8; ++j) {
  85.                 mp_hal_pin_write(self->clk, 1);
  86.                 data_in = (data_in << 1) | mp_hal_pin_read(self->io1);
  87.                 mp_hal_pin_write(self->clk, 0);
  88.             }
  89.             if (dest != NULL) {
  90.                 dest[i] = data_in;
  91.             }
  92.         }
  93.     }
  94. }
  95.  
  96. STATIC void mp_soft_qspi_qread(mp_soft_qspi_obj_t *self, size_t len, uint8_t *buf) {
  97.     // Make all IO lines input
  98.     mp_hal_pin_input(self->io2);
  99.     mp_hal_pin_input(self->io3);
  100.     mp_hal_pin_input(self->io0);
  101.     mp_hal_pin_input(self->io1);
  102.  
  103.     // Will run as fast as possible, limited only by CPU speed and GPIO time
  104.     while (len--) {
  105.         SCK_HIGH(self);
  106.         uint8_t data_in = NIBBLE_READ(self);
  107.         SCK_LOW(self);
  108.         SCK_HIGH(self);
  109.         *buf++ = (data_in << 4) | NIBBLE_READ(self);
  110.         SCK_LOW(self);
  111.     }
  112. }
  113.  
  114. STATIC void mp_soft_qspi_qwrite(mp_soft_qspi_obj_t *self, size_t len, const uint8_t *buf) {
  115.     // Make all IO lines output
  116.     mp_hal_pin_output(self->io2);
  117.     mp_hal_pin_output(self->io3);
  118.     mp_hal_pin_output(self->io0);
  119.     mp_hal_pin_output(self->io1);
  120.  
  121.     // Will run as fast as possible, limited only by CPU speed and GPIO time
  122.     for (size_t i = 0; i < len; ++i) {
  123.         nibble_write(self, buf[i] >> 4);
  124.         SCK_HIGH(self);
  125.         SCK_LOW(self);
  126.  
  127.         nibble_write(self, buf[i]);
  128.         SCK_HIGH(self);
  129.         SCK_LOW(self);
  130.     }
  131.  
  132.     //mp_hal_pin_input(self->io1);
  133. }
  134.  
  135. STATIC void mp_soft_qspi_write_cmd_data(void *self_in, uint8_t cmd, size_t len, uint32_t data) {
  136.     mp_soft_qspi_obj_t *self = (mp_soft_qspi_obj_t*)self_in;
  137.     uint32_t cmd_buf = cmd | data << 8;
  138.     CS_LOW(self);
  139.     mp_soft_qspi_transfer(self, 1 + len, (uint8_t*)&cmd_buf, NULL);
  140.     CS_HIGH(self);
  141. }
  142.  
  143. STATIC void mp_soft_qspi_write_cmd_addr_data(void *self_in, uint8_t cmd, uint32_t addr, size_t len, const uint8_t *src) {
  144.     mp_soft_qspi_obj_t *self = (mp_soft_qspi_obj_t*)self_in;
  145.     uint8_t cmd_buf[5] = {cmd};
  146.     uint8_t addr_len = mp_spi_set_addr_buff(&cmd_buf[1], addr);
  147.     CS_LOW(self);
  148.     mp_soft_qspi_transfer(self, addr_len + 1, cmd_buf, NULL);
  149.     mp_soft_qspi_transfer(self, len, src, NULL);
  150.     CS_HIGH(self);
  151. }
  152.  
  153. STATIC uint32_t mp_soft_qspi_read_cmd(void *self_in, uint8_t cmd, size_t len) {
  154.     mp_soft_qspi_obj_t *self = (mp_soft_qspi_obj_t*)self_in;
  155.     uint32_t cmd_buf = cmd;
  156.     CS_LOW(self);
  157.     mp_soft_qspi_transfer(self, 1 + len, (uint8_t*)&cmd_buf, (uint8_t*)&cmd_buf);
  158.     CS_HIGH(self);
  159.     return cmd_buf >> 8;
  160. }
  161.  
  162. STATIC void mp_soft_qspi_read_cmd_qaddr_qdata(void *self_in, uint8_t cmd, uint32_t addr, size_t len, uint8_t *dest) {
  163.     mp_soft_qspi_obj_t *self = (mp_soft_qspi_obj_t*)self_in;
  164.     uint8_t cmd_buf[7] = {cmd};
  165.     uint8_t addr_len = mp_spi_set_addr_buff(&cmd_buf[1], addr);
  166.     CS_LOW(self);
  167.     mp_soft_qspi_transfer(self, 1, cmd_buf, NULL);
  168.     mp_soft_qspi_qwrite(self, addr_len + 3, &cmd_buf[1]); // 3/4 addr bytes, 1 extra byte (0), 2 dummy bytes (4 dummy cycles)
  169.     mp_soft_qspi_qread(self, len, dest);
  170.     CS_HIGH(self);
  171. }
  172.  
  173. const mp_qspi_proto_t mp_soft_qspi_proto = {
  174.     .ioctl = mp_soft_qspi_ioctl,
  175.     .write_cmd_data = mp_soft_qspi_write_cmd_data,
  176.     .write_cmd_addr_data = mp_soft_qspi_write_cmd_addr_data,
  177.     .read_cmd = mp_soft_qspi_read_cmd,
  178.     .read_cmd_qaddr_qdata = mp_soft_qspi_read_cmd_qaddr_qdata,
  179. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement