hdmi_dbg.c 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. /* ---------------------------------------------------------------------
  2. Command Format:
  3. 1. R/W I2C
  4. iw[dev_id,1][addr_len,1][addr,3][data_len,1],[data,x]
  5. ir[dev_id,1][addr_len,1][addr,3][data_len,1]
  6. 2. R/W I2C via GPIO (One byte addr/data I2C R/W)
  7. gir[dev_id,1][addr_len,1][addr,addr_led/write function of I2C via GPIO to I2C driver.
  8. giw[dev_id,1][addr_len,1][addr,addr_len][data_len,1][data,data_len] where addr_len < = 4 and data_len < = 4
  9. 3. R/W GPIO
  10. gr[gpio_idx,1]
  11. gw[gpio_idx,1][gpio_h/l,1]
  12. 4. hdmi auto debug
  13. hdmi_auto_debug[timer(unit:10ms),1 byte(Hex)][Error Free Count,1 byte(Hex)][Error Count,1 byte(Hex)]
  14. --------------------------------------------------------------------- */
  15. #include "drv_types.h"
  16. #include "hdmi.h"
  17. #include "hdmi_hw.h"
  18. #include "cec.h"
  19. #include "gpioi2c.h"
  20. #include <linux/vmalloc.h> // drv_vmalloc() drv_vfree()
  21. #ifdef CONFIG_SUPPORT_DEBUG_MESSAGE
  22. #define dbg(fmt,args...) printk(KERN_EMERG fmt, ## args)
  23. static void print_usage(void)
  24. {
  25. dbg("1. R/W GPIO\n");
  26. dbg(" gw[gpio_idx][high/low]\n");
  27. dbg(" gr[gpio_idx]\n");
  28. dbg("\n");
  29. dbg("2. R/W I2C Master\n");
  30. dbg(" imw[dev_id,1][addr_len,1][addr,3][data_len,1],[data,x]\n");
  31. dbg(" imr[dev_id,1][addr_len,1][addr,3][data_len,1]\n");
  32. dbg("\n");
  33. dbg("3. R/W I2C Slave\n");
  34. dbg(" isw[dev_id,1][addr_len,1][addr,3][data_len,1],[data,x]\n");
  35. dbg(" isr[dev_id,1][addr_len,1][addr,3][data_len,1]\n");
  36. dbg("\n");
  37. dbg("4. R/W I2C via GPIO\n");
  38. dbg(" igw[dev_id,1][addr_len,1][addr,3][deta_len,1][data,x]\n");
  39. dbg(" igr[dev_id,1][addr_len,1][addr,3][data_len,1]\n");
  40. dbg("\n\n");
  41. }
  42. static UINT8 StrToByte(const INT8 *buf)
  43. {
  44. UINT8 byte = 0, i = 0;
  45. for (i = 0; i < 2; i++)
  46. {
  47. byte = byte << 4;
  48. if (buf[i] >= '0' && buf[i] <= '9')
  49. {
  50. byte += (buf[i] - '0');
  51. }
  52. else if (buf[i] >= 'a' && buf[i] <= 'f')
  53. {
  54. byte += (buf[i] - 'a' + 10);
  55. }
  56. else if (buf[i] >= 'A' && buf[i] <= 'F')
  57. {
  58. byte += (buf[i] - 'A' + 10);
  59. }
  60. }
  61. return byte;
  62. }
  63. static void StrToBuf(const INT8 *str, UINT8 *buf, UINT32 buf_sz)
  64. {
  65. UINT32 i = 0;
  66. for (i = 0; i < buf_sz; i++)
  67. {
  68. buf[i] = StrToByte(str + i * 2);
  69. }
  70. }
  71. static void dump(const UINT8 *ptr, INT32 size)
  72. {
  73. INT32 i, n;
  74. INT8 str[3 * 0x10 + 8];
  75. for (n = 0, i = 0; i < size; i++)
  76. {
  77. if (n >= 0)
  78. {
  79. n += sprintf(&str[n], "%02x ", ptr[i]);
  80. }
  81. if (n >= 3 * 0x10 || i + 1 == size)
  82. {
  83. n = 0;
  84. dbg("%s\n", str);
  85. }
  86. }
  87. }
  88. static void gpio_write_handler(const INT8 *buf, size_t size)
  89. {
  90. UINT8 idx, val;
  91. idx = StrToByte(buf + 0);
  92. val = StrToByte(buf + 2);
  93. hdmi_gpio_write(idx, val);
  94. dbg("Write gpio pin 0x%02x to 0x%02x\n", idx, val);
  95. }
  96. static void gpio_read_handler(const INT8 *buf, size_t size)
  97. {
  98. UINT8 idx, val;
  99. idx = StrToByte(buf + 0);
  100. val = hdmi_gpio_read(idx);
  101. dbg("Read gpio pin 0x%02x to 0x%02x\n", idx, val);
  102. }
  103. static void i2c_write_handler(UINT8 i2c_mode, const INT8 *buf, size_t size)
  104. {
  105. // imw[dev_id,1][addr_len,1][addr,3][data_len,1]
  106. // isw[dev_id,1][addr_len,1][addr,3][data_len,1]
  107. UINT8 device_id, addr_len;
  108. UINT32 addr;
  109. UINT8 data_sz;
  110. UINT8 *data_ptr;
  111. UINT8 status;
  112. if (size < 12)
  113. {
  114. return;
  115. }
  116. device_id = StrToByte(buf + 0);
  117. addr_len = StrToByte(buf + 2);
  118. addr = (addr_len << 24);
  119. addr |= (StrToByte(buf + 4) << 16);
  120. addr |= (StrToByte(buf + 6) << 8);
  121. addr |= (StrToByte(buf + 8) << 0);
  122. data_sz = StrToByte(buf + 10);
  123. data_ptr = NULL;
  124. if (size < (UINT32)(data_sz + 12))
  125. {
  126. return;
  127. }
  128. data_ptr = drv_vmalloc(data_sz, MODULEID_HDMI);
  129. if (data_ptr == NULL)
  130. {
  131. return;
  132. }
  133. StrToBuf(buf + 12, data_ptr, data_sz);
  134. hdmi_i2c_setup(i2c_mode, device_id, addr_len);
  135. status = hdmi_i2c_write(addr, data_ptr, data_sz);
  136. dbg("i2c write device 0x%02x addr 0x%08x 0x%02x bytes %s\n",
  137. device_id, addr & 0xffffff, data_sz, (status == 0) ? "ok" : "fail");
  138. dump(data_ptr, data_sz);
  139. if (data_ptr)
  140. {
  141. drv_vfree(data_ptr, MODULEID_HDMI);
  142. }
  143. }
  144. static void i2c_read_handler(UINT8 i2c_mode, const INT8 *buf, size_t size)
  145. {
  146. // imr[dev_id,1][addr_len,1][addr,3][data_len,1]
  147. // isr[dev_id,1][addr_len,1][addr,3][data_len,1]
  148. UINT8 device_id, addr_len;
  149. UINT32 addr;
  150. UINT8 data_sz;
  151. UINT8 *data_ptr;
  152. UINT8 status;
  153. if (size < 12)
  154. {
  155. return;
  156. }
  157. device_id = StrToByte(buf + 0);
  158. addr_len = StrToByte(buf + 2);
  159. addr = (addr_len << 24);
  160. addr |= (StrToByte(buf + 4) << 16);
  161. addr |= (StrToByte(buf + 6) << 8);
  162. addr |= (StrToByte(buf + 8) << 0);
  163. data_sz = StrToByte(buf + 10);
  164. data_ptr = drv_vmalloc(data_sz, MODULEID_HDMI);
  165. if (data_ptr == NULL)
  166. {
  167. return;
  168. }
  169. hdmi_i2c_setup(i2c_mode, device_id, addr_len);
  170. status = hdmi_i2c_read(addr, data_ptr, data_sz);
  171. dbg("i2c read device 0x%02x addr 0x%08x 0x%02x bytes %s\n",
  172. device_id, addr & 0xffffff, data_sz, (status == 0) ? "ok" : "fail");
  173. dump(data_ptr, data_sz);
  174. if (data_ptr)
  175. {
  176. drv_vfree(data_ptr, MODULEID_HDMI);
  177. }
  178. }
  179. void hdmi_dbg_Handler(const INT8 *buf, size_t size)
  180. {
  181. UINT8 cmd, cmd1, cmd2;
  182. UINT8 i2c_mode = 0;
  183. if (size <= 3)
  184. {
  185. print_usage();
  186. return;
  187. }
  188. cmd = buf[0];
  189. cmd1 = buf[1];
  190. cmd2 = buf[2];
  191. if (cmd1 == 'm' || cmd1 == 'M')
  192. {
  193. i2c_mode = USE_HW_I2C_MASTER;
  194. }
  195. else if (cmd1 == 's' || cmd1 == 'S')
  196. {
  197. i2c_mode = USE_HW_I2C_SLAVE;
  198. }
  199. else if (cmd1 == 'g' || cmd1 == 'G')
  200. {
  201. i2c_mode = USE_I2C_VIA_GPIO;
  202. }
  203. if (cmd == 'i' || cmd == 'I')
  204. {
  205. if (cmd2 == 'r' || cmd2 == 'R')
  206. {
  207. i2c_read_handler(i2c_mode, buf + 3, size - 3);
  208. }
  209. else if (cmd2 == 'w' || cmd2 == 'W')
  210. {
  211. i2c_write_handler(i2c_mode, buf + 3, size - 3);
  212. }
  213. }
  214. else if (cmd == 'g' || cmd == 'G')
  215. {
  216. if (cmd1 == 'r' || cmd1 == 'R')
  217. {
  218. gpio_read_handler(buf + 2, size - 2);
  219. }
  220. else if (cmd1 == 'w' || cmd1 == 'W')
  221. {
  222. gpio_write_handler(buf + 2, size - 2);
  223. }
  224. }
  225. else if (cmd == 'd' || cmd == 'D')
  226. {
  227. //auto_debug_handler(buf+1, size-1);
  228. }
  229. else
  230. {
  231. print_usage();
  232. }
  233. }
  234. #endif