i2ctool_main.c 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. #include <stdio.h>
  2. #include <stdint.h>
  3. #include "driver.h"
  4. #include "hal_interface_api.h"
  5. #include <fcntl.h>
  6. #include <string.h>
  7. void help()
  8. {
  9. printf("i2ctool <cmd>\n");
  10. printf(" --scan [channel]: scan i2c bus\n");
  11. printf(" --write [channel] -t [target address] -d [data...]: write i2c data.\n");
  12. }
  13. int str2uint8(char* str, uint8_t *value)
  14. {
  15. uint8_t val = 0;
  16. char chr;
  17. if(sizeof(str) > 2) //maybe hex
  18. {
  19. if((strncmp(str, "0x", 2) == 0) || (strncmp(str, "0X", 2) == 0))
  20. {
  21. if(strlen(str) > 4)
  22. {
  23. printf("Invalid hex %s\n", str);
  24. return -1;
  25. }
  26. chr = str[2];
  27. if((chr >= '0') && (chr <= '9'))
  28. {
  29. val = chr - '0';
  30. }
  31. else if((chr >= 'a') && (chr <= 'f'))
  32. {
  33. val = chr - 'a' + 10;
  34. }
  35. else if((chr >= 'A') && (chr <= 'F'))
  36. {
  37. val = chr - 'A' + 10;
  38. }
  39. else
  40. {
  41. printf("Invalid hex %s\n", str);
  42. return -1;
  43. }
  44. if(str[3] != '\0')
  45. {
  46. chr = str[3];
  47. val <<= 4;
  48. if((chr >= '0') && (chr <= '9'))
  49. val += chr - '0';
  50. else if((chr >= 'a') && (chr <= 'f'))
  51. val += chr - 'a' + 10;
  52. else if((chr >= 'A') && (chr <= 'F'))
  53. val += chr - 'A' + 10;
  54. else
  55. {
  56. printf("Invalid hex %s\n", str);
  57. return -1;
  58. }
  59. }
  60. }
  61. else //dec
  62. {
  63. val = atoi(str);
  64. }
  65. }
  66. else //dec
  67. {
  68. val = atoi(str);
  69. }
  70. *value = val;
  71. return 0;
  72. }
  73. int main(int argc, char* argv[])
  74. {
  75. int fd;
  76. int i;
  77. int ret;
  78. uint8_t buf[100];
  79. uint8_t channel;
  80. uint8_t target_addr, start_addr = 2, end_addr = 254;
  81. char devname[20] = {0};
  82. uint8_t val;
  83. if(argc < 3)
  84. {
  85. help();
  86. return -1;
  87. }
  88. if(strcmp(argv[1], "--scan") == 0)
  89. {
  90. //Get Channel
  91. if(str2uint8(argv[2], &channel) != 0)
  92. {
  93. printf("Get Channel failed %s\n", argv[2]);
  94. return -1;
  95. }
  96. sprintf(devname, "/dev/i2c%d", channel);
  97. printf("\n");
  98. printf("Find Slave I2C device:\n");
  99. for(i=start_addr;i<=end_addr;i+=2)
  100. {
  101. fd = open(devname, O_RDWR);
  102. ret = stm32_i2c_master_write(fd, i, buf, 0);
  103. if(ret == 0)
  104. {
  105. printf(" %#02x\n", i);
  106. }
  107. close(fd);
  108. }
  109. printf("\n");
  110. }
  111. else if(strcmp(argv[1], "--write") == 0)
  112. {
  113. //Get Channel
  114. if(str2uint8(argv[2], &channel) != 0)
  115. {
  116. printf("Get Channel failed %s\n", argv[2]);
  117. return -1;
  118. }
  119. sprintf(devname, "/dev/i2c%d", channel);
  120. //Get target address
  121. if((strcmp(argv[3], "-t") == 0) && (argc >= 5))
  122. {
  123. if(str2uint8(argv[4], &target_addr) != 0)
  124. {
  125. printf("Invalid target address %s\n", argv[4]);
  126. help();
  127. return -1;
  128. }
  129. if(target_addr & 0x01)
  130. {
  131. printf("target_addr must be write!\n");
  132. return -1;
  133. }
  134. }
  135. else
  136. {
  137. printf("Need -t \n");
  138. help();
  139. return -1;
  140. }
  141. //Get Datas
  142. if((strcmp(argv[5], "-d") == 0) && (argc >= 7))
  143. {
  144. for(i=0;i<argc-6;i++)
  145. {
  146. if(str2uint8(argv[i+6], &val) != 0)
  147. {
  148. printf("Invalid data[%d] = %s\n", i, argv[i+6]);
  149. return -1;
  150. }
  151. buf[i] = val;
  152. }
  153. }
  154. else
  155. {
  156. printf("Need -d\n");
  157. help();
  158. return -1;
  159. }
  160. printf("i2c_%d write %#02x: ", channel, target_addr);
  161. for(i=0;i<argc-6;i++)
  162. printf("%02x ", buf[i]);
  163. printf("\n");
  164. fd = open(devname, O_RDWR);
  165. ret = stm32_i2c_master_write(fd, target_addr, buf, argc-6);
  166. if(ret != 0)
  167. {
  168. printf("i2ctool write %#02x failed!\n", target_addr);
  169. }
  170. close(fd);
  171. }
  172. else
  173. {
  174. printf("Invalid param %s\n", argv[1]);
  175. help();
  176. return -1;
  177. }
  178. return 0;
  179. }