SYD9557M.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. #include "app_config.h"
  2. #include "SYD9557M.h"
  3. #include "asm/gpio.h"
  4. #include "timer.h"
  5. #include "event.h"
  6. #include "asm/power_interface.h"
  7. #if TCFG_TOUCHPAD_ENABLE
  8. #if 0
  9. #define iic_init(iic) hw_iic_init(iic)
  10. #define iic_uninit(iic) hw_iic_uninit(iic)
  11. #define iic_start(iic) hw_iic_start(iic)
  12. #define iic_stop(iic) hw_iic_stop(iic)
  13. #define iic_tx_byte(iic, byte) hw_iic_tx_byte(iic, byte)
  14. #define iic_rx_byte(iic, ack) hw_iic_rx_byte(iic, ack)
  15. #define iic_read_buf(iic, buf, len) hw_iic_read_buf(iic, buf, len)
  16. #define iic_write_buf(iic, buf, len) hw_iic_write_buf(iic, buf, len)
  17. #define iic_suspend(iic) hw_iic_suspend(iic)
  18. #define iic_resume(iic) hw_iic_resume(iic)
  19. #else
  20. #define iic_init(iic) soft_iic_init(iic)
  21. #define iic_uninit(iic) soft_iic_uninit(iic)
  22. #define iic_start(iic) soft_iic_start(iic)
  23. #define iic_stop(iic) soft_iic_stop(iic)
  24. #define iic_tx_byte(iic, byte) soft_iic_tx_byte(iic, byte)
  25. #define iic_rx_byte(iic, ack) soft_iic_rx_byte(iic, ack)
  26. #define iic_read_buf(iic, buf, len) soft_iic_read_buf(iic, buf, len)
  27. #define iic_write_buf(iic, buf, len) soft_iic_write_buf(iic, buf, len)
  28. #define iic_suspend(iic) soft_iic_suspend(iic)
  29. #define iic_resume(iic) soft_iic_resume(iic)
  30. #endif
  31. #define INT_IO IO_PORTB_04
  32. #define SYD9557M_READ_ADDR 0x49
  33. #define SYD9557M_WRITE_ADDR 0x48
  34. static u8 iic_hdl = 0;
  35. u8 syd9557m_get_ndata(u8 r_chip_id, u8 *buf, u8 data_len)
  36. {
  37. u8 read_len = 0;
  38. iic_start(iic_hdl);
  39. if (0 == iic_tx_byte(iic_hdl, SYD9557M_WRITE_ADDR)) {
  40. log_e("\n gsen iic rd err 0\n");
  41. read_len = 0;
  42. goto __gdend;
  43. }
  44. delay(50);
  45. if (0 == iic_tx_byte(iic_hdl, 0x01)) {
  46. log_e("\n gsen iic rd err 2\n");
  47. read_len = 0;
  48. goto __gdend;
  49. }
  50. delay(50);
  51. iic_start(iic_hdl);
  52. if (0 == iic_tx_byte(iic_hdl, SYD9557M_READ_ADDR)) {
  53. log_e("\n gsen iic rd err 3\n");
  54. read_len = 0;
  55. goto __gdend;
  56. }
  57. for (; data_len > 1; data_len--) {
  58. *buf++ = iic_rx_byte(iic_hdl, 1);
  59. read_len ++;
  60. }
  61. *buf = iic_rx_byte(iic_hdl, 0);
  62. read_len ++;
  63. __gdend:
  64. iic_stop(iic_hdl);
  65. delay(50);
  66. return read_len;
  67. }
  68. void syd9557_timer_hdl(void *arg)
  69. {
  70. u8 i = 0;
  71. u8 data[5] = {0};
  72. struct sys_event e;
  73. if (gpio_read(INT_IO) == 0) {
  74. syd9557m_get_ndata(SYD9557M_READ_ADDR, data, 5);
  75. //put_buf(data, 5);
  76. memset(&e, 0x0, sizeof(e));
  77. e.type = SYS_TOUCHPAD_EVENT;
  78. if (data[0] != TOUCHPAD_NO_GESTURE && data[0] < TOUCHPAD_MAX_GESTURE) { //手势事件优先
  79. e.u.touchpad.gesture_event = data[0];
  80. }
  81. e.u.touchpad.x = data[2];
  82. e.u.touchpad.y = data[3];
  83. sys_event_notify(&e);
  84. }
  85. }
  86. void syd9557m_init(u8 iic)
  87. {
  88. int i = 0;
  89. iic_hdl = iic;
  90. iic_init(iic);
  91. gpio_set_direction(INT_IO, 1);
  92. gpio_set_die(INT_IO, 1);
  93. gpio_set_pull_up(INT_IO, 1);
  94. gpio_set_pull_down(INT_IO, 0);
  95. sys_s_hi_timer_add(NULL, syd9557_timer_hdl, 2);
  96. lvd_extern_wakeup_enable(); //要根据封装来选择是否可以使用LVD唤醒, 6531C这个封装LVD是PB4
  97. }
  98. #endif