drv_wlan.c 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. /*
  2. * Copyright (c) 2006-2018, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2018-08-30 ZeroFree the first version
  9. */
  10. #include <rtthread.h>
  11. #include <rtdevice.h>
  12. #include <wlan_mgnt.h>
  13. #include <wlan_prot.h>
  14. #include <wlan_cfg.h>
  15. #include <fal.h>
  16. #include "drv_wlan.h"
  17. #include "drv_gpio.h"
  18. #define DBG_ENABLE
  19. #define DBG_SECTION_NAME "WLAN"
  20. #define DBG_COLOR
  21. #define DBG_LEVEL DBG_LOG
  22. #include <rtdbg.h>
  23. #ifdef BSP_USING_WIFI
  24. #define WIFI_IMAGE_PARTITION_NAME "wifi_image"
  25. #define WIFI_INIT_THREAD_STACK_SIZE (1024 * 4)
  26. #define WIFI_INIT_THREAD_PRIORITY (RT_THREAD_PRIORITY_MAX/2)
  27. #define WIFI_INIT_WAIT_TIME (rt_tick_from_millisecond(100))
  28. #define WIFI_IRQ_PIN GET_PIN(C, 5)
  29. extern int wifi_hw_init(void);
  30. extern void wwd_thread_notify_irq(void);
  31. static const struct fal_partition *partition = RT_NULL;
  32. static rt_uint32_t init_flag = 0;
  33. struct rt_wlan_device *bcm_hw_wlan_dev_alloc(void)
  34. {
  35. struct rt_wlan_device *wlan;
  36. wlan = rt_malloc(sizeof(struct rt_wlan_device));
  37. return wlan;
  38. }
  39. #ifdef RT_USING_PM
  40. void wiced_platform_keep_awake(void)
  41. {
  42. rt_pm_request(PM_SLEEP_MODE_NONE);
  43. }
  44. void wiced_platform_let_sleep(void)
  45. {
  46. rt_pm_release(PM_SLEEP_MODE_NONE);
  47. }
  48. #endif
  49. /**
  50. * return:1 initialize done
  51. * 0 not initialize
  52. */
  53. int rt_hw_wlan_get_initialize_status(void)
  54. {
  55. return init_flag;
  56. }
  57. /**
  58. * wait milliseconds for wifi low level initialize complete
  59. *
  60. * time_ms: timeout in milliseconds
  61. */
  62. int rt_hw_wlan_wait_init_done(rt_uint32_t time_ms)
  63. {
  64. rt_uint32_t time_cnt = 0;
  65. /* wait wifi low level initialize complete */
  66. while (time_cnt <= (time_ms / 100))
  67. {
  68. time_cnt++;
  69. rt_thread_mdelay(100);
  70. if (rt_hw_wlan_get_initialize_status() == 1)
  71. {
  72. break;
  73. }
  74. }
  75. if (time_cnt > (time_ms / 100))
  76. {
  77. return -RT_ETIMEOUT;
  78. }
  79. return RT_EOK;
  80. }
  81. static void _wiced_irq_handler(void *param)
  82. {
  83. wwd_thread_notify_irq();
  84. }
  85. static void wifi_init_thread_entry(void *parameter)
  86. {
  87. /* set wifi irq handle, must be initialized first */
  88. rt_pin_mode(WIFI_IRQ_PIN, PIN_MODE_INPUT_PULLUP);
  89. rt_pin_attach_irq(WIFI_IRQ_PIN, PIN_IRQ_MODE_RISING_FALLING, _wiced_irq_handler, RT_NULL);
  90. rt_pin_irq_enable(WIFI_IRQ_PIN, PIN_IRQ_ENABLE);
  91. /* initialize low level wifi(ap6181) library */
  92. wifi_hw_init();
  93. /* waiting for sdio bus stability */
  94. rt_thread_delay(WIFI_INIT_WAIT_TIME);
  95. /* set wifi work mode */
  96. rt_wlan_set_mode(RT_WLAN_DEVICE_STA_NAME, RT_WLAN_STATION);
  97. init_flag = 1;
  98. }
  99. int rt_hw_wlan_init(void)
  100. {
  101. if (init_flag == 1)
  102. {
  103. return RT_EOK;
  104. }
  105. #ifdef BSP_USING_WIFI_THREAD_INIT
  106. rt_thread_t tid = RT_NULL;
  107. tid = rt_thread_create("wifi_init", wifi_init_thread_entry, RT_NULL, WIFI_INIT_THREAD_STACK_SIZE, WIFI_INIT_THREAD_PRIORITY, 20);
  108. if (tid)
  109. {
  110. rt_thread_startup(tid);
  111. }
  112. else
  113. {
  114. LOG_E("Create wifi initialization thread fail!");
  115. return -RT_ERROR;
  116. }
  117. #else
  118. wifi_init_thread_entry(RT_NULL);
  119. init_flag = 1;
  120. #endif
  121. return RT_EOK;
  122. }
  123. #ifdef BSP_USING_WIFI_AUTO_INIT
  124. INIT_APP_EXPORT(rt_hw_wlan_init);
  125. #endif
  126. #endif