rw007_stm32_port.c 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. #include <rtthread.h>
  2. #ifdef RW007_USING_STM32_DRIVERS
  3. #include <rtdevice.h>
  4. #include <drv_spi.h>
  5. #include <board.h>
  6. #include <spi_wifi_rw007.h>
  7. #define RW007_AT_MODE 3
  8. #define RW007_SPI_MODE 1
  9. extern void spi_wifi_isr(int vector);
  10. static void set_rw007_mode(int mode)
  11. {
  12. /* Configure IO */
  13. rt_pin_mode(RW007_RST_PIN, PIN_MODE_OUTPUT);
  14. rt_pin_mode(RW007_INT_BUSY_PIN, PIN_MODE_INPUT_PULLDOWN);
  15. rt_pin_mode(RW007_BOOT0_PIN, PIN_MODE_OUTPUT);
  16. rt_pin_mode(RW007_BOOT1_PIN, PIN_MODE_OUTPUT);
  17. /* Reset rw007 and config mode */
  18. rt_pin_write(RW007_RST_PIN, PIN_LOW);
  19. rt_pin_write(RW007_BOOT0_PIN, mode & 0x01 ? PIN_HIGH : PIN_LOW);
  20. rt_pin_write(RW007_BOOT1_PIN, mode & 0x02 ? PIN_HIGH : PIN_LOW);
  21. rt_thread_delay(rt_tick_from_millisecond(100));
  22. rt_pin_write(RW007_RST_PIN, PIN_HIGH);
  23. /* Wait rw007 ready(exit busy stat) */
  24. while(!rt_pin_read(RW007_INT_BUSY_PIN))
  25. {
  26. }
  27. rt_thread_delay(rt_tick_from_millisecond(100));
  28. }
  29. int wifi_spi_device_init(void)
  30. {
  31. char sn_version[32];
  32. GPIO_TypeDef *cs_gpiox;
  33. uint16_t cs_pin;
  34. cs_gpiox = (GPIO_TypeDef *)((rt_base_t)GPIOA + (rt_base_t)(RW007_CS_PIN / 16) * 0x0400UL);
  35. cs_pin = (uint16_t)(1 << RW007_CS_PIN % 16);
  36. set_rw007_mode(RW007_SPI_MODE);
  37. rt_hw_spi_device_attach(RW007_SPI_BUS_NAME, "wspi", cs_gpiox, cs_pin);
  38. rt_hw_wifi_init("wspi");
  39. rt_wlan_set_mode(RT_WLAN_DEVICE_STA_NAME, RT_WLAN_STATION);
  40. rt_wlan_set_mode(RT_WLAN_DEVICE_AP_NAME, RT_WLAN_AP);
  41. rw007_sn_get(sn_version);
  42. rt_kprintf("\nrw007 sn: [%s]\n", sn_version);
  43. rw007_version_get(sn_version);
  44. rt_kprintf("rw007 ver: [%s]\n\n", sn_version);
  45. return 0;
  46. }
  47. INIT_APP_EXPORT(wifi_spi_device_init);
  48. static int rw007_update(void)
  49. {
  50. rt_device_t device = rt_device_find(RW007_SPI_BUS_NAME);
  51. struct stm32_spi *hspi = (struct stm32_spi *)device->user_data;
  52. __HAL_SPI_DISABLE((SPI_HandleTypeDef *)hspi);
  53. HAL_SPI_MspDeInit((SPI_HandleTypeDef *)hspi);
  54. set_rw007_mode(RW007_AT_MODE);
  55. return 0;
  56. }
  57. MSH_CMD_EXPORT(rw007_update, rw007_update);
  58. static void int_wifi_irq(void * p)
  59. {
  60. ((void)p);
  61. spi_wifi_isr(0);
  62. }
  63. void spi_wifi_hw_init(void)
  64. {
  65. rt_pin_attach_irq(RW007_INT_BUSY_PIN, PIN_IRQ_MODE_FALLING, int_wifi_irq, 0);
  66. rt_pin_irq_enable(RW007_INT_BUSY_PIN, RT_TRUE);
  67. }
  68. rt_bool_t spi_wifi_is_busy(void)
  69. {
  70. return !rt_pin_read(RW007_INT_BUSY_PIN);
  71. }
  72. void spi_wifi_int_cmd(rt_bool_t cmd)
  73. {
  74. rt_pin_irq_enable(RW007_INT_BUSY_PIN, cmd);
  75. }
  76. #endif /* RW007_USING_STM32_DRIVERS */