Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
4.0.2
wifi
潘多拉开发板_Pandora
10
rt-thread 4.0.2 潘多拉开发板 wifi 初始化失败
发布于 2021-07-07 17:39:39 浏览:1131
订阅该版
这里我大体说一下我的思路: 1、SPI FLASH 是使用 SFUD 通用驱动的 2、SPI FLASH 分区是使用 FAL 分区,然后根目录 / 挂载到 filesystem 分区,文件系统类型是 elm FAT 3、使用了 SD 卡,SD 卡挂载到 /mnt,文件系统是 elm FAT 4、EasyFlash 使用的是 "easyflash" 分区 4、wifi 固件的烧写我是参考例程写的,将 wifi 固件烧写到 wifi_image 分区 5、wifi 驱动也修改了,把 OTA 部分屏蔽掉了。 报错界面: ![1.png](https://oss-club.rt-thread.org/uploads/20210707/2adab8ceb22f49c2aa5aab6acdbe4892.png) wifi 固件的烧写代码: ```c void wifi_firmware_upgrade(void) { const struct fal_partition *wifi_image_part = RT_NULL; struct dfs_fd file_fd; rt_uint32_t file_size; int len; int read_len; int write_len = 0; char *read_buf = RT_NULL; /* 获取 wifi 固件的大小 */ if (dfs_file_open(&file_fd, "/mnt/wifi_image_1.0.rbl", O_RDONLY) != 0) { rt_kprintf("dfs file open failed!"); goto ERROR; } file_size = file_fd.size; rt_kprintf("wifi firmware size:%d.\n", file_size); /* 找到 wifi_image 分区 */ wifi_image_part = fal_partition_find("wifi_image"); if(wifi_image_part == RT_NULL) { rt_kprintf("wifi_image find failed.\n"); goto ERROR2; } /* 根据 wifi 固件大小擦除 wifi_image 分区 */ if (fal_partition_erase(wifi_image_part, 0, file_size) < 0) { rt_kprintf("wifi_image erase failed.\n"); goto ERROR2; } /* 下面就是循环写操作了 */ read_buf = rt_malloc(1024); if (read_buf == RT_NULL) { goto ERROR2; } rt_memset(read_buf, 0x0, 1024); do { if (file_size >= 1024) { read_len = 1024; } else { read_len = file_size; } len = dfs_file_read(&file_fd, read_buf, read_len); if (len != read_len ) { rt_kprintf("File read failed.\n"); goto ERROR3; } file_size -= read_len; len = fal_partition_write(wifi_image_part, 0 + write_len, (const uint8_t *)read_buf, read_len); if (len < 0) { rt_kprintf("fal write failed!"); goto ERROR3; } write_len += read_len; rt_memset(read_buf, 0x0, 1024); } while(write_len != file_fd.size); if (write_len == file_fd.size) rt_kprintf("wifi firmware upgrade success.\n"); ERROR3: free(read_buf); ERROR2: dfs_file_close(&file_fd); ERROR: return; } MSH_CMD_EXPORT(wifi_firmware_upgrade, Upgrade wifi firmware.); ``` wifi 驱动的代码: ```c define WIFI_IMAGE_PARTITION_NAME "wifi_image" #define WIFI_INIT_THREAD_STACK_SIZE (1024 * 4) #define WIFI_INIT_THREAD_PRIORITY (RT_THREAD_PRIORITY_MAX/2) #define WIFI_INIT_WAIT_TIME (rt_tick_from_millisecond(100)) #define PIN_WIFI_IRQ GET_PIN(C, 5) extern int wifi_hw_init(void); extern void wwd_thread_notify_irq(void); static const struct fal_partition *partition = RT_NULL; static rt_uint32_t init_flag = 0; struct rt_wlan_device *bcm_hw_wlan_dev_alloc(void) { struct rt_wlan_device *wlan; wlan = rt_malloc(sizeof(struct rt_wlan_device)); return wlan; } /** * 获得 Flash wifi_image 分区存储的 WLAN 固件所占空间的大小 size * 就是 wifi_image_1.0.rbl **/ int wiced_platform_resource_size(int resource) { int size = 0; /* Download firmware */ if (resource == 0) { partition = fal_partition_find(WIFI_IMAGE_PARTITION_NAME); if (partition == RT_NULL) { LOG_E("%s partition is not exist, please check your configuration!"); return size; } } return size; } /** * 从 Flash wifi_image 分区读取 size 大小的数据(实际就是 WLAN 固件代码) * 并保存到指针 buffer 所指向的内存空间 **/ int wiced_platform_resource_read(int resource, uint32_t offset, void *buffer, uint32_t buffer_size) { int transfer_size = 0; if (partition == RT_NULL) { return 0; } /* read RF firmware from partition */ transfer_size = fal_partition_read(partition, offset, buffer, buffer_size); return transfer_size; } #ifdef RT_USING_PM void wiced_platform_keep_awake(void) { rt_pm_request(PM_SLEEP_MODE_NONE); } void wiced_platform_let_sleep(void) { rt_pm_release(PM_SLEEP_MODE_NONE); } #endif /** * return:1 initialize done * 0 not initialize */ int rt_hw_wlan_get_initialize_status(void) { return init_flag; } /** * wait milliseconds for wifi low level initialize complete * * time_ms: timeout in milliseconds */ int rt_hw_wlan_wait_init_done(rt_uint32_t time_ms) { rt_uint32_t time_cnt = 0; /* wait wifi low level initialize complete */ while (time_cnt <= (time_ms / 100)) { time_cnt++; rt_thread_mdelay(100); if (rt_hw_wlan_get_initialize_status() == 1) { break; } } if (time_cnt > (time_ms / 100)) { return -RT_ETIMEOUT; } return RT_EOK; } static void _wiced_irq_handler(void *param) { wwd_thread_notify_irq(); } static void wifi_init_thread_entry(void *parameter) { /* set wifi irq handle, must be initialized first */ rt_pin_mode(PIN_WIFI_IRQ, PIN_MODE_INPUT_PULLUP); rt_pin_attach_irq(PIN_WIFI_IRQ, PIN_IRQ_MODE_RISING_FALLING, _wiced_irq_handler, RT_NULL); rt_pin_irq_enable(PIN_WIFI_IRQ, PIN_IRQ_ENABLE); /* initialize low level wifi(ap6181) library */ wifi_hw_init(); /* waiting for sdio bus stability */ rt_thread_delay(WIFI_INIT_WAIT_TIME); /* set wifi work mode */ rt_wlan_set_mode(RT_WLAN_DEVICE_STA_NAME, RT_WLAN_STATION); init_flag = 1; } int rt_hw_wlan_init(void) { if (init_flag == 1) { return RT_EOK; } #ifdef BSP_USING_WIFI_THREAD_INIT rt_thread_t tid = RT_NULL; tid = rt_thread_create("wifi_init", wifi_init_thread_entry, RT_NULL, WIFI_INIT_THREAD_STACK_SIZE, WIFI_INIT_THREAD_PRIORITY, 20); if (tid) { rt_thread_startup(tid); } else { LOG_E("Create wifi initialization thread fail!"); return -RT_ERROR; } #else wifi_init_thread_entry(RT_NULL); init_flag = 1; #endif return RT_EOK; } #ifdef BSP_USING_WIFI_AUTO_INIT INIT_APP_EXPORT(rt_hw_wlan_init); #endif #endif ``` 主代码: ```c void mnt_init(void) { struct rt_device *rootfs = RT_NULL; /* FAL 初始化 */ fal_init(); /* 将 elm fat 文件系统挂载 W25Q128 的 filesystem 分区 */ rootfs = fal_blk_device_create("filesystem"); if(rootfs == RT_NULL) return; if (dfs_mount("filesystem", "/", "elm", 0, 0) == 0) { rt_kprintf("file system initialization done!\n"); } else { if(dfs_mkfs("elm", "filesystem") == 0) { if (dfs_mount("filesystem", "/", "elm", 0, 0) == 0) { rt_kprintf("file system initialization done!\n"); } else { rt_kprintf("file system initialization failed!\n"); } } } /* easyflash 的初始化 */ easyflash_init(); /* 创建 /mnt 目录,用于挂载 SD 卡 */ if (opendir("/mnt") == RT_NULL) { if (mkdir("mnt", 0x777) == -1) return; } if(rt_device_find("sd0") == RT_NULL) { rt_kprintf("failed to find sd card device.\n"); return; } if (dfs_mount("sd0", "/mnt", "elm", 0, 0) == RT_EOK) { rt_kprintf("sd card mount to '/mnt' success.\n"); } else { rt_kprintf("sd card mount to '/mnt' failed!\n"); } } int main(void) { mnt_init(); rt_hw_wlan_init(); /* 等待 500 ms 以便 wifi 完成初始化 */ rt_hw_wlan_wait_init_done(500); return RT_EOK; } ```
查看更多
4
个回答
默认排序
按发布时间排序
小小李sunny
2021-07-08
这家伙很懒,什么也没写!
日志显示执行sdio_io_rw_direct函数报错,单步调试一下查查。
aozima
2021-07-08
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
可以先烧录一下完整的测试程序,验证一下硬件是否完好。 如果硬件没问题,再来对比软件和工程的差异,这样保险些。
Recca
2021-07-08
这家伙很懒,什么也没写!
最快捷的解决方法:直接用 v4.0.3 版本。。。。至于原因嘛,找不到就不找了。。
123
认证专家
2021-07-08
这家伙很懒,什么也没写!
pandora有SDK的示例demo,楼主直接下载试试就知道问题出在哪了。
撰写答案
登录
注册新账号
关注者
0
被浏览
1.1k
关于作者
Recca
这家伙很懒,什么也没写!
提问
8
回答
3
被采纳
0
关注TA
发私信
相关问题
1
潘多拉开发板AP6181 外设支持报错
2
潘多拉wifi管理例程中ap模式未启动
3
潘多拉开发板上I2C设备驱动开发
4
潘多拉开发板 综合例程 调试报错
5
潘多拉开发板在VSCODE无法执行micropython
6
潘多拉添加freemodbus例子出现错误
7
潘多拉开发板OV2640拍摄JPEG格式的照片
8
SFUD 提示闪存超过32g
9
有谁用潘多拉开发过OV2640吗
10
请问潘多拉开发板怎么烧录micropython固件
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
2
RT-Thread 发布 EtherKit开源以太网硬件!
3
rt-thread使用cherryusb实现虚拟串口
4
《C++20 图形界面程序:速度与渲染效率的双重优化秘籍》
5
《原子操作:程序世界里的“最小魔法单位”解析》
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
ota在线升级
UART
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
at_device
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
张世争
8
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
KunYi
6
个答案
1
次被采纳
本月文章贡献
程序员阿伟
6
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部