gpt4 book ai didi

c - U-Boot 2020.04 : Probing SPI flash fails - Invalid bus 0 (err=-19)

转载 作者:行者123 更新时间:2023-12-04 14:14:25 25 4
gpt4 key购买 nike

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

U-Boot 命令行的输出:

=> sf probe
Invalid bus 0 (err=-19)
Failed to initialize SPI flash at 0:0 (error -19)
=>

板上的设备树 SPI 部分:
&spi0 {
status = "okay";

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

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

我还尝试了不同的总线和芯片选择。但是没有用。
根据板上的原理图,SPI闪存设备 GD25Q128CS 用来。

我如何编译源代码:
$ 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

我用过官方 海合会来自 ARM website 的端口.

还尝试了旧版本和新版本的 U-Boot。同样的问题。我根据 U-Boot 文档刷新了 microSD 卡:
$ dd if=idbloader.img of=/dev/mmcblk0 seek=64
$ dd if=u-boot.itb of=/dev/mmcblk0 seek=16384

我怎样才能缩小这个问题的范围?少了什么?

更新:

似乎 U-Boot 没有从板上加载 SPI 驱动程序:
=> dm tree    
[...]
spi 0 [ ] rockchip_spi |-- spi@ff190000
spi_flash 0 [ ] spi_flash_std | `-- spiflash@0
[...]
=>

我也尝试过:

我已将以下配置添加到板文件中:
CONFIG_ROCKCHIP_SPI=y
CONFIG_SPI_FLASH=y
CONFIG_SPI_FLASH_GIGADEVICE=y

driver file我试图放一个简单的 printf()在函数开头 rockchip_spi_probe() .我还在驱动程序中添加了一个兼容标识符(与设备树中的字符串相同)。但不幸的是,探测函数永远不会被调用。

我是 U-Boot 的新手。任何形式的帮助都受到高度赞赏。

最佳答案

我终于解决了这个问题。
问题在于设备树文件中缺少条目(错误代码 -19 -- 感谢@Stefan 的回答)以及 SoC 中时钟驱动程序中缺少对 SPI Controller 的支持(错误代码 -2)。
我的工作修改:
SPI 驱动程序 (drivers/spi/rk_spi.c):

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):
我添加了这些新功能...
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);
}
...并将函数调用添加到函数 rk3328_clk_get_rate()rk3328_clk_set_rate()在 switch 语句中:
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;
}
设备树:
arch/arm/dts/rk3328-u-boot.dtsi:
我添加了正确的别名...
/ {
aliases {
mmc0 = &emmc;
mmc1 = &sdmmc;
spi0 = &spi0;
};
...以及 SPI Controller 本身。
&spi0 {
u-boot,dm-pre-reloc;
};
arch/arm/dts/rk3328-rock64-u-boot.dtsi:
对于 SPI 闪存,我添加了这些...
&spi0 {
spi_flash: spiflash@0 {
u-boot,dm-pre-reloc;
};
};
板卡配置(configs/rock64-rk3328_defconfig):
添加了这些配置开关...
CONFIG_ROCKCHIP_SPI=y
CONFIG_SPI_FLASH_GIGADEVICE=y
结果:
=> sf probe
SF: Detected gd25q128 with page size 256 Bytes, erase size 4 KiB, total 16 MiB
=>
SPI 闪存将被正确检测。
不确定我是否应该为此在 U-Boot 列表中发布补丁。

关于c - U-Boot 2020.04 : Probing SPI flash fails - Invalid bus 0 (err=-19),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61862722/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com