QSPI Flash驱动代码分析 (QSPI控制器初始化)

1. 函数cqspi_controller_enable()

该函数主要使能和去能QSPI控制器。QSPI配置寄存器(偏移量0x00)的bit[0]位为可读写QSPI使能位。1表示并行SPI使能;当该位设置为0时,所有SPI信号输出使能全部无效,SPI信号的所有接口被设置为输入模式。

参数enable,0为去能;1为使能。

static void cqspi_controller_enable(struct cqspi_st *cqspi, bool enable)
{void __iomem *reg_base = cqspi->iobase;unsigned int reg;reg = readl(reg_base + CQSPI_REG_CONFIG);if (enable)reg |= CQSPI_REG_CONFIG_ENABLE_MASK;elsereg &= ~CQSPI_REG_CONFIG_ENABLE_MASK;writel(reg, reg_base + CQSPI_REG_CONFIG);
}

QSPI控制器的初始化一开始需要关闭QSPI控制器,初始化结束后将QSPI使能。

2. 当前驱动关闭了直接访问模式

quirk是驱动特征调整标志变量,quirks仅仅定义了DAC模式关闭特征。

static const struct cqspi_driver_platdata cdns_qspi = {.quirks = CQSPI_DISABLE_DAC_MODE,
};

函数of_device_get_match_data()获取了quirks变量,并根据quirks变量设置核心结构的相关变量。

 ddata  = of_device_get_match_data(dev);if (ddata) {if (ddata->quirks & CQSPI_NEEDS_WR_DELAY)cqspi->wr_delay = 50 * DIV_ROUND_UP(NSEC_PER_SEC,cqspi->master_ref_clk_hz);if (ddata->hwcaps_mask & CQSPI_SUPPORTS_OCTAL)master->mode_bits |= SPI_RX_OCTAL | SPI_TX_OCTAL;if (!(ddata->quirks & CQSPI_DISABLE_DAC_MODE))cqspi->use_direct_mode = true;}

其中,根据当前quirks变量,cqspi->use_direct_mode 并没有被设置为true。

QSPI配置寄存器的bit[7]是可读写的DAC使能,0表示关闭(如果当前正在传输数据,当前传输结束后再关闭);1表示使能。

 /* Disable direct access controller */if (!cqspi->use_direct_mode) {reg = readl(cqspi->iobase + CQSPI_REG_CONFIG);reg &= ~CQSPI_REG_CONFIG_ENB_DIR_ACC_CTRL;writel(reg, cqspi->iobase + CQSPI_REG_CONFIG);}

3. 函数cqspi_controller_init()

驱动程序首次对qspi控制器进行初始化操作。

  1. AHB总线地址重映射地址为0x0。
  2. 写全零关闭中断。
  3. 配置内部SDRAM的读缓冲大小。注意:写缓冲大小就是SDRAM剩余部分。
  4. 配置内部SDRAM在AHB总线上的物理起始地址。
  5. 定义间接模式的读/写水印寄存器。
  6. 关闭DAC模式。
static void cqspi_controller_init(struct cqspi_st *cqspi)
{u32 reg;cqspi_controller_enable(cqspi, 0);/* Configure the remap address register, no remap */writel(0, cqspi->iobase + CQSPI_REG_REMAP);/* Disable all interrupts. */writel(0, cqspi->iobase + CQSPI_REG_IRQMASK);/* Configure the SRAM split to 1:1 . */writel(cqspi->fifo_depth / 2, cqspi->iobase + CQSPI_REG_SRAMPARTITION);/* Load indirect trigger address. */writel(cqspi->trigger_address,cqspi->iobase + CQSPI_REG_INDIRECTTRIGGER);/* Program read watermark -- 1/2 of the FIFO. */writel(cqspi->fifo_depth * cqspi->fifo_width / 2,cqspi->iobase + CQSPI_REG_INDIRECTRDWATERMARK);/* Program write watermark -- 1/8 of the FIFO. */writel(cqspi->fifo_depth * cqspi->fifo_width / 8,cqspi->iobase + CQSPI_REG_INDIRECTWRWATERMARK);/* Disable direct access controller */if (!cqspi->use_direct_mode) {reg = readl(cqspi->iobase + CQSPI_REG_CONFIG);reg &= ~CQSPI_REG_CONFIG_ENB_DIR_ACC_CTRL;writel(reg, cqspi->iobase + CQSPI_REG_CONFIG);}cqspi_controller_enable(cqspi, 1);
}

注意:

设备树需要定义"cdns,fifo-depth" 、"cdns,fifo-width" 和"cdns,trigger-address"三个量,这直接定义了cqspi->fifo_depth/fifo_width/trigger_address。

QSPI Flash驱动代码分析 (QSPI控制器初始化)相关推荐

  1. linux下nand flash驱动工作原理,Linux下Nand Flash 驱动代码分析

    随着越来越多的平台支持从Nand Flash 中启动,掌握Nand Flash 的驱动编写有着重要的现实意义,由于内核已经完成了大部分的工作,实际工作中大部分工程师对Nand Flash 驱动只是简单 ...

  2. linux pl320 mbox控制器驱动分析-(3) pl320驱动代码分析

    linux pl320 mbox控制器驱动分析-(3)pl320驱动代码分析 1 pl320 mbox控制器宏定义 2 初始化接口 3 ipc_handler mbox中断处理函数 4 数据的收发 4 ...

  3. 【接口时序】5、QSPI Flash的原理与QSPI时序的Verilog实现(转载)https://www.cnblogs.com/liujinggang/p/9651170.html

    一. 软件平台与硬件平台 软件平台: 1.操作系统:Windows-8.1 2.开发套件:ISE14.7 3.仿真工具:ModelSim-10.4-SE 4.Matlab版本:Matlab2014b/ ...

  4. 【接口时序】QSPI Flash的原理与QSPI时序的Verilog实现

    转载于:http://www.cnblogs.com/liujinggang/p/9651170.html 一. 软件平台与硬件平台 软件平台: 1.操作系统:Windows-8.1 2.开发套件:I ...

  5. DRM驱动代码分析:开机过程中显示驱动做了什么

    前言: 有些信息是在网上查资料后总结的,没有去追代码验证.如果有说得不对的地方,欢迎提出指正.感谢! 手机启动的大致流程 1.长按开机键 2.执行存储在ROM里(应该是某一个固定地址或是预定义的地址) ...

  6. 【鸿蒙OS开发入门】18 - HDF驱动子系统:加速度计传感器 Driver层驱动代码分析

    [鸿蒙OS开发入门]18 - HDF驱动子系统:加速度计传感器 Driver层代码分析 一.如何添加速度计传感器驱动代码(代码.编译.配置) 1.驱动代码实现 2.驱动编译配置 2.1 linux 编 ...

  7. ARM generic timer驱动代码分析

     转自 蜗窝科技 http://www.wowotech.net/linux_kenrel/arm-generic-timer.html 一.前言 关注ARM平台上timer driver(clo ...

  8. Xilinx XDMA 数据传输sgdma 驱动代码分析

    Xilinx XDMA 数据传输sgdma 驱动代码分析 我的之前两篇文章有介绍到上位机软件的逻辑该如何控制,驱动代码的框架是怎样的,驱动的整体逻辑在linux系统中是如何实现的,感兴趣的小伙伴可以去 ...

  9. S3C2440 Nand Flash驱动(分析MTD层并制作NAND驱动)(二十三)

    http://www.cnblogs.com/lifexy/p/7701181.html 1.本节使用的nand flash型号为K9F2G08U0C,它的命令如下: 1.1 我们以上图的Read I ...

最新文章

  1. [Spring mvc 深度解析(三)] 创建Spring MVC之器
  2. cad2017怎么改变选择方式_家用胎心仪怎么使用?建议孕妈妈选择数胎动的方式...
  3. 十八、PHP框架Laravel学习笔记——模型的增删改
  4. inputstreamreader 编码不完整_素材编码对剪辑效率的影响
  5. React系列——React Fiber 架构介绍资料汇总(翻译+中文资料)
  6. python变量赋值
  7. 国王游戏(贪心 + 高精度乘法 + 高精度除法 + 高精度比较大小)
  8. 【备忘】mysql常用操作汇总
  9. 使用arttemplate js模板引擎,直接用模板渲染,减少字符串拼接。
  10. 学习小实例--滚动条
  11. 为什么我一直强调大家要两条腿走路?
  12. springboot集成kettle9
  13. 等保之——等级保护2.0要求及所需设备清单
  14. Go语言安装与环境配置(基于Windows)
  15. 燃气流量计算机价格,燃气流量计价格常用解决方案「凯帝仪表」
  16. 基础实验——与V831串口通讯
  17. 微信小程序实现表情包编辑
  18. 1185_SPC560B60L7_ADC0标准通道的Injected转换模式
  19. Android 下拉选择框自定义view
  20. 7-60 有志者,事竟成

热门文章

  1. 贾平凹随笔之怀念路遥
  2. react获取不到目录中文件的坑
  3. Cocos Creator 性能优化:DrawCall
  4. 2022最新版校园跑腿小程序源码
  5. layui————一个页面展示两个页签
  6. 钟汉良日记:知识付费副业又收300
  7. Android 学习网站(资源收集)
  8. OPJ2018年算法课第二次作业:F.求逆序对数
  9. linux vi文件出现o e r d,vim常用命令大全
  10. js判断两个数组是否相同