在nuc972板子上测试SPI noflash的时候发现启动比nand慢很多,从上电到进入console用了60秒。

通过抓SPI波形发现两个字节之间间隔有5us, 而发送一个字节所花费的时间只有1us左右,也就是说连个字节发送间隔太大导致大部分时间都被浪费在无效的等待上。

下图可以看出到两个发送字节之间比较宽(这已经是程序修改后的图形,修改前简直发一个字节然后空等一大段时间,非常稀疏)

SPI的驱动是 drivers\spi\spi-nuc970-p0.c, 发送函数是nuc970_spi0_txrx,发送一个自己成功会进中中断nuc970_spi0_irq, 在中断中又会检查是否所有数据都已发送完毕,如果没有则继续触发发送下一个字节nuc970_spi0_gobusy,然后又等待进中断。。。

因为进入中断是有堆栈切换之类的东西,每个字节发送完都要进中断触发下一个字节的发送,这样很多时间就浪费在中断切换上了。

去测试裸机SPI程序,发现裸机的发送两字节间隔只有700ns左右,远小于5us。裸机是直接忙等检查中断flag,不进入中断程序,如下:

for(i=0; i<256; i++) {spiWrite(0, 0, 0x00);spiIoctl(0, SPI_IOC_TRIGGER, 0, 0);while(spiGetBusyStatus(0));u8DataBuffer[i] = spiRead(0, 0);
}

按照裸机的这个裸机修改linux SPI的中断驱动后,发现SPI的性能提升很多,上电到进入console需要20s就够了。

以下是我修改后的函数:

static int nuc970_spi0_txrx(struct spi_device *spi, struct spi_transfer *t)
{struct nuc970_spi *hw = (struct nuc970_spi *)to_hw(spi);int i=0, offset;unsigned int status;hw->tx = t->tx_buf;hw->rx = t->rx_buf;hw->len = t->len;hw->count = 0;/*clear flag first*/status = __raw_readl(hw->regs + REG_CNTRL);__raw_writel(status, hw->regs + REG_CNTRL);for(i = 0; i < hw->len; i++){__raw_writel(hw_tx(hw, hw->count), hw->regs + REG_TX0);   nuc970_spi0_gobusy(hw);/*wait int flag*/status = __raw_readl(hw->regs + REG_CNTRL);while((status & ENFLG) == 0){status = __raw_readl(hw->regs + REG_CNTRL);}if (hw->rx)hw_rx(hw, __raw_readl(hw->regs + REG_RX0), hw->count);/*clear flag*/__raw_writel(status, hw->regs + REG_CNTRL);hw->count++;}return hw->count;
}

另外
request_irq(hw->irq, nuc970_spi0_irq, 0, pdev->name, hw);
这句直接注释掉了,应为SPI发送不在中断里面进行了。

nuc972 spi驱动修改提升SPI nor flash读写性能相关推荐

  1. Linux SPI驱动学习——调用SPI读写函数

    Linux SPI驱动学习--调用SPI读写函数 博客说明 开发环境 1. 基于W25Q16型FLASH来看SPI的读写函数 附录 博客说明 撰写日期 2019.10.25 完稿日期 未完稿 最近维护 ...

  2. STM32CubeMX | 基于STM32使用HAL库硬件SPI驱动WK2124一拖四SPI转四路串口芯片

    STM32CubeMX | 基于STM32使用HAL库硬件SPI驱动WK2124一拖四SPI转四路串口芯片 STM32基础工程生成 首先使用STM32CUBEMX生成STM32的基础工程,配置时钟到7 ...

  3. MSP430杂谈--AD7793硬件SPI驱动与模拟SPI驱动

    最近项目中用到了AD7793读取铂电阻值来得到相应的温度,编写了基于MSP430的硬件驱动程序和模拟驱动程序,并且能成功运行,现在记录一下分享给大家. AD7793硬件IIC驱动完整版下载链接:htt ...

  4. Linux spi驱动分析(四)----SPI设备驱动(W25Q32BV)

    一.W25Q32BV芯片简介 W25X是一系列SPI接口Flash芯片的简称,它采用SPI接口和CPU通信,本文使用的W25Q32BV容量为32M,具体特性如下: 1.1.基本特性 该芯片最大支持10 ...

  5. 【FPGA】SPI协议详解及对flash读写操作

    FPGA基于SPI实现对flash读写操作 概括 一.SPI协议.flash讲解 1.SPI协议 2.flash (1)WREN (2)RDID (3)WRSR (4)READ (5)PP (6)SE ...

  6. linux 添加spi 驱动,Linux下SPI和IIC驱动免在设备树上添加设备信息的编写方法

    编写驱动时,一般需要往设备树上添加节点信息,这里提供一种直接在驱动中添加设备信息的方法. i2c的驱动模板如下 #include #include #define SENSOR_BUS_NUM 0 # ...

  7. linux i2c adapter 增加设备_「正点原子Linux连载」第六十二章Linux SPI驱动实验(一)...

    1)实验平台:正点原子Linux开发板 2)摘自<正点原子I.MX6U嵌入式Linux驱动开发指南>关注官方微信号公众号,获取更多资料:正点原子 第六十二章Linux SPI驱动实验 上一 ...

  8. 【正点原子Linux连载】第六十二章 Linux SPI驱动实验 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

  9. linux SPI驱动实验

    文章目录 一.linux下SPI驱动框架简介 1. SPI主机驱动 1. spi_master 申请与释放 2.spi_master 的注册与注销 2. SPI设备驱动 3. SPI设备和驱动匹配过程 ...

最新文章

  1. 面试经典书籍--程序员面试宝典
  2. php中new运算符的作用,C++_C++编程中new运算符的使用学习教程,new运算符用作从自由存储为 typ - phpStudy...
  3. python如何操作oracle数据库_Python 操作 Oracle 数据库
  4. 智能外呼系统相关资料总结
  5. linux 程序运行出错的时候,如何进行调试动态库
  6. python小应用之整理手机图片
  7. 关于iOS 'The sandbox is not sync with the Podfile.lock'问题解决方法
  8. 用户的大量数据保存在计算机的,计算机基础理论复习题
  9. 残缺、时间一起的爱情
  10. 三菱plc编程软件gx-developer在win10中无法使用及工程无法建立解决方法
  11. CTPN论文翻译——中英文对照
  12. Web开发常见问题汇总
  13. nuxt 引入iconfont多色图标
  14. oracle dba 培训教程 第11章 索引的管理与维护
  15. 一位厦门大学CV硕士毕业生文言文致谢!畅聊三年求学路
  16. P4 晶体管四种工作状态+静态分析【更新】
  17. 数据仓库主题设计及元数据设计
  18. Android仿IOS解锁密码界面-自定义view系列(6)
  19. 普通话证计算机证英语证,老师的必备证书:教师资格证、普通话证、英语四六级、计算机二级...
  20. 无需QQ密保直接修改QQ密码

热门文章

  1. 月活2.67亿的B站 UP主如何瓜分流量?
  2. 莫尔斯电码对照表_使用莫尔斯电码编码纯文本
  3. 玩得好王者荣耀却做不好团队管理,我看你是白玩了
  4. foxmail 登录 exchange 2013 exchange 2016
  5. skimage包的子模块
  6. Linux系统运维1 运维 项目研发 网站 服务器 计算机基础 Linux操作系统
  7. 与嫦娥1号保持联系的测控通信系统
  8. dbfmpi——树莓派豆瓣电台fm发射器
  9. 霍尔传感器安装位置如何选择
  10. 两个乒乓球队进行比赛问题 C++实现