MT7621完美支持32M SPI Flash(W25Q256) 修复 soft reset fail
前言
OpenWrt的最新kernel(3.18.23)已经能够支持32M SPI Flash的读写以及擦除操作.然而,可能是系统考虑不周,亦或是MT7621系统的BUG,在配置了W25Q256的MT7621开发板系统上,无法soft reset!经过查阅相关资料,发现,MT7621默认支持24bit(3byte)的spi地址模式,而要支持32M以上的spi flash,则必须切换到32bit(4byte)地址模式.在soft reset的时候,spi停留在了32bit模式,没有切换回默认的24bit模式,导致reset后,MT7621在默认的24bit模式,无法和32bit模式的spi通讯,系统死机.那么问题来了:如何在soft reset时刻,让spi flash切换回24bit模式呢?本文通过设备驱动中的一个shutdown方法来解决这个问题。
背景知识
在linux源代码kernel目录下,有一个reboot.c文件,里面暴露了一个register_reboot_notifier方法,可以让kernel中的代码有机会获得reboot的通知,当我们继续分析reboot.c的代码时,会发现更有意思的东西:
/*** kernel_restart - reboot the system* @cmd: pointer to buffer containing command to execute for restart* or %NULL** Shutdown everything and perform a clean reboot.* This is not safe to call in interrupt context.*/
void kernel_restart(char *cmd)
{kernel_restart_prepare(cmd);migrate_to_reboot_cpu();syscore_shutdown();if (!cmd)pr_emerg("Restarting system\n");elsepr_emerg("Restarting system with command '%s'\n", cmd);kmsg_dump(KMSG_DUMP_RESTART);machine_restart(cmd);
}
在kernel_restart中,又调用了kernel_restart_prepare方法:
void kernel_restart_prepare(char *cmd)
{blocking_notifier_call_chain(&reboot_notifier_list, SYS_RESTART, cmd);system_state = SYSTEM_RESTART;usermodehelper_disable();device_shutdown();
}
device_shutdown在drivers/base/core.c中实现:
/*** device_shutdown - call ->shutdown() on each device to shutdown.*/
void device_shutdown(void)
{struct device *dev, *parent;spin_lock(&devices_kset->list_lock);/** Walk the devices list backward, shutting down each in turn.* Beware that device unplug events may also start pulling* devices offline, even as the system is shutting down.*/while (!list_empty(&devices_kset->list)) {dev = list_entry(devices_kset->list.prev, struct device,kobj.entry);/** hold reference count of device's parent to* prevent it from being freed because parent's* lock is to be held*/parent = get_device(dev->parent);get_device(dev);/** Make sure the device is off the kset list, in the* event that dev->*->shutdown() doesn't remove it.*/list_del_init(&dev->kobj.entry);spin_unlock(&devices_kset->list_lock);/* hold lock to avoid race with probe/release */if (parent)device_lock(parent);device_lock(dev);/* Don't allow any more runtime suspends */pm_runtime_get_noresume(dev);pm_runtime_barrier(dev);// manfeel, add debug info//dev_info(dev,"search shutdown method...\n");if (dev->bus && dev->bus->shutdown) {//if (initcall_debug) manfeeldev_info(dev, "shutdown\n");dev->bus->shutdown(dev);} else if (dev->driver && dev->driver->shutdown) {//if (initcall_debug) manfeeldev_info(dev, "shutdown\n");dev->driver->shutdown(dev);}device_unlock(dev);if (parent)device_unlock(parent);put_device(dev);put_device(parent);spin_lock(&devices_kset->list_lock);}spin_unlock(&devices_kset->list_lock);async_synchronize_full();
}
通过阅读代码,我们不难发现,在device_shutdown中,枚举了设备的shutdown方法,如果存在该方法,则会调用之.
于是,32M spi flash的reset方法喷薄而出.
解决办法
转到drivers/mtd/devices/m25p80.c
修改如下代码:
static int m25p_remove(struct spi_device *spi)
{struct m25p *flash = spi_get_drvdata(spi);// manfeel note: add spi flash reset codeflash->command[0] = 0x66;spi_write(flash->spi, flash->command, 1);flash->command[0] = 0x99;spi_write(flash->spi, flash->command, 1);/* Clean up MTD stuff. */return mtd_device_unregister(&flash->mtd);
}static struct spi_driver m25p80_driver = {.driver = {.name = "m25p80",.owner = THIS_MODULE,},.id_table = m25p_ids,.probe = m25p_probe,.remove = m25p_remove,// manfeel, add shutdown method to reset spi flash.shutdown = m25p_remove,/* REVISIT: many of these chips have deep power-down modes, which* should clearly be entered on suspend() to minimize power use.* And also when they're otherwise idle...*/
};
总结
通过注册设备的shutdown方法,让我们有机会在系统重启的时刻,做一些deinit的操作.通过此种方法来复位spi flash,优雅而简洁
MT7621完美支持32M SPI Flash(W25Q256) 修复 soft reset fail相关推荐
- 让ambarella s2l 支持32M SPI Flash(W25Q256)
前言: 最近在做ambarella s2l系列项目时,由于flash容量不够,需要将16M的spi nor flash(W25Q128)增大到32M spi nor flash (W25Q2 ...
- Xilinx FPGA支持的SPI Flash配置芯片型号
文章目录 支持的SPI Flash芯片型号 7 系列的FPGA支持的SPI Flash芯片型号 Virtex和Spartan系列支持的SPI芯片型号 支持的BPI Flash芯片 7系列支持的BPI ...
- mtk7620(斐讯K2)openwrt 18.06.1 固件 硬改 华邦winbond的W25Q256FV 32M spi flash
网上的很多方法都是错的,网上很多编译好的固件只支持8M 或者16M flash,根本不支持32M flash,有的根本启动不了,有的就算能启动,启动后会出没有无线的问题. 笔者在https://git ...
- lichee linux nfs,SPI Flash 系统编译
在一些低成本应用场景,需要在SPI flash上启动系统,这需要对Uboot和系统镜像做些适配. 本文介绍SPI Flash镜像的制作过程. 这里 使用 MX25L25645G, 32M SPI fl ...
- 移植SFUD,驱动SPI FLASH ZD25WQ80
1.关于SFUD SFUD (Serial Flash Universal Driver) 串行 Flash 通用驱动库,支持众多spi flash,关于SFUD的详细资料可参考:https://gi ...
- Licheepi zero SPI Flash 系统编译
Licheepi zero SPI Flash 系统编译 在一些低成本应用场景,需要在SPI flash上启动系统,这需要对Uboot和系统镜像做些适配. 本文介绍SPI Flash镜像的制作过程. ...
- 【STM32H7教程】第85章 STM32H7的SPI 总线应用之SPI Flash的STM32CubeProg下载算法制作
完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第85章 STM32H7的SPI 总线应用之SPI ...
- 荔枝派Zero(V3s)SPI Flash 启动
参考:http://zero.lichee.pro/系统开发/SPI_flash_build.html#linux 本文以型号为MX25L12805.MX25L25635F为例,flash大小分别为1 ...
- 如何给ESP32选择外接SPI Flash
给ESP32选择外接SPI Flash [前言]: 许多用户在使用 ESP32 做开发的时候,都会碰到如何选择外接 Flash 的难题,因为不同厂商的 Flash 存在很多差异,Flash 支持的工 ...
- Lichee Zero SPI Flash编译实战记录
1.系统 物理机 ubuntu1804 2.创建编译环境 1)下载 gcc-linaro-6.3.1-2017.02-x86_64_arm-linux-gnueabihf.tar.xz wget ht ...
最新文章
- 2021年春季学期-信号与系统-第八次作业参考答案-第七小题
- Linux的用户和用户组管理
- 虚拟现实大会ChinaVR2015报告之-电子试衣和三维人体建模
- 无限循环小数POJ1930
- spring aop实例讲解_Spring框架核心知识点
- 小程序种的轮播图高度的算法
- 外设、总线、接口概念辨析
- ReportMachine脚本控制背景色
- 思维导图与知识树的区别
- 给盲目跟风网络营销的商户们一个忠告——搞不好你会死得很惨
- 以潘金莲和西门公子为例讲述Java静态代理和动态代理
- 组合数学之二 —— 容斥原理及应用
- moviepy第2天|对视频添加圆圈渐变大小的结尾及文字
- 2022最新408考纲
- Linux解压short read,LInux之gz文件压缩/解压缩
- python使用matplotlib可视化、自定义设置X轴刻度标签字体的大小( setting axis ticks size in matplotlib x axis)
- 跟女神表白用计算机,终于跟女神表白了,她听后没说什么
- MyBatisPlus快速入门
- 飞猪、去哪儿网被列入大数据“杀熟”名单,超50%的人遭遇过被“杀熟”
- esxi迁移linux报错device eth0 does not seem tobe present,delaying
热门文章
- 微波射频学习笔记2--------传输线理论
- 空洞卷积详解(输入输出大小分析)
- JSP的九大内置对象和四大作用域对象
- 毕业设计html5作品,基于HTML5的年货购物网站的设计与实现毕业论文+任务书+开题报告+设计源码...
- python画正方形并涂色_画正方形-小学生 Python 入门课
- Java二叉树的建立
- SSD1306 - OLED显示屏
- .NET(c#) 移动APP开发平台 - Smobiler(2) - 平台介绍
- matlab三机九节点,matlab三机九节点电力系统仿真(带程序).doc
- 林子雨_大数据技术原理与应用课后习题