tpd_button.c 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. #include "tpd.h"
  2. /* #ifdef TPD_HAVE_BUTTON */
  3. /* static int tpd_keys[TPD_KEY_COUNT] = TPD_KEYS; */
  4. /* static int tpd_keys_dim[TPD_KEY_COUNT][4] = TPD_KEYS_DIM; */
  5. static unsigned int tpd_keycnt;
  6. static int tpd_keys[TPD_VIRTUAL_KEY_MAX] = { 0 };
  7. static int tpd_keys_dim[TPD_VIRTUAL_KEY_MAX][4]; /* = {0}; */
  8. static ssize_t mtk_virtual_keys_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf)
  9. {
  10. int i, j;
  11. for (i = 0, j = 0; i < tpd_keycnt; i++)
  12. j += sprintf(buf, "%s%s:%d:%d:%d:%d:%d%s", buf,
  13. __stringify(EV_KEY), tpd_keys[i],
  14. tpd_keys_dim[i][0], tpd_keys_dim[i][1],
  15. tpd_keys_dim[i][2], tpd_keys_dim[i][3], (i == tpd_keycnt - 1 ? "\n" : ":"));
  16. return j;
  17. }
  18. static struct kobj_attribute mtk_virtual_keys_attr = {
  19. .attr = {
  20. .name = "virtualkeys.mtk-tpd",
  21. .mode = S_IRUGO,
  22. },
  23. .show = &mtk_virtual_keys_show,
  24. };
  25. static struct attribute *mtk_properties_attrs[] = {
  26. &mtk_virtual_keys_attr.attr,
  27. NULL
  28. };
  29. static struct attribute_group mtk_properties_attr_group = {
  30. .attrs = mtk_properties_attrs,
  31. };
  32. struct kobject *properties_kobj;
  33. void tpd_button_init(void)
  34. {
  35. int ret = 0, i = 0;
  36. #if 0
  37. for (i = 0; i < TPD_VIRTUAL_KEY_MAX; i++) {
  38. for (j = 0; j < 4; j++)
  39. tpd_keys_dim[i][j] = 0;
  40. }
  41. #endif
  42. /* if((tpd->kpd=input_allocate_device())==NULL) return -ENOMEM; */
  43. tpd->kpd = input_allocate_device();
  44. /* struct input_dev kpd initialization and registration */
  45. tpd->kpd->name = TPD_DEVICE "-kpd";
  46. set_bit(EV_KEY, tpd->kpd->evbit);
  47. /* set_bit(EV_REL, tpd->kpd->evbit); */
  48. /* set_bit(EV_ABS, tpd->kpd->evbit); */
  49. for (i = 0; i < tpd_keycnt; i++)
  50. __set_bit(tpd_keys[i], tpd->kpd->keybit);
  51. tpd->kpd->id.bustype = BUS_HOST;
  52. tpd->kpd->id.vendor = 0x0001;
  53. tpd->kpd->id.product = 0x0001;
  54. tpd->kpd->id.version = 0x0100;
  55. if (input_register_device(tpd->kpd))
  56. TPD_DMESG("input_register_device failed.(kpd)\n");
  57. set_bit(EV_KEY, tpd->dev->evbit);
  58. for (i = 0; i < tpd_keycnt; i++)
  59. __set_bit(tpd_keys[i], tpd->dev->keybit);
  60. properties_kobj = kobject_create_and_add("board_properties", NULL);
  61. if (properties_kobj)
  62. ret = sysfs_create_group(properties_kobj, &mtk_properties_attr_group);
  63. if (!properties_kobj || ret)
  64. TPD_DEBUG("failed to create board_properties\n");
  65. }
  66. void tpd_button(unsigned int x, unsigned int y, unsigned int down)
  67. {
  68. int i;
  69. if (down) {
  70. for (i = 0; i < tpd_keycnt; i++) {
  71. if (x >= tpd_keys_dim[i][0] - (tpd_keys_dim[i][2] / 2) &&
  72. x <= tpd_keys_dim[i][0] + (tpd_keys_dim[i][2] / 2) &&
  73. y >= tpd_keys_dim[i][1] - (tpd_keys_dim[i][3] / 2) &&
  74. y <= tpd_keys_dim[i][1] + (tpd_keys_dim[i][3] / 2) && !(tpd->btn_state & (1 << i))) {
  75. input_report_key(tpd->kpd, tpd_keys[i], 1);
  76. input_sync(tpd->kpd);
  77. tpd->btn_state |= (1 << i);
  78. TPD_DEBUG("[mtk-tpd] press key %d (%d)\n", i, tpd_keys[i]);
  79. }
  80. }
  81. } else {
  82. for (i = 0; i < tpd_keycnt; i++) {
  83. if (tpd->btn_state & (1 << i)) {
  84. input_report_key(tpd->kpd, tpd_keys[i], 0);
  85. input_sync(tpd->kpd);
  86. TPD_DEBUG("[mtk-tpd] release key %d (%d)\n", i, tpd_keys[i]);
  87. }
  88. }
  89. tpd->btn_state = 0;
  90. }
  91. }
  92. void tpd_button_setting(int keycnt, void *keys, void *keys_dim)
  93. {
  94. tpd_keycnt = keycnt;
  95. memcpy(tpd_keys, keys, keycnt * 4);
  96. memcpy(tpd_keys_dim, keys_dim, keycnt * 4 * 4);
  97. }
  98. /* #endif */