adc_test.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <sys/types.h>
  4. #include <sys/stat.h>
  5. #include <fcntl.h>
  6. #include <sys/mman.h>
  7. #include <unistd.h>
  8. #include <sys/ioctl.h>
  9. #include <string.h>
  10. #include "ftcfg.h"
  11. #include "ftypes.h"
  12. #include "utils.h"
  13. #include "ark1668ft.h"
  14. static u32* adcbase = NULL;
  15. static u32* sysbase = NULL;
  16. #define rADC_CTL *(volatile u32*)(adcbase+0x00/4)
  17. #define rADC_AUX0 *(volatile u32*)(adcbase+0x14/4)
  18. #define rADC_AUX1 *(volatile u32*)(adcbase+0x18/4)
  19. #define rADC_AUX2 *(volatile u32*)(adcbase+0x1c/4)
  20. #define rADC_AUX3 *(volatile u32*)(adcbase+0x20/4)
  21. #define rADC_PANXZ1 *(volatile u32*)(adcbase+0x24/4)
  22. #define rADC_PANYZ2 *(volatile u32*)(adcbase+0x28/4)
  23. #define rSYS_ANALOG_REG0 *(volatile u32*)(sysbase+0x140/4)
  24. void *adc_test_thread(void *arg)
  25. {
  26. struct ft_runtime *rt = (struct ft_runtime *)arg;
  27. u32 aux0val, aux1val, aux2val, aux3val;
  28. u32 panxval, panyval;
  29. int retry = 1;
  30. adcbase = map_phy_memory(0xe4500000, 0x1000, 1);
  31. if (!adcbase)
  32. goto err;
  33. sysbase = map_phy_memory(0xe4900000, 0x1000, 1);
  34. if (!sysbase) {
  35. unmap_phy_memory(adcbase, 0x1000);
  36. goto err;
  37. }
  38. /* select vref 3.3v */
  39. rSYS_ANALOG_REG0 &= ~(1 << 22);
  40. rADC_CTL = (1 << 13) | (1 << 3);
  41. usleep(100000);
  42. aux0val = rADC_AUX0;
  43. rADC_CTL = (1 << 14) | (1 << 4);
  44. usleep(100000);
  45. aux1val = rADC_AUX1;
  46. rADC_CTL = (1 << 15) | (1 << 5);
  47. usleep(100000);
  48. aux2val = rADC_AUX2;
  49. rADC_CTL = (1 << 16) | (1 << 6);
  50. usleep(100000);
  51. aux3val = rADC_AUX3;
  52. printf("aux %d, %d, %d, %d.\n", aux0val, aux1val, aux2val, aux3val);
  53. if (!((aux0val > aux1val) && (aux1val > aux2val) && (aux2val > aux3val)))
  54. goto err;
  55. gpio_export(PANX_GPIO);
  56. gpio_set_dir(PANX_GPIO, "out");
  57. gpio_export(PANY_GPIO);
  58. gpio_set_dir(PANY_GPIO, "out");
  59. rADC_CTL = (1 << 12) | (1 << 2);
  60. test:
  61. gpio_set_value(PANX_GPIO, 0);
  62. gpio_set_value(PANY_GPIO, 1);
  63. usleep(100000);
  64. if (retry)
  65. panyval = rADC_PANYZ2;
  66. else
  67. panxval = rADC_PANXZ1;
  68. gpio_set_value(PANX_GPIO, 1);
  69. gpio_set_value(PANY_GPIO, 0);
  70. usleep(100000);
  71. if (retry)
  72. panxval = rADC_PANXZ1;
  73. else
  74. panyval = rADC_PANYZ2;
  75. printf("pan %d, %d.\n", panxval, panyval);
  76. if (panxval > 0xd20 || panxval < 0xba0 || panyval > 0x990 || panyval < 0x810) {
  77. if (retry) {
  78. printf("switch gpio to test again.\n");
  79. retry = 0;
  80. goto test;
  81. } else {
  82. goto err;
  83. }
  84. }
  85. unmap_phy_memory(adcbase, 0x1000);
  86. rt->finish = 1;
  87. rt->pass = 1;
  88. return (void*)0;
  89. err:
  90. if (!adcbase)
  91. unmap_phy_memory(adcbase, 0x1000);
  92. if (!sysbase)
  93. unmap_phy_memory(sysbase, 0x1000);
  94. rt->finish = 1;
  95. return (void*)-1;
  96. }