OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7747|回复: 0

RT-Thread WIFI 初始化报错

[复制链接]

1

主题

3

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2017-10-20
在线时间
7 小时
发表于 2021-7-7 17:26:05 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 Recca 于 2021-7-7 17:31 编辑

这里我大体说一下我的思路:
1、SPI FLASH 是使用 SFUD 通用驱动的
2、SPI FLASH 分区是使用 FAL 分区,然后根目录 / 挂载到 filesystem 分区,文件系统类型是 elm FAT
3、使用了 SD 卡,SD 卡挂载到 /mnt,文件系统是 elm FAT
4、wifi 固件的烧写我是参考例程写的,将 wifi 固件烧写到 wifi_image 分区
5、wifi 驱动也修改了,把 OTA 部分屏蔽掉了。

报错界面:

报错界面

报错界面


wifi 固件的烧写代码:

  1. void wifi_firmware_upgrade(void)
  2. {
  3.     const struct fal_partition *wifi_image_part = RT_NULL;
  4.     struct dfs_fd file_fd;
  5.    
  6.     rt_uint32_t file_size;

  7.     int len;
  8.     int read_len;
  9.     int write_len = 0;

  10.     char *read_buf = RT_NULL;

  11.     /* 获取 wifi 固件的大小 */
  12.     if (dfs_file_open(&file_fd, "/mnt/wifi_image_1.0.rbl", O_RDONLY) != 0)
  13.     {
  14.         rt_kprintf("dfs file open failed!");
  15.         goto ERROR;
  16.     }
  17.     file_size = file_fd.size;
  18.     rt_kprintf("wifi firmware size:%d.\n", file_size);
  19.                
  20.     /* 找到 wifi_image 分区 */
  21.         wifi_image_part = fal_partition_find("wifi_image");
  22.         if(wifi_image_part == RT_NULL)
  23.     {
  24.         rt_kprintf("wifi_image find failed.\n");
  25.         goto ERROR2;
  26.     }

  27.     /* 根据 wifi 固件大小擦除 wifi_image 分区 */
  28.     if (fal_partition_erase(wifi_image_part, 0, file_size) < 0)
  29.     {
  30.         rt_kprintf("wifi_image erase failed.\n");
  31.         goto ERROR2;
  32.     }

  33.     /* 下面就是循环写操作了 */
  34.     read_buf = rt_malloc(1024);
  35.     if (read_buf == RT_NULL)
  36.     {
  37.         goto ERROR2;
  38.     }
  39.     rt_memset(read_buf, 0x0, 1024);

  40.     do
  41.     {
  42.         if (file_size >= 1024)
  43.         {
  44.             read_len = 1024;
  45.         }
  46.         else
  47.         {
  48.             read_len = file_size;
  49.         }

  50.         len = dfs_file_read(&file_fd, read_buf, read_len);
  51.         if (len != read_len )
  52.         {
  53.             rt_kprintf("File read failed.\n");
  54.             goto ERROR3;
  55.         }
  56.         file_size -= read_len;

  57.         len = fal_partition_write(wifi_image_part, 0 + write_len, (const uint8_t *)read_buf, read_len);
  58.         if (len < 0)
  59.         {
  60.             rt_kprintf("fal write failed!");
  61.             goto ERROR3;
  62.         }
  63.         write_len += read_len;
  64.         rt_memset(read_buf, 0x0, 1024);
  65.     } while(write_len != file_fd.size);

  66.     if (write_len == file_fd.size)
  67.         rt_kprintf("wifi firmware upgrade success.\n");

  68. ERROR3:
  69.     free(read_buf);
  70. ERROR2:
  71.     dfs_file_close(&file_fd);
  72. ERROR:
  73.     return;
  74. }

  75. MSH_CMD_EXPORT(wifi_firmware_upgrade, Upgrade wifi firmware.);
复制代码



wifi 驱动的代码:

  1. define WIFI_IMAGE_PARTITION_NAME        "wifi_image"
  2. #define WIFI_INIT_THREAD_STACK_SIZE      (1024 * 4)
  3. #define WIFI_INIT_THREAD_PRIORITY        (RT_THREAD_PRIORITY_MAX/2)
  4. #define WIFI_INIT_WAIT_TIME              (rt_tick_from_millisecond(100))

  5. #define PIN_WIFI_IRQ    GET_PIN(C, 5)

  6. extern int wifi_hw_init(void);
  7. extern void wwd_thread_notify_irq(void);

  8. static const struct fal_partition *partition = RT_NULL;

  9. static rt_uint32_t init_flag = 0;

  10. struct rt_wlan_device *bcm_hw_wlan_dev_alloc(void)
  11. {
  12.     struct rt_wlan_device *wlan;

  13.     wlan = rt_malloc(sizeof(struct rt_wlan_device));

  14.     return wlan;
  15. }

  16. /**
  17. * 获得 Flash wifi_image 分区存储的 WLAN 固件所占空间的大小 size
  18. * 就是 wifi_image_1.0.rbl
  19. **/
  20. int wiced_platform_resource_size(int resource)
  21. {
  22.     int size = 0;

  23.     /* Download firmware */
  24.     if (resource == 0)
  25.     {
  26.         partition = fal_partition_find(WIFI_IMAGE_PARTITION_NAME);
  27.         if (partition == RT_NULL)
  28.         {
  29.             LOG_E("%s partition is not exist, please check your configuration!");
  30.             return size;
  31.         }
  32.     }
  33.     return size;
  34. }

  35. /**
  36. * 从 Flash wifi_image 分区读取 size 大小的数据(实际就是 WLAN 固件代码)
  37. * 并保存到指针 buffer 所指向的内存空间
  38. **/
  39. int wiced_platform_resource_read(int resource, uint32_t offset, void *buffer, uint32_t buffer_size)
  40. {
  41.     int transfer_size = 0;

  42.     if (partition == RT_NULL)
  43.     {
  44.         return 0;
  45.     }

  46.     /* read RF firmware from partition */
  47.     transfer_size = fal_partition_read(partition, offset, buffer, buffer_size);

  48.     return transfer_size;
  49. }

  50. #ifdef RT_USING_PM
  51. void wiced_platform_keep_awake(void)
  52. {
  53.     rt_pm_request(PM_SLEEP_MODE_NONE);
  54. }

  55. void wiced_platform_let_sleep(void)
  56. {
  57.     rt_pm_release(PM_SLEEP_MODE_NONE);
  58. }
  59. #endif

  60. /**
  61. * return:1 initialize done
  62. *        0 not initialize
  63. */
  64. int rt_hw_wlan_get_initialize_status(void)
  65. {
  66.     return init_flag;
  67. }

  68. /**
  69. * wait milliseconds for wifi low level initialize complete
  70. *
  71. * time_ms: timeout in milliseconds
  72. */
  73. int rt_hw_wlan_wait_init_done(rt_uint32_t time_ms)
  74. {
  75.     rt_uint32_t time_cnt = 0;

  76.     /* wait wifi low level initialize complete */
  77.     while (time_cnt <= (time_ms / 100))
  78.     {
  79.         time_cnt++;
  80.         rt_thread_mdelay(100);
  81.         if (rt_hw_wlan_get_initialize_status() == 1)
  82.         {
  83.             break;
  84.         }
  85.     }

  86.     if (time_cnt > (time_ms / 100))
  87.     {
  88.         return -RT_ETIMEOUT;
  89.     }

  90.     return RT_EOK;
  91. }

  92. static void _wiced_irq_handler(void *param)
  93. {
  94.     wwd_thread_notify_irq();
  95. }

  96. static void wifi_init_thread_entry(void *parameter)
  97. {
  98.     /* set wifi irq handle, must be initialized first */
  99.     rt_pin_mode(PIN_WIFI_IRQ, PIN_MODE_INPUT_PULLUP);
  100.     rt_pin_attach_irq(PIN_WIFI_IRQ, PIN_IRQ_MODE_RISING_FALLING, _wiced_irq_handler, RT_NULL);
  101.     rt_pin_irq_enable(PIN_WIFI_IRQ, PIN_IRQ_ENABLE);

  102.     /* initialize low level wifi(ap6181) library */
  103.     wifi_hw_init();

  104.     /* waiting for sdio bus stability */
  105.     rt_thread_delay(WIFI_INIT_WAIT_TIME);

  106.     /* set wifi work mode */
  107.     rt_wlan_set_mode(RT_WLAN_DEVICE_STA_NAME, RT_WLAN_STATION);

  108.     init_flag = 1;
  109. }

  110. int rt_hw_wlan_init(void)
  111. {
  112.     if (init_flag == 1)
  113.     {
  114.         return RT_EOK;
  115.     }

  116. #ifdef BSP_USING_WIFI_THREAD_INIT
  117.     rt_thread_t tid = RT_NULL;

  118.     tid = rt_thread_create("wifi_init", wifi_init_thread_entry, RT_NULL, WIFI_INIT_THREAD_STACK_SIZE, WIFI_INIT_THREAD_PRIORITY, 20);
  119.     if (tid)
  120.     {
  121.         rt_thread_startup(tid);
  122.     }
  123.     else
  124.     {
  125.         LOG_E("Create wifi initialization thread fail!");
  126.         return -RT_ERROR;
  127.     }
  128. #else
  129.     wifi_init_thread_entry(RT_NULL);
  130.     init_flag = 1;
  131. #endif

  132.     return RT_EOK;
  133. }

  134. #ifdef BSP_USING_WIFI_AUTO_INIT
  135. INIT_APP_EXPORT(rt_hw_wlan_init);
  136. #endif

  137. #endif
复制代码



主代码:

  1. void mnt_init(void)
  2. {
  3.     struct rt_device *rootfs = RT_NULL;

  4.     /* FAL 初始化 */
  5.     fal_init();

  6.     /* 将 elm fat 文件系统挂载 W25Q128 的 filesystem 分区 */
  7.     rootfs = fal_blk_device_create("filesystem");
  8.     if(rootfs == RT_NULL)
  9.         return;

  10.     if (dfs_mount("filesystem", "/", "elm", 0, 0) == 0)
  11.     {
  12.         rt_kprintf("file&#160;system&#160;initialization&#160;done!\n");
  13.     }
  14.     else
  15.     {
  16.         if(dfs_mkfs("elm", "filesystem") == 0)
  17.         {
  18.             if (dfs_mount("filesystem", "/", "elm", 0, 0) == 0)
  19.             {
  20.                 rt_kprintf("file&#160;system&#160;initialization&#160;done!\n");
  21.             }
  22.             else
  23.             {
  24.                 rt_kprintf("file&#160;system&#160;initialization&#160;failed!\n");
  25.             }
  26.         }
  27.     }

  28.     /* easyflash 的初始化 */
  29.     easyflash_init();

  30.     /* 创建 /mnt 目录,用于挂载 SD 卡 */
  31.     if (opendir("/mnt") == RT_NULL)
  32.     {
  33.         if (mkdir("mnt", 0x777) == -1)
  34.             return;
  35.     }   
  36.         
  37.     if(rt_device_find("sd0") == RT_NULL)
  38.     {
  39.         rt_kprintf("failed to find sd card device.\n");
  40.         return;
  41.     }

  42.     if (dfs_mount("sd0", "/mnt", "elm", 0, 0) == RT_EOK)
  43.     {
  44.         rt_kprintf("sd card mount to '/mnt' success.\n");
  45.     }
  46.     else
  47.     {
  48.         rt_kprintf("sd card mount to '/mnt' failed!\n");
  49.     }
  50. }

  51. int main(void)
  52. {
  53.     mnt_init();

  54.     rt_hw_wlan_init();
  55.     /* 等待 500 ms 以便 wifi 完成初始化 */
  56.     rt_hw_wlan_wait_init_done(500);

  57.     return RT_EOK;
  58. }
复制代码



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 17:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表