QSPI Flash驱动代码分析 (QSPI控制器初始化)
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控制器进行初始化操作。
- AHB总线地址重映射地址为0x0。
- 写全零关闭中断。
- 配置内部SDRAM的读缓冲大小。注意:写缓冲大小就是SDRAM剩余部分。
- 配置内部SDRAM在AHB总线上的物理起始地址。
- 定义间接模式的读/写水印寄存器。
- 关闭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控制器初始化)相关推荐
- linux下nand flash驱动工作原理,Linux下Nand Flash 驱动代码分析
随着越来越多的平台支持从Nand Flash 中启动,掌握Nand Flash 的驱动编写有着重要的现实意义,由于内核已经完成了大部分的工作,实际工作中大部分工程师对Nand Flash 驱动只是简单 ...
- linux pl320 mbox控制器驱动分析-(3) pl320驱动代码分析
linux pl320 mbox控制器驱动分析-(3)pl320驱动代码分析 1 pl320 mbox控制器宏定义 2 初始化接口 3 ipc_handler mbox中断处理函数 4 数据的收发 4 ...
- 【接口时序】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/ ...
- 【接口时序】QSPI Flash的原理与QSPI时序的Verilog实现
转载于:http://www.cnblogs.com/liujinggang/p/9651170.html 一. 软件平台与硬件平台 软件平台: 1.操作系统:Windows-8.1 2.开发套件:I ...
- DRM驱动代码分析:开机过程中显示驱动做了什么
前言: 有些信息是在网上查资料后总结的,没有去追代码验证.如果有说得不对的地方,欢迎提出指正.感谢! 手机启动的大致流程 1.长按开机键 2.执行存储在ROM里(应该是某一个固定地址或是预定义的地址) ...
- 【鸿蒙OS开发入门】18 - HDF驱动子系统:加速度计传感器 Driver层驱动代码分析
[鸿蒙OS开发入门]18 - HDF驱动子系统:加速度计传感器 Driver层代码分析 一.如何添加速度计传感器驱动代码(代码.编译.配置) 1.驱动代码实现 2.驱动编译配置 2.1 linux 编 ...
- ARM generic timer驱动代码分析
转自 蜗窝科技 http://www.wowotech.net/linux_kenrel/arm-generic-timer.html 一.前言 关注ARM平台上timer driver(clo ...
- Xilinx XDMA 数据传输sgdma 驱动代码分析
Xilinx XDMA 数据传输sgdma 驱动代码分析 我的之前两篇文章有介绍到上位机软件的逻辑该如何控制,驱动代码的框架是怎样的,驱动的整体逻辑在linux系统中是如何实现的,感兴趣的小伙伴可以去 ...
- S3C2440 Nand Flash驱动(分析MTD层并制作NAND驱动)(二十三)
http://www.cnblogs.com/lifexy/p/7701181.html 1.本节使用的nand flash型号为K9F2G08U0C,它的命令如下: 1.1 我们以上图的Read I ...
最新文章
- [Spring mvc 深度解析(三)] 创建Spring MVC之器
- cad2017怎么改变选择方式_家用胎心仪怎么使用?建议孕妈妈选择数胎动的方式...
- 十八、PHP框架Laravel学习笔记——模型的增删改
- inputstreamreader 编码不完整_素材编码对剪辑效率的影响
- React系列——React Fiber 架构介绍资料汇总(翻译+中文资料)
- python变量赋值
- 国王游戏(贪心 + 高精度乘法 + 高精度除法 + 高精度比较大小)
- 【备忘】mysql常用操作汇总
- 使用arttemplate js模板引擎,直接用模板渲染,减少字符串拼接。
- 学习小实例--滚动条
- 为什么我一直强调大家要两条腿走路?
- springboot集成kettle9
- 等保之——等级保护2.0要求及所需设备清单
- Go语言安装与环境配置(基于Windows)
- 燃气流量计算机价格,燃气流量计价格常用解决方案「凯帝仪表」
- 基础实验——与V831串口通讯
- 微信小程序实现表情包编辑
- 1185_SPC560B60L7_ADC0标准通道的Injected转换模式
- Android 下拉选择框自定义view
- 7-60 有志者,事竟成