ITX-3588J

本帖最后由 Bennett 于 2023-5-6 14:48 编辑

请教一下ITX-3588J的uboot是否支持spi flash,我想在uboot命令行通过sf命令去读写spi flash。

目前硬件上是没有贴SPI flash

jpchen 发表于 2023-5-6 17:07
目前硬件上是没有贴SPI flash

那这个sf的命令是干什么的呢,不是操作SPI FLASH的吗?
我自己买了一个w25q128接在了板子上唯一一个叫SPI1_M2的四个引出来的针脚上。可以通过这个sf命令来操作我外接的flash吗?

uboot 需要自行打开对应的 spi 功能,以及添加对应的 spi 设备,才可以使用 sf 进行读写和擦除

Oliver_Li 发表于 2023-5-10 14:46
uboot 需要自行打开对应的 spi 功能,以及添加对应的 spi 设备,才可以使用 sf 进行读写和擦除

我感觉我都打开了,在uboot下面的menuconfig中将SPI和winbond的SPI FLASH的宏都勾选上了,但是我插不插上外接的SPI FLASH都是一样的串口打印。。。

menuconfig 打开没用吧,RK 都使用默认的 config 文件的,不是使用 menuconfig 的。

Oliver_Li 发表于 2023-5-11 11:32
menuconfig 打开没用吧,RK 都使用默认的 config 文件的,不是使用 menuconfig 的。

是的,我后来去修改kconfig中的文件,在u-boot/driver/mtd/spi下面的kconfig中

Oliver_Li 发表于 2023-5-10 14:46
uboot 需要自行打开对应的 spi 功能,以及添加对应的 spi 设备,才可以使用 sf 进行读写和擦除

请问一下你说的添加对应的spi设备是什么意思,我来理解就是添加设备树吧?

Bennett 发表于 2023-5-12 11:07
请问一下你说的添加对应的spi设备是什么意思,我来理解就是添加设备树吧?

是的。
首先在 Kconfig 支持 对于的设备,然后在例如:u-boot/configs/rk3588_defconfig(相当于 menuconfig) 使能该 Config。之后在设备树配置这款 spi 设备,然后编译。

Oliver_Li 发表于 2023-5-12 16:41
是的。
首先在 Kconfig 支持 对于的设备,然后在例如:u-boot/configs/rk3588_defconfig(相当于 menuco …

我这些都搞了显示读不到FLASH的ID,具体的flash相关的设备树我是在rk588-u-boot.dtsi文件里添加的,串口打印显示找不到我添加的flash,而且我把flash插在板子上和拔掉,串口的打印几乎一模一样。。。我加了打印代码走到了spi-nor-core.c中的spi_nor_read_id函数里面,并且在这个函数里面返回unrecognized JEDEC id bytes,还有一个有意思的是,和spi-nor-core.c同路径的还有一个叫spi_flash.c的,里面也有都flash的ID的函数,我一开始感觉应该走到这个函数里面,但是加打印发现走的是spi-nor-core.c这个里面去了,而且在spi-nor-core.c最开始的注释说了是Based on m25p80.c,这个是美光的flash,但我买的是winbond的flash,而且makefile里面也只编译了spi-nor-core.c没有编译spi_flash.c,,我在makefile里面将spi_flash.c添加进去,但是编译的时候一大堆报错,,,我现在的疑惑是rk3588的sf命令到底支不支持winbond的flash啊。

优先你要先确定你配置的设备树节点,在 uboot 阶段是否给正确 probe 了,因为在 uboot 阶段,设备的 probe 是需要手动调用 probe 函数的,和 kenrel 的自动调用不一样。

rk3588 的 sf 是支持 winbond 的 flash 的。

Oliver_Li 发表于 2023-5-13 09:32
优先你要先确定你配置的设备树节点,在 uboot 阶段是否给正确 probe 了,因为在 uboot 阶段,设备的 probe …

现在就是在第一步sf probe 1:0的时候出错,读不到flash的ID,我在rk3588-u-boot.dtsi中添加的设备树如下:

&spi1 {
u-boot,dm-spl;
status = “okay”;

#address-cells = <1>;
#size-cells = <0>;
pinctrl-0 = <&spi1m2_cs0 &spi1m2_cs1 &spi1m2_pins>;
pinctrl-1 = <&spi1m2_cs0 &spi1m2_cs1 &spi1m2_pins_hs>;
spi_norflash: flash@00 {
	u-boot,dm-spl;
	compatible = "jedec,spi-nor";
	label = "spi_nor";
	reg = <0x00>;
	spi-tx-bus-width = <1>;
	spi-rx-bus-width = <4>;
	spi-max-frequency = <50000000>;
	status = "okay";
};

};

Bennett 发表于 2023-5-18 20:05
现在就是在第一步sf probe 1:0的时候出错,读不到flash的ID,我在rk3588-u-boot.dtsi中添加的设备树如下 …

还有一个问题是在id=67,就是UCLASS_SPI_FLASH的时候显示not found:
File:drivers/core/uclass.c Function:uclass_get Line:153 id = 67
File:drivers/core/uclass.c Function:uclass_find Line:27
File:drivers/core/uclass.c Function:uclass_get Line:155 uc =00000000ebc1ec70
File:drivers/core/uclass.c Function:uclass_find_device_by_seq Line:277 ret = 0
File:drivers/core/uclass.c Function:uclass_find_device_by_seq Line:283 dev = 00000000ebc1ecb0 dev->req_seq = -1 dev->seq = -1 dev->name: flash@00
File:drivers/core/uclass.c Function:uclass_find_device_by_seq Line:293 - not found

Bennett 发表于 2023-5-18 20:09
还有一个问题是在id=67,就是UCLASS_SPI_FLASH的时候显示not found:
File:drivers/core/uclass.c Functi …

在File:drivers/core/device.c Function:device_probe Line:519 ret = -2返回错误

if (drv->probe) {
ret = drv->probe(dev);
printf(“File:%s Function:%s Line:%d ret = %d\n”, FILE, FUNCTION, LINE, ret);
if (ret) {
dev->flags &= ~DM_FLAG_ACTIVATED;
goto fail;
}
}

其实你参照 kernel 的 dts 配置就行了,因为你在 kenrel 配置了 spi flash ,在 uboot 阶段, dtb 会给 overlay 的,内核的 dts 应该有相关的 spi flash 参考的。
然后你在 uboot 不需要在代码加 probe 的动作应该,你使用命令应该也可以进行 probe(手动)

Oliver_Li 发表于 2023-5-25 14:15
其实你参照 kernel 的 dts 配置就行了,因为你在 kenrel 配置了 spi flash ,在 uboot 阶段, dtb 会给 ove …

rk3588的kernel并没有配置spi flash的设备树,我现在在kernel里面读出来的id是ff ff ff ff ff ff…
我把flash拔掉读出来的也还是ff ff ff ff ff ff…
感觉没用。

https://wiki.t-firefly.com/zh_CN/Core-3588J/usage_spi.html

有参考这个么?