Advertisement
xerpi

Linux 3DS SPI functions

Jul 16th, 2016
283
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.41 KB | None | 0 0
  1. static int spi_write_2(struct spi_device *spi,
  2.                u8 *tx_buf0, u8 tx_len0,
  3.                u8 *tx_buf1, u8 tx_len1)
  4. {
  5.     struct spi_message msg;
  6.     struct spi_transfer xfers[2];
  7.  
  8.     memset(xfers, 0, sizeof(xfers));
  9.  
  10.     xfers[0].tx_buf = tx_buf0;
  11.     xfers[0].len = tx_len0;
  12.  
  13.     xfers[1].tx_buf = tx_buf1;
  14.     xfers[1].len = tx_len1;
  15.  
  16.     spi_message_init(&msg);
  17.     spi_message_add_tail(&xfers[0], &msg);
  18.     spi_message_add_tail(&xfers[1], &msg);
  19.  
  20.     return spi_sync(spi, &msg);
  21. }
  22.  
  23. static int spi_write_read(struct spi_device *spi,
  24.               u8 *tx_buf, u8 tx_len,
  25.               u8 *rx_buf, u8 rx_len)
  26. {
  27.     struct spi_message msg;
  28.     struct spi_transfer xfers[2];
  29.  
  30.     memset(xfers, 0, sizeof(xfers));
  31.  
  32.     xfers[0].tx_buf = tx_buf;
  33.     xfers[0].len = tx_len;
  34.  
  35.     xfers[1].rx_buf = rx_buf;
  36.     xfers[1].len = rx_len;
  37.  
  38.     spi_message_init(&msg);
  39.  
  40.     spi_message_add_tail(&xfers[0], &msg);
  41.     spi_message_add_tail(&xfers[1], &msg);
  42.  
  43.     return spi_sync(spi, &msg);
  44. }
  45.  
  46. static void spi_reg_select(struct spi_device *spi, u8 reg)
  47. {
  48.     u8 buffer1[4];
  49.     u8 buffer2[0x40];
  50.  
  51.     buffer1[0] = 0;
  52.     buffer2[0] = reg;
  53.  
  54.     spi_write_2(spi, buffer1, 1, buffer2, 1);
  55. }
  56.  
  57. static u8 spi_reg_read_offset(struct spi_device *spi, u8 offset)
  58. {
  59.     u8 buffer_wr[8];
  60.     u8 buffer_rd[0x40];
  61.  
  62.     buffer_wr[0] = 1 | (offset << 1);
  63.  
  64.     spi_write_read(spi, buffer_wr, 1, buffer_rd, 1);
  65.  
  66.     return buffer_rd[0];
  67. }
  68.  
  69. static void spi_reg_write_offset(struct spi_device *spi, u8 reg, u8 val)
  70. {
  71.     u8 buffer1[8];
  72.     u8 buffer2[0x40];
  73.  
  74.     buffer1[0] = (reg << 1); // Write
  75.     buffer2[0] = val;
  76.  
  77.     spi_write_2(spi, buffer1, 1, buffer2, 1);
  78. }
  79.  
  80. static void spi_reg_read_buffer(struct spi_device *spi,
  81.                    u8 offset, void *buffer, u8 size)
  82. {
  83.     u8 buffer_wr[0x10];
  84.  
  85.     buffer_wr[0] = 1 | (offset << 1);
  86.  
  87.     spi_write_read(spi, buffer_wr, 1, buffer, size);
  88. }
  89.  
  90. static void spi_reg_write_buffer(struct spi_device *spi, u8 reg, void *buffer, u8 size)
  91. {
  92.     uint8_t buffer_reg[8];
  93.  
  94.     buffer_reg[0] = reg << 1;
  95.  
  96.     spi_write_2(spi, buffer_reg, 1, buffer, size);
  97. }
  98.  
  99. static void spi_reg_mask_offset(struct spi_device *spi, u8 offset, u8 mask0, u8 mask1)
  100. {
  101.     u8 buffer1[4];
  102.     u8 buffer2[0x40];
  103.  
  104.     buffer1[0] = 1 | (offset << 1);
  105.  
  106.     spi_write_read(spi, buffer1, 1, buffer2, 1);
  107.  
  108.     buffer1[0] = offset << 1;
  109.     buffer2[0] = (buffer2[0] & ~mask1) | (mask0 & mask1);
  110.  
  111.     spi_write_2(spi, buffer1, 1, buffer2, 1);
  112. }
  113.  
  114. static void spi_codec_hid_initialize(struct spi_device *spi)
  115. {
  116.     spi_reg_select(spi, 0x67);
  117.     spi_reg_write_offset(spi, 0x24, 0x98);
  118.     spi_reg_select(spi, 0x67);
  119.     spi_reg_write_offset(spi, 0x26, 0x00);
  120.     spi_reg_select(spi, 0x67);
  121.     spi_reg_write_offset(spi, 0x25, 0x43);
  122.     spi_reg_select(spi, 0x67);
  123.     spi_reg_write_offset(spi, 0x24, 0x18);
  124.     spi_reg_select(spi, 0x67);
  125.     spi_reg_write_offset(spi, 0x17, 0x43);
  126.     spi_reg_select(spi, 0x67);
  127.     spi_reg_write_offset(spi, 0x19, 0x69);
  128.     spi_reg_select(spi, 0x67);
  129.     spi_reg_write_offset(spi, 0x1B, 0x80);
  130.     spi_reg_select(spi, 0x67);
  131.     spi_reg_write_offset(spi, 0x27, 0x11);
  132.     spi_reg_select(spi, 0x67);
  133.     spi_reg_write_offset(spi, 0x26, 0xEC);
  134.     spi_reg_select(spi, 0x67);
  135.     spi_reg_write_offset(spi, 0x24, 0x18);
  136.     spi_reg_select(spi, 0x67);
  137.     spi_reg_write_offset(spi, 0x25, 0x53);
  138. }
  139.  
  140. static void spi_codec_ts_initialize(struct spi_device *spi)
  141. {
  142.     spi_reg_select(spi, 0x67);
  143.     spi_reg_mask_offset(spi, 0x26, 0x80, 0x80);
  144.     spi_reg_select(spi, 0x67);
  145.     spi_reg_mask_offset(spi, 0x24, 0x00, 0x80);
  146.     spi_reg_select(spi, 0x67);
  147.     spi_reg_mask_offset(spi, 0x25, 0x10, 0x3C);
  148. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement