NCP81111_main.c 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  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. #include <unistd.h>
  8. /*
  9. i2c-scan -b 0
  10. */
  11. int main(int argc, char* argv[])
  12. {
  13. int fd;
  14. int i;
  15. int ret;
  16. int channel;
  17. uint8_t target_addr, start_addr = 2, end_addr = 254;
  18. int regVal, regAddr;
  19. i2c_arg_t i2c_arg;
  20. char devname[20] = "/dev/i2c1";
  21. char chr;
  22. if((argc != 1) && (argc != 3))
  23. {
  24. printf("ncp81111_cfg [regAddr] [regVal]\n");
  25. printf(" regAddr: decimal or hexadecimal start with '0x'\n");
  26. printf(" regVal: decimal or hexadecimal start with '0x'\n\n");
  27. printf("example:\n");
  28. printf(" ncp81111_cfg 51 32\n");
  29. printf(" = ncp81111_cfg 0x33 32 \n");
  30. printf(" = ncp81111_cfg 51 0x20\n");
  31. printf(" = ncp81111_cfg 0x33 0x20\n");
  32. }
  33. fd = open(devname, O_RDWR);
  34. i2c_arg.DevAddress = 0x50;
  35. if(argc == 3)
  36. {
  37. //Get RegAddr
  38. if((strncmp(argv[1], "0x", 2) == 0) || (strncmp(argv[1], "0X", 2) == 0))
  39. {
  40. if(strlen(argv[1]) > 4)
  41. {
  42. printf("Invalid Register Address %s\n", argv[1]);
  43. close(fd);
  44. return -1;
  45. }
  46. chr = argv[1][2];
  47. printf("chr2 = %c\n", chr);
  48. if((chr >= '0') && (chr <= '9'))
  49. {
  50. regAddr = chr - '0';
  51. }
  52. else if((chr >= 'a') && (chr <= 'f'))
  53. {
  54. regAddr = chr - 'a' + 10;
  55. }
  56. else if((chr >= 'A') && (chr <= 'F'))
  57. {
  58. regAddr = chr - 'A' + 10;
  59. }
  60. else
  61. {
  62. printf("Invalid Register Address %s\n", argv[1]);
  63. close(fd);
  64. return -1;
  65. }
  66. if(argv[1][3] != '\0')
  67. {
  68. chr = argv[1][3];
  69. printf("chr3 = %c\n", chr);
  70. regAddr <<= 4;
  71. if((chr >= '0') && (chr <= '9'))
  72. regAddr += chr - '0';
  73. else if((chr >= 'a') && (chr <= 'f'))
  74. regAddr += chr - 'a' + 10;
  75. else if((chr >= 'A') && (chr <= 'F'))
  76. regAddr += chr - 'A' + 10;
  77. else
  78. {
  79. printf("Invalid Register Address %s\n", argv[1]);
  80. close(fd);
  81. return -1;
  82. }
  83. }
  84. }
  85. else
  86. {
  87. regAddr = atoi(argv[1]);
  88. }
  89. //printf("---> RegAddr %#02x(%d) \n", regAddr, regAddr);
  90. //Get RegVal
  91. if((strncmp(argv[2], "0x", 2) == 0) || (strncmp(argv[2], "0X", 2) == 0))
  92. {
  93. if(strlen(argv[2]) > 4)
  94. {
  95. printf("Invalid Register Address %s\n", argv[2]);
  96. close(fd);
  97. return -1;
  98. }
  99. chr = argv[2][2];
  100. if((chr >= '0') && (chr <= '9'))
  101. regVal = chr - '0';
  102. else if((chr >= 'a') && (chr <= 'f'))
  103. regVal = chr - 'a' + 10;
  104. else if((chr >= 'A') && (chr <= 'F'))
  105. regVal = chr - 'A' + 10;
  106. else
  107. {
  108. printf("Invalid Register Address %s\n", argv[2]);
  109. close(fd);
  110. return -1;
  111. }
  112. if(argv[2][3] != '\0')
  113. {
  114. chr = argv[2][3];
  115. regVal <<= 4;
  116. if((chr >= '0') && (chr <= '9'))
  117. regVal += chr - '0';
  118. else if((chr >= 'a') && (chr <= 'f'))
  119. regVal += chr - 'a' + 10;
  120. else if((chr >= 'A') && (chr <= 'F'))
  121. regVal += chr - 'A' + 10;
  122. else
  123. {
  124. printf("Invalid Register Address %s\n", argv[2]);
  125. close(fd);
  126. return -1;
  127. }
  128. }
  129. }
  130. else
  131. {
  132. regVal = atoi(argv[2]);
  133. }
  134. //printf("---> RegVal %#02x(%d)\n", regVal, regVal);
  135. printf("write reg %#02x(%d), val %#02x(%d)\n", regAddr, regAddr, regVal, regVal);
  136. //Disable NCP81111
  137. i2c_arg.Buf[0] = 0x05; //Enter disable state
  138. i2c_arg.Buf[1] = 0x00;
  139. i2c_arg.WriteLen = 2;
  140. ret = ioctl(fd, I2C_MASTER_TRANSFER, &i2c_arg);
  141. if(ret == -1)
  142. {
  143. printf("---> Enter disable error\n");
  144. close(fd);
  145. return -1;
  146. }
  147. //Configurate user register
  148. i2c_arg.Buf[0] = 0x02; //write
  149. i2c_arg.Buf[1] = regAddr;
  150. i2c_arg.Buf[2] = regVal;
  151. i2c_arg.WriteLen = 3;
  152. ret = ioctl(fd, I2C_MASTER_TRANSFER, &i2c_arg);
  153. if(ret == -1)
  154. {
  155. printf("---> write error\n");
  156. close(fd);
  157. return -1;
  158. }
  159. //Save to NVM
  160. i2c_arg.Buf[0] = 0x04; //write NVM
  161. i2c_arg.WriteLen = 1;
  162. ret = ioctl(fd, I2C_MASTER_TRANSFER, &i2c_arg);
  163. if(ret == -1)
  164. {
  165. printf("---> write NVM error\n");
  166. close(fd);
  167. return -1;
  168. }
  169. //Enable NCP81111
  170. i2c_arg.Buf[0] = 0x05; //Enter operation state
  171. i2c_arg.Buf[1] = 0x09;
  172. i2c_arg.WriteLen = 2;
  173. ret = ioctl(fd, I2C_MASTER_TRANSFER, &i2c_arg);
  174. if(ret == -1)
  175. {
  176. printf("---> Enter operation error\n");
  177. close(fd);
  178. }
  179. sleep(1);
  180. }
  181. i2c_arg.Buf[0] = 0x01; //read
  182. i2c_arg.Buf[1] = 0x00; //register address
  183. i2c_arg.WriteLen = 2;
  184. i2c_arg.ReadLen = 110;
  185. ret = ioctl(fd, I2C_MASTER_TRANSFER_RECEIVE, &i2c_arg);
  186. if(ret == -1)
  187. {
  188. printf("---> read error!\n");
  189. close(fd);
  190. return -1;
  191. }
  192. else
  193. {
  194. printf("======= NCP81111 User Register Map ======= ");
  195. for(i=0;i<i2c_arg.ReadLen;i++)
  196. {
  197. if(i%16 == 0) printf("\n%03d: ", i);
  198. printf("%02x ", i2c_arg.Buf[i]);
  199. }
  200. }
  201. i2c_arg.Buf[0] = 0x01; //read
  202. i2c_arg.Buf[1] = 110; //register address
  203. i2c_arg.WriteLen = 2;
  204. i2c_arg.ReadLen = 110;
  205. ret = ioctl(fd, I2C_MASTER_TRANSFER_RECEIVE, &i2c_arg);
  206. if(ret == -1)
  207. {
  208. printf("---> read error!\n");
  209. close(fd);
  210. return -1;
  211. }
  212. else
  213. {
  214. for(i=0;i<i2c_arg.ReadLen;i++)
  215. {
  216. if((i+110)%16 == 0) printf("\n%03d: ", i+110);
  217. printf("%02x ", i2c_arg.Buf[i]);
  218. }
  219. printf("\n");
  220. }
  221. close(fd);
  222. return 0;
  223. }