UBOOT-SPI-FLASH的驱动分析

该博客详细介绍了SPI闪存加载镜像的过程,包括通过spi_flash_probe()进行设备验证,使用CMD_READ_ID获取设备ID,根据ID匹配SPI闪存参数,设置读写命令以及进入高速传输模式。文章深入探讨了SPI闪存的初始化步骤,为理解嵌入式系统的固件加载提供了基础。

一、入口:

spl_spi_load_image()->

                spi_flash_probe();

                spi_flash_read(flash, header);             //获取image头信息

                spi_parse_image_header();  

                spi_flash_read(flash, image.size);     //获取image的数据

二、spi_flash probe过程:

spi_flash_probe_slave() ->

                  1、spi_flash_cmd(spi, CMD_READ_ID, idcode);  首先获取SPI_FLASH ID;

                  2、spi_flash_validate_params(spi, idcode);

                        jedec = idcode[1] << 8 | idcode[2];

                        ext_jedec = idcode[3] << 8 | idcode[4];

                        从全局参数列表spi_flash_params_table[]中匹配jedec和ext_jedec;

                        flash->read_cmd =  //

                                这里根据RD_FULL匹配QUAD_FAST(4线模式);

                                              DU_FULL匹配DU_FAST(2线模式);

                                              普通(1线模式);

                        flash->write_cmd = 同上。

                        spi_flash_set_qeb(); 设置spi-flash的qeb标识,标识启动FAST传输模式。

<think>好的,我现在需要帮助用户分析、配置和测试U-Boot中的DW SPI驱动。首先,我需要回忆一下用户提供的引用内容,看看有哪些信息可以利用。引用[1]提到了在U-Boot中找到了winbond.c的驱动,说明U-Boot已经支持某些SPI NAND Flash。引用[2]涉及到设备树的修改和bootargs的配置,这可能和SPI的分区设置有关。引用[3]和[4]讨论了U-Boot的SPI驱动模型和核心层结构,尤其是关于spi_slave和设备树的配置。引用[5]提到了模块参数,但可能关联性不大。 用户的问题是针对DW SPI驱动分析、配置和测试。DW可能指的是DesignWare SPI控制器,这是常见于SoC中的IP核。首先,我需要确定U-Boot中DW SPI驱动的代码位置。通常,驱动会在drivers/spi或drivers/mtd/spi下。根据引用[4],spi.c是核心层,而具体控制器驱动可能在类似drivers/spi/designware_spi.c的位置。 接下来,配置部分。根据引用[2],设备树需要正确配置SPI节点,包括寄存器地址、时钟频率、片选引脚等。同时,可能需要启用相关的配置选项,比如CONFIG_SPI、CONFIG_DM_SPI和CONFIG_DESIGNWARE_SPI。在U-Boot的menuconfig中,用户需要进入SPI驱动配置,启用DesignWare SPI控制器支持。 然后是测试方法。用户可能需要通过SPI命令进行读写测试,比如使用sf probe探测设备,sf read和sf write进行数据传输。如果涉及到SPI Flash,还需要确认分区信息是否正确,如引用[2]中的mtdparts设置。 此外,引用[3]提到per_child_auto_alloc_size的设置,这可能涉及到SPI从设备的结构体分配,确保在设备树中正确声明SPI设备时,U-Boot能正确分配资源。 需要注意的问题包括时钟配置是否正确,片选信号是否有效,以及GPIO的设置是否匹配硬件连接。调试时可以通过增加调试输出,比如在驱动中启用DEBUG选项,或者通过示波器检查SPI信号波形。 总结步骤应该是:1. 确认驱动代码存在并启用配置;2. 修改设备树添加SPI控制器和从设备节点;3. 编译并烧写U-Boot;4. 使用U-Boot命令行工具测试SPI通信。过程中需要参考具体的硬件手册,确保寄存器地址和引脚配置正确。</think>### U-Boot DW SPI驱动分析、配置与测试教程 #### 一、驱动框架分析 DW SPI(DesignWare SPI驱动遵循U-Boot的驱动模型,核心结构包括: 1. **控制器驱动**:位于`drivers/spi/designware_spi.c`,实现`struct dm_spi_ops`接口[^4] 2. **设备树绑定**:需定义寄存器地址、时钟、工作模式等参数 3. **从设备管理**:通过`struct spi_slave`封装设备参数[^3] 典型驱动注册代码: ```c U_BOOT_DRIVER(designware_spi) { .name = "designware_spi", .id = UCLASS_SPI, .of_match = designware_spi_ids, .ops = &designware_spi_ops, .priv_auto_alloc_size = sizeof(struct dw_spi_priv), .per_child_auto_alloc_size = sizeof(struct spi_slave), // [^3] }; ``` #### 二、配置步骤 1. **Kconfig配置**: ```bash make menuconfig # 路径:SPI Support -> # [*] Enable SPI support # [*] DesignWare SPI controller # [*] DM_SPI (Driver Model) ``` 2. **设备树配置**(示例V3s): ```dts &spi0 { compatible = "snps,dw-apb-ssi"; reg = <0x01c68000 0x1000>; clocks = <&ccu CLK_BUS_SPI0>; resets = <&ccu RST_BUS_SPI0>; #address-cells = <1>; #size-cells = <0>; status = "okay"; flash@0 { compatible = "winbond,w25q128"; spi-max-frequency = <50000000>; reg = <0>; }; }; ``` 需确认寄存器地址、时钟与SoC手册一致[^2] 3. **编译验证**: ```bash make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j8 ``` #### 三、测试方法 1. **基础功能测试**: ```bash # 进入U-Boot命令行 => sf probe 0:0 # 初始化SPI0 CS0 => sf read 82000000 0 1000 # 读取前4KB数据到内存 => md 82000000 # 查看内存数据 => sf erase 0 1000 # 擦除前4KB => sf write 82000000 0 1000 # 写入测试数据 ``` 2. **性能测试**: ```bash => time sf read 82000000 0 100000 # 测量读取64KB耗时 ``` 3. **调试技巧**: - 启用驱动调试: ```c #define DEBUG // 在驱动文件中添加调试输出 ``` - 示波器验证CLK/MOSI信号时序 #### 四、常见问题排查 | 现象 | 排查点 | 工具 | |------|--------|------| | 无法探测设备 | 1. 设备树寄存器地址<br>2. 时钟使能状态<br>3. 片选GPIO配置 | `dm tree`命令<br>示波器 | | 数据传输错误 | 1. SPI模式(CPOL/CPHA)<br>2. 最大频率设置<br>3. 电源稳定性 | 逻辑分析仪 | | 驱动未加载 | 1. Kconfig配置状态<br>2. 设备树status属性<br>3. 兼容性字符串匹配 | `sf scan`命令 |
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值