前言

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相关推荐

  1. 让ambarella s2l 支持32M SPI Flash(W25Q256)

    前言:      最近在做ambarella s2l系列项目时,由于flash容量不够,需要将16M的spi nor flash(W25Q128)增大到32M spi nor flash (W25Q2 ...

  2. Xilinx FPGA支持的SPI Flash配置芯片型号

    文章目录 支持的SPI Flash芯片型号 7 系列的FPGA支持的SPI Flash芯片型号 Virtex和Spartan系列支持的SPI芯片型号 支持的BPI Flash芯片 7系列支持的BPI ...

  3. mtk7620(斐讯K2)openwrt 18.06.1 固件 硬改 华邦winbond的W25Q256FV 32M spi flash

    网上的很多方法都是错的,网上很多编译好的固件只支持8M 或者16M flash,根本不支持32M flash,有的根本启动不了,有的就算能启动,启动后会出没有无线的问题. 笔者在https://git ...

  4. lichee linux nfs,SPI Flash 系统编译

    在一些低成本应用场景,需要在SPI flash上启动系统,这需要对Uboot和系统镜像做些适配. 本文介绍SPI Flash镜像的制作过程. 这里 使用 MX25L25645G, 32M SPI fl ...

  5. 移植SFUD,驱动SPI FLASH ZD25WQ80

    1.关于SFUD SFUD (Serial Flash Universal Driver) 串行 Flash 通用驱动库,支持众多spi flash,关于SFUD的详细资料可参考:https://gi ...

  6. Licheepi zero SPI Flash 系统编译

    Licheepi zero SPI Flash 系统编译 在一些低成本应用场景,需要在SPI flash上启动系统,这需要对Uboot和系统镜像做些适配. 本文介绍SPI Flash镜像的制作过程. ...

  7. 【STM32H7教程】第85章 STM32H7的SPI 总线应用之SPI Flash的STM32CubeProg下载算法制作

    完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第85章       STM32H7的SPI 总线应用之SPI ...

  8. 荔枝派Zero(V3s)SPI Flash 启动

    参考:http://zero.lichee.pro/系统开发/SPI_flash_build.html#linux 本文以型号为MX25L12805.MX25L25635F为例,flash大小分别为1 ...

  9. 如何给ESP32选择外接SPI Flash

    给ESP32选择外接SPI Flash [前言]:  许多用户在使用 ESP32 做开发的时候,都会碰到如何选择外接 Flash 的难题,因为不同厂商的 Flash 存在很多差异,Flash 支持的工 ...

  10. Lichee Zero SPI Flash编译实战记录

    1.系统 物理机 ubuntu1804 2.创建编译环境 1)下载 gcc-linaro-6.3.1-2017.02-x86_64_arm-linux-gnueabihf.tar.xz wget ht ...

最新文章

  1. 2021年春季学期-信号与系统-第八次作业参考答案-第七小题
  2. Linux的用户和用户组管理
  3. 虚拟现实大会ChinaVR2015报告之-电子试衣和三维人体建模
  4. 无限循环小数POJ1930
  5. spring aop实例讲解_Spring框架核心知识点
  6. 小程序种的轮播图高度的算法
  7. 外设、总线、接口概念辨析
  8. ReportMachine脚本控制背景色
  9. 思维导图与知识树的区别
  10. 给盲目跟风网络营销的商户们一个忠告——搞不好你会死得很惨
  11. 以潘金莲和西门公子为例讲述Java静态代理和动态代理
  12. 组合数学之二 —— 容斥原理及应用
  13. moviepy第2天|对视频添加圆圈渐变大小的结尾及文字
  14. 2022最新408考纲
  15. Linux解压short read,LInux之gz文件压缩/解压缩
  16. python使用matplotlib可视化、自定义设置X轴刻度标签字体的大小( setting axis ticks size in matplotlib x axis)
  17. 跟女神表白用计算机,终于跟女神表白了,她听后没说什么
  18. MyBatisPlus快速入门
  19. 飞猪、去哪儿网被列入大数据“杀熟”名单,超50%的人遭遇过被“杀熟”
  20. esxi迁移linux报错device eth0 does not seem tobe present,delaying

热门文章

  1. 微波射频学习笔记2--------传输线理论
  2. 空洞卷积详解(输入输出大小分析)
  3. JSP的九大内置对象和四大作用域对象
  4. 毕业设计html5作品,基于HTML5的年货购物网站的设计与实现毕业论文+任务书+开题报告+设计源码...
  5. python画正方形并涂色_画正方形-小学生 Python 入门课
  6. Java二叉树的建立
  7. SSD1306 - OLED显示屏
  8. .NET(c#) 移动APP开发平台 - Smobiler(2) - 平台介绍
  9. matlab三机九节点,matlab三机九节点电力系统仿真(带程序).doc
  10. 林子雨_大数据技术原理与应用课后习题