usb_manager.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384
  1. #include <stddef.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <errno.h>
  5. #include <stdint.h>
  6. #include <stdio.h>
  7. #include <hal_thread.h>
  8. #include <hal_timer.h>
  9. #include <hal_cfg.h>
  10. #include <init.h>
  11. #include <kapi.h>
  12. // #include <sunxi_drv_gpio.h>
  13. #include <hal_gpio.h>
  14. #include "usb_hw_scan.h"
  15. #include "usb_msg_center.h"
  16. #include "sunxi_usb_board.h"
  17. #include "usb_manager_common.h"
  18. static usb_cfg_t g_usb_cfg;
  19. static __u32 thread_run_flag = 1;
  20. static int thread_stopped_flag = 1;
  21. #ifdef CONFIG_KERNEL_FREERTOS
  22. int thread_suspend_flag = 0;
  23. #else
  24. int thread_suspend_flag = 1;
  25. static rt_err_t usb_manager_open(rt_device_t dev, rt_uint16_t oflag)
  26. {
  27. return 0;
  28. }
  29. static rt_err_t usb_manager_close(rt_device_t dev)
  30. {
  31. return 0;
  32. }
  33. static rt_err_t usb_manager_control(rt_device_t dev, int cmd, void *args)
  34. {
  35. #if 0
  36. switch (cmd)
  37. {
  38. case DEV_IOC_USR_HWSC_ENABLE_MONITOR:
  39. thread_suspend_flag = 0;
  40. break;
  41. case DEV_IOC_USR_HWSC_DISABLE_MONITOR:
  42. thread_suspend_flag = 1;
  43. break;
  44. default:
  45. return 0;
  46. }
  47. #endif
  48. return 0;
  49. }
  50. int usb_manager_dev_init(void)
  51. {
  52. int ret = -1;
  53. struct rt_device *device;
  54. device = rt_device_create(RT_Device_Class_Block, 0);
  55. if (!device)
  56. {
  57. printf("%s %d rt_device_create fail!\n", __func__,__LINE__);
  58. return ret;
  59. }
  60. device->user_data = NULL;
  61. device->open = usb_manager_open;
  62. device->close = usb_manager_close;
  63. device->control = usb_manager_control;
  64. ret = rt_device_register(device, "hwsc", RT_DEVICE_FLAG_RDWR);
  65. if (ret != 0)
  66. {
  67. printf("%s %d rt_device_register fail!\n", __func__,__LINE__);
  68. free(device);
  69. return ret;
  70. }
  71. return 0;
  72. }
  73. #endif
  74. static void usb_device_scan_thread(void *pArg)
  75. {
  76. while (thread_run_flag) {
  77. hal_msleep(100); /* 1s */
  78. if (thread_suspend_flag)
  79. continue;
  80. hw_insmod_usb_device();
  81. usb_msg_center(&g_usb_cfg);
  82. thread_run_flag = 0;
  83. }
  84. thread_stopped_flag = 1;
  85. return ;
  86. }
  87. static void usb_host_scan_thread(void *pArg)
  88. {
  89. while (thread_run_flag) {
  90. hal_msleep(100); /* 1s */
  91. if (thread_suspend_flag)
  92. continue;
  93. hw_insmod_usb_host();
  94. usb_msg_center(&g_usb_cfg);
  95. thread_run_flag = 0;
  96. }
  97. thread_stopped_flag = 1;
  98. return ;
  99. }
  100. static void usb_hardware_scan_thread(void *pArg)
  101. {
  102. usb_cfg_t *cfg = pArg;
  103. while (thread_run_flag)
  104. {
  105. hal_msleep(100); /* 1s */
  106. if (thread_suspend_flag)
  107. continue;
  108. usb_hw_scan(cfg);
  109. usb_msg_center(cfg);
  110. }
  111. thread_stopped_flag = 1;
  112. return ;
  113. }
  114. static irqreturn_t usb_id_irq(int irq, void *parg)
  115. {
  116. usb_cfg_t *cfg = parg;
  117. hal_msleep(100);
  118. /**
  119. * rmmod usb device/host driver first,
  120. * then insmod usb host/device driver.
  121. */
  122. usb_hw_scan(cfg);
  123. usb_msg_center(cfg);
  124. usb_hw_scan(cfg);
  125. usb_msg_center(cfg);
  126. return IRQ_HANDLED;
  127. }
  128. #if 0
  129. static int usb_register_id_irq(void *parg)
  130. {
  131. usb_cfg_t *cfg = parg;
  132. unsigned long irq_flags = 0;
  133. int ret = 0;
  134. int32_t Id_Irq = 0;
  135. /* delay for udc & hcd ready */
  136. hal_msleep(100);
  137. hw_rmmod_usb_host();
  138. hw_rmmod_usb_device();
  139. usb_msg_center(cfg);
  140. hw_insmod_usb_device();
  141. usb_msg_center(cfg);
  142. ret = drv_gpio_to_irq(cfg->port.id.gpio_set.gpio, &Id_Irq);
  143. if (ret < 0)
  144. {
  145. Usb_Manager_Err("gpio to irq error, error num: %d\n", ret);
  146. return -1;
  147. }
  148. irq_flags = IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING | IRQF_ONESHOT;
  149. ret = drv_gpio_irq_request(Id_Irq, usb_id_irq, irq_flags, NULL);
  150. if (ret < 0)
  151. {
  152. Usb_Manager_Err("request irq error, irq num:%lu error num: %d\n", Id_Irq, ret);
  153. return -1;
  154. }
  155. cfg->port.id_irq_num = Id_Irq;
  156. return 0;
  157. }
  158. #endif
  159. static __s32 usb_script_parse(usb_cfg_t *cfg)
  160. {
  161. int ret = -1, value = 0;
  162. user_gpio_set_t gpio_set = {0};
  163. /* usbc enable */
  164. ret = Hal_Cfg_GetKeyValue(SET_USB0, KEY_USB_ENABLE, (int32_t *)&value, 1);
  165. Usb_Manager_INFO("value:%d, ret:%d\n", value, ret);
  166. if (ret)
  167. {
  168. Usb_Manager_Err("script_parser_fetch %s %s fail \n", SET_USB0, KEY_USB_ENABLE);
  169. cfg->port.enable = 0;
  170. return -1;
  171. }
  172. cfg->port.enable = value;
  173. if (cfg->port.enable == 0)
  174. {
  175. Usb_Manager_INFO("%s not used!\n", SET_USB0);
  176. return -1;
  177. }
  178. /* usbc port type */
  179. ret = Hal_Cfg_GetKeyValue(SET_USB0, KEY_USB_PORT_TYPE, (int32_t *)&value, 1);
  180. Usb_Manager_INFO("port_type:%d, ret:%d\n", value, ret);
  181. if (ret)
  182. {
  183. Usb_Manager_Err("script_parser_fetch %s %s fail \n", SET_USB0, KEY_USB_PORT_TYPE);
  184. return -1;
  185. }
  186. cfg->port.port_type = value;
  187. if (cfg->port.port_type != USB_PORT_TYPE_OTG)
  188. {
  189. Usb_Manager_INFO("%s cfg->port.port_type:%d!\n", SET_USB0, cfg->port.port_type);
  190. return 0;
  191. }
  192. /* usbc det mode */
  193. ret = Hal_Cfg_GetKeyValue(SET_USB0, KEY_USB_DET_TYPE, (int32_t *)&value, 1);
  194. Usb_Manager_Debug("detect_type:%d, ret:%d\n", value, ret);
  195. if (ret)
  196. {
  197. Usb_Manager_Err("script_parser_fetch %s %s fail \n", SET_USB0, KEY_USB_DET_TYPE);
  198. return -1;
  199. }
  200. cfg->port.detect_type = value;
  201. if (cfg->port.detect_type == USB_DETECT_TYPE_VBUS_ID)
  202. {
  203. ret = Hal_Cfg_GetKeyValue(SET_USB0, KEY_USB_DET_MODE, (int32_t *)&value, 1);
  204. Usb_Manager_Debug("detect_mode:%d, ret:%d\n", value, ret);
  205. if (ret)
  206. {
  207. Usb_Manager_Err("script_parser_fetch %s %s fail \n", SET_USB0, KEY_USB_DET_MODE);
  208. return -1;
  209. }
  210. cfg->port.detect_mode = value;
  211. /* usbc id */
  212. /*get id gpio */
  213. memset(&gpio_set, 0x00, sizeof(gpio_set));
  214. ret = Hal_Cfg_GetKeyValue(SET_USB0, KEY_USB_ID_GPIO, (int32_t *)&gpio_set, sizeof(user_gpio_set_t) >> 2);
  215. Usb_Manager_Debug("get %s, ret:%d\n", KEY_USB_ID_GPIO, ret);
  216. if (ret)
  217. {
  218. Usb_Manager_Err("script_parser_fetch %s %s fail \n", SET_USB0, KEY_USB_ID_GPIO);
  219. return -1;
  220. }
  221. cfg->port.id.valid = 1;
  222. cfg->port.id.gpio_set.gpio = (gpio_set.port - 1) * 32 + gpio_set.port_num;
  223. cfg->port.id.gpio_set.mul_sel = gpio_set.mul_sel;
  224. cfg->port.id.gpio_set.pull = gpio_set.pull;
  225. cfg->port.id.gpio_set.drv_level = gpio_set.drv_level;
  226. cfg->port.drv_vbus.gpio_set.data = gpio_set.data;
  227. Usb_Manager_Debug("%s gpio %d\n", KEY_USB_ID_GPIO, cfg->port.id.gpio_set.gpio);
  228. /* usbc det_vbus */
  229. /*get det vbus gpio */
  230. memset(&gpio_set, 0x00, sizeof(gpio_set));
  231. ret = Hal_Cfg_GetKeyValue(SET_USB0, KEY_USB_DETVBUS_GPIO, (int32_t *)&gpio_set, sizeof(user_gpio_set_t) >> 2);
  232. Usb_Manager_Debug("get %s, ret:%d\n", KEY_USB_DETVBUS_GPIO, ret);
  233. if (ret)
  234. {
  235. Usb_Manager_Err("script_parser_fetch %s %s fail \n", SET_USB0, KEY_USB_DETVBUS_GPIO);
  236. return -1;
  237. }
  238. cfg->port.det_vbus.valid = 1;
  239. cfg->port.det_vbus.gpio_set.gpio = (gpio_set.port - 1) * 32 + gpio_set.port_num;
  240. cfg->port.det_vbus.gpio_set.mul_sel = gpio_set.mul_sel;
  241. cfg->port.det_vbus.gpio_set.pull = gpio_set.pull;
  242. cfg->port.det_vbus.gpio_set.drv_level = gpio_set.drv_level;
  243. cfg->port.drv_vbus.gpio_set.data = gpio_set.data;
  244. Usb_Manager_Debug("%s gpio %d\n", KEY_USB_DETVBUS_GPIO, cfg->port.det_vbus.gpio_set.gpio);
  245. memset(&gpio_set, 0x00, sizeof(gpio_set));
  246. ret = Hal_Cfg_GetKeyValue(SET_USB0, KEY_USB_DRVVBUS_GPIO, (int32_t *)&gpio_set, sizeof(user_gpio_set_t) >> 2);
  247. Usb_Manager_Debug("get %s, ret:%d\n", KEY_USB_DRVVBUS_GPIO, ret);
  248. if (ret)
  249. {
  250. Usb_Manager_Err("script_parser_fetch %s %s fail \n", SET_USB0, KEY_USB_DRVVBUS_GPIO);
  251. return -1;
  252. }
  253. cfg->port.drv_vbus.valid = 1;
  254. cfg->port.drv_vbus.gpio_set.gpio = (gpio_set.port - 1) * 32 + gpio_set.port_num;
  255. cfg->port.drv_vbus.gpio_set.mul_sel = gpio_set.mul_sel;
  256. cfg->port.drv_vbus.gpio_set.pull = gpio_set.pull;
  257. cfg->port.drv_vbus.gpio_set.drv_level = gpio_set.drv_level;
  258. cfg->port.drv_vbus.gpio_set.data = gpio_set.data;
  259. Usb_Manager_Debug("%s gpio %d\n", KEY_USB_DETVBUS_GPIO, cfg->port.drv_vbus.gpio_set.gpio);
  260. }
  261. return 0;
  262. }
  263. int hal_usb_manager_init(void)
  264. {
  265. int ret = -1;
  266. rt_thread_t scan_thread_handle = NULL;
  267. Usb_Manager_Debug("init \n");
  268. memset(&g_usb_cfg, 0, sizeof(usb_cfg_t));
  269. usb_msg_center_init();
  270. ret = usb_script_parse(&g_usb_cfg);
  271. if (ret != 0)
  272. {
  273. Usb_Manager_Err("ERR: get_usb_cfg failed\n");
  274. return -1;
  275. }
  276. thread_run_flag = 1;
  277. thread_stopped_flag = 0;
  278. #ifndef CONFIG_KERNEL_FREERTOS
  279. usb_manager_dev_init();
  280. #endif
  281. if (g_usb_cfg.port.port_type == USB_PORT_TYPE_DEVICE)
  282. {
  283. scan_thread_handle = kthread_create(usb_host_scan_thread, &g_usb_cfg, "usb-device-scan");
  284. if (scan_thread_handle == NULL)
  285. {
  286. Usb_Manager_Err("ERR: kthread_create failed\n");
  287. return -1;
  288. }
  289. kthread_start(scan_thread_handle);
  290. }
  291. else if (g_usb_cfg.port.port_type == USB_PORT_TYPE_HOST)
  292. {
  293. scan_thread_handle = kthread_create(usb_host_scan_thread, &g_usb_cfg, "usb-host-scan");
  294. if (scan_thread_handle == NULL)
  295. {
  296. Usb_Manager_Err("ERR: kthread_create failed\n");
  297. return -1;
  298. }
  299. kthread_start(scan_thread_handle);
  300. }
  301. else
  302. {
  303. usb_hw_scan_init(&g_usb_cfg);
  304. if (g_usb_cfg.port.detect_mode == USB_DETECT_MODE_THREAD)
  305. {
  306. scan_thread_handle = kthread_create(usb_hardware_scan_thread, &g_usb_cfg, "usb-hardware-scan");
  307. if (scan_thread_handle == NULL)
  308. {
  309. Usb_Manager_Err("ERR: kthread_create failed\n");
  310. return -1;
  311. }
  312. }
  313. // else if (g_usb_cfg.port.detect_mode == USB_DETECT_MODE_INTR)
  314. // {
  315. // if (usb_register_id_irq(&g_usb_cfg) != 0)
  316. // {
  317. // Usb_Manager_Err("ERR: usb_register_id_irq failed\n");
  318. // return -1;
  319. // }
  320. // }
  321. else
  322. {
  323. Usb_Manager_Err("ERR: usb detect mode isn't supported\n");
  324. return -1;
  325. }
  326. kthread_start(scan_thread_handle);
  327. }
  328. return ret;
  329. }
  330. int hal_usb_manager_deinit(void)
  331. {
  332. if (g_usb_cfg.port.port_type == USB_PORT_TYPE_OTG)
  333. {
  334. if (g_usb_cfg.port.detect_mode == USB_DETECT_MODE_THREAD)
  335. {
  336. thread_run_flag = 0;
  337. while (!thread_stopped_flag)
  338. {
  339. Usb_Manager_Err("waitting for usb_hardware_scan_thread stop\n");
  340. hal_msleep(20);
  341. }
  342. }
  343. else if (g_usb_cfg.port.detect_mode == USB_DETECT_MODE_INTR)
  344. {
  345. free_irq(g_usb_cfg.port.id_irq_num, &g_usb_cfg);
  346. }
  347. }
  348. hw_rmmod_usb_host();
  349. hw_rmmod_usb_device();
  350. usb_msg_center(&g_usb_cfg);
  351. usb_msg_center_exit();
  352. return 0;
  353. }