首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >U 2020.04:探测SPI闪存失败-无效总线0 (err=-19)

U 2020.04:探测SPI闪存失败-无效总线0 (err=-19)
EN

Stack Overflow用户
提问于 2020-05-18 05:00:19
回答 2查看 2.6K关注 0票数 4

我刚刚编译了U-Boot 2020.04,用于PINE64 ROCK64媒体板。它编译得很好,没有错误。但是当我试图探测SPI闪光灯时,我遇到了一个问题。

output命令行的输出:

代码语言:javascript
复制
=> sf probe
Invalid bus 0 (err=-19)
Failed to initialize SPI flash at 0:0 (error -19)
=>

来自董事会的设备树SPI部分:

代码语言:javascript
复制
&spi0 {
    status = "okay";

    spiflash@0 {
        compatible = "jedec,spi-nor";
        reg = <0>;

        /* maximum speed for Rockchip SPI */
        spi-max-frequency = <50000000>;
    };
};

我也试过不同的总线和芯片选择。但没起作用。根据电路板的原理图,使用了SPI闪存装置GD25Q128CS

我是如何编辑这些资料的:

代码语言:javascript
复制
$ make rock64-rk3328_defconfig
$ make CROSS_COMPILE=/path/to/gcc-arm-9.2-2019.12-x86_64-aarch64-none-elf/bin/aarch64-none-elf- -j 4

我使用了官方的GCC港口从ARM网站

还尝试了一个旧版本和一个更新版本的U-Boot。同样的问题。我根据U文档显示了microSD卡:

代码语言:javascript
复制
$ dd if=idbloader.img of=/dev/mmcblk0 seek=64
$ dd if=u-boot.itb of=/dev/mmcblk0 seek=16384

我怎样才能缩小这个问题呢?少了点什么?

更新:

似乎U-Boot没有从板上加载SPI驱动程序:

代码语言:javascript
复制
=> dm tree    
 [...]
  spi           0  [   ]   rockchip_spi          |-- spi@ff190000                                                        
  spi_flash     0  [   ]   spi_flash_std         |   `-- spiflash@0
 [...]
=>

我也尝试过:

我在董事会文件中添加了以下配置:

代码语言:javascript
复制
CONFIG_ROCKCHIP_SPI=y
CONFIG_SPI_FLASH=y
CONFIG_SPI_FLASH_GIGADEVICE=y

驱动文件中,我尝试在函数rockchip_spi_probe()的开头放置一个简单的printf()。我还在驱动程序中添加了一个兼容的标识符(与设备树中的字符串相同)。但不幸的是,探测函数从未被调用过。

我是个新手。任何形式的帮助都是非常感谢的。

EN

回答 2

Stack Overflow用户

发布于 2020-07-03 16:52:13

我终于解决了这个问题。

问题是缺少了设备树文件中的条目(错误代码-19 --感谢@Stefan的回答),以及SoC缺少对时钟驱动程序中的SPI控制器的支持(错误代码-2)。

我的工作修改:

SPI驱动程序( driver /spi/rk_Spi.c):

代码语言:javascript
复制
static const struct udevice_id rockchip_spi_ids[] = {
    { .compatible = "rockchip,rk3066-spi" },
    { .compatible = "rockchip,rk3288-spi" },
    { .compatible = "rockchip,rk3328-spi" },
    { .compatible = "rockchip,rk3368-spi",
      .data = (ulong)&rk3399_spi_params },
    { .compatible = "rockchip,rk3399-spi",
      .data = (ulong)&rk3399_spi_params },
    { }
};

这里我简单地为指定的设备添加了设备ID字符串(rockchip,rk3328-spi)。不确定是否也需要rk3399_spi_params。但没有它就行了。

(drivers/clk/rockchip/clk_rk3328.c): 时钟驱动程序

我增加了这些新功能..。

代码语言:javascript
复制
static ulong rk3328_spi_get_clk(struct rk3328_cru *cru)
{
    u32 div, val;

    val = readl(&cru->clksel_con[24]);
    div = (val & CLK_SPI_DIV_CON_MASK) >> CLK_SPI_DIV_CON_SHIFT;

    return DIV_TO_RATE(OSC_HZ, div);
}

static ulong rk3328_spi_set_clk(struct rk3328_cru *cru, uint hz)
{
    u32 src_clk_div;

    src_clk_div = GPLL_HZ / hz;
    assert(src_clk_div < 128);

    rk_clrsetreg(&cru->clksel_con[24],
             CLK_PWM_PLL_SEL_MASK | CLK_PWM_DIV_CON_MASK,
             CLK_PWM_PLL_SEL_GPLL << CLK_PWM_PLL_SEL_SHIFT |
             (src_clk_div - 1) << CLK_PWM_DIV_CON_SHIFT);

    return rk3328_spi_get_clk(cru);
}

...and在开关语句中添加了对函数rk3328_clk_get_rate()rk3328_clk_set_rate()的函数调用:

代码语言:javascript
复制
static ulong rk3328_clk_get_rate(struct clk *clk)
{
    struct rk3328_clk_priv *priv = dev_get_priv(clk->dev);
    ulong rate = 0;

    switch (clk->id) {
    case 0 ... 29:
        return 0;
    case HCLK_SDMMC:
    case HCLK_EMMC:
    case SCLK_SDMMC:
    case SCLK_EMMC:
        rate = rk3328_mmc_get_clk(priv->cru, clk->id);
        break;
    case SCLK_I2C0:
    case SCLK_I2C1:
    case SCLK_I2C2:
    case SCLK_I2C3:
        rate = rk3328_i2c_get_clk(priv->cru, clk->id);
        break;
    case SCLK_PWM:
        rate = rk3328_pwm_get_clk(priv->cru);
        break;
    case SCLK_SARADC:
        rate = rk3328_saradc_get_clk(priv->cru);
        break;
    case SCLK_SPI:
        rate = rk3328_spi_get_clk(priv->cru);
        break;
    default:
        return -ENOENT;
    }

    return rate;
}

static ulong rk3328_clk_set_rate(struct clk *clk, ulong rate)
{
    struct rk3328_clk_priv *priv = dev_get_priv(clk->dev);
    ulong ret = 0;

    switch (clk->id) {
    case 0 ... 29:
        return 0;
    case HCLK_SDMMC:
    case HCLK_EMMC:
    case SCLK_SDMMC:
    case SCLK_EMMC:
        ret = rk3328_mmc_set_clk(priv->cru, clk->id, rate);
        break;
    case SCLK_I2C0:
    case SCLK_I2C1:
    case SCLK_I2C2:
    case SCLK_I2C3:
        ret = rk3328_i2c_set_clk(priv->cru, clk->id, rate);
        break;
    case SCLK_MAC2IO:
        ret = rk3328_gmac2io_set_clk(priv->cru, rate);
        break;
    case SCLK_PWM:
        ret = rk3328_pwm_set_clk(priv->cru, rate);
        break;
    case SCLK_SARADC:
        ret = rk3328_saradc_set_clk(priv->cru, rate);
        break;
    case SCLK_SPI:
        ret = rk3328_spi_set_clk(priv->cru, rate);
        break;
    case DCLK_LCDC:
    case SCLK_PDM:
    case SCLK_RTC32K:
    case SCLK_UART0:
    case SCLK_UART1:
    case SCLK_UART2:
    case SCLK_SDIO:
    case SCLK_TSP:
    case SCLK_WIFI:
    case ACLK_BUS_PRE:
    case HCLK_BUS_PRE:
    case PCLK_BUS_PRE:
    case ACLK_PERI_PRE:
    case HCLK_PERI:
    case PCLK_PERI:
    case ACLK_VIO_PRE:
    case HCLK_VIO_PRE:
    case ACLK_RGA_PRE:
    case SCLK_RGA:
    case ACLK_VOP_PRE:
    case ACLK_RKVDEC_PRE:
    case ACLK_RKVENC:
    case ACLK_VPU_PRE:
    case SCLK_VDEC_CABAC:
    case SCLK_VDEC_CORE:
    case SCLK_VENC_CORE:
    case SCLK_VENC_DSP:
    case SCLK_EFUSE:
    case PCLK_DDR:
    case ACLK_GMAC:
    case PCLK_GMAC:
    case SCLK_USB3OTG_SUSPEND:
        return 0;
    default:
        return -ENOENT;
    }

    return ret;
}

Device-Trees:

arch/arm/dts/arm 3328-u-boot.dtsi:

我增加了正确的别名..。

代码语言:javascript
复制
/ {
    aliases {
        mmc0 = &emmc;
        mmc1 = &sdmmc;
        spi0 = &spi0;
    };

...and SPI控制器本身。

代码语言:javascript
复制
&spi0 {
    u-boot,dm-pre-reloc;
};

arch/arm/dts/arm 3328-rock64 64-u-boot.dtsi:

为了SPI闪光灯我加了这些..。

代码语言:javascript
复制
&spi0 {
    spi_flash: spiflash@0 {
        u-boot,dm-pre-reloc;
    };
};

(configs/rock64-rk3328_defconfig): 板配置

增加了这些配置开关。

代码语言:javascript
复制
CONFIG_ROCKCHIP_SPI=y
CONFIG_SPI_FLASH_GIGADEVICE=y

结果:

代码语言:javascript
复制
=> sf probe
SF: Detected gd25q128 with page size 256 Bytes, erase size 4 KiB, total 16 MiB
=>

SPI闪光灯将被正确检测到。

不确定是否应该在U列表中发布这个补丁。

票数 2
EN

Stack Overflow用户

发布于 2020-05-20 08:26:32

你能试着添加:

代码语言:javascript
复制
spi0 = &spi0;

文件in 3399.dtsi中的别名部分?有零钱吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61862722

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档