[PATCH] arm: dts: rockchip: Fix eMMC write on RK3528
    Jonas Karlman 
    jonas at kwiboo.se
       
    Thu Oct 30 20:41:03 CET 2025
    
    
  
Hi Tianling,
On 10/30/2025 7:12 PM, Tianling Shen wrote:
> Hi Jonas,
> 
> On 2025/6/14 6:43, Jonas Karlman wrote:
>> Writing to eMMC on RK3528 is affected with the same or a similar issue
>> as on RK3588, where eMMC must init to HS200 at least once to fully work.
>>
>> Trying to write u-boot-rockchip.bin to eMMC fails with:
>>
>>    => mmc write $fileaddr 40 5000
>>    MMC write: dev # 0, block # 64, count 20480 ... mmc write failed
>>    0 blocks written: ERROR
>>
>> For U-Boot to enable HS200 mode the mmc-hs200-1_8v prop must be defined
>> in the device tree. Linux does not seem to be affected and is able to
>> detect and use HS200 without this prop.
>>
>> Enable use of HS200 and fix eMMC write on RK3528 by adding the missing
>> mmc-hs200-1_8v prop for affected boards:
>>
>>    => mmc write $fileaddr 40 5000
>>    MMC write: dev # 0, block # 64, count 20480 ... 20480 blocks written: OK
>>
> 
> Sorry for the noise.
> 
> I recently got an E20C board, and I ran into a very stange issue, the 
> U-Boot throw errors with any mmc r/w operation, like `boot` or `mmc erase`:
> 
> ```
> => boot
> Scanning for bootflows in all bootdevs
> Seq  Method       State   Uclass    Part  Name                      Filename
> ---  -----------  ------  --------  ----  ------------------------ 
> ----------------
> Scanning global bootmeth 'efi_mgr':
>   ** fs_devread read error - block
>   ** fs_devread read error - block
> Card did not respond to voltage select! : -110
> Cannot persist EFI variables without system partition
>    0  efi_mgr      ready   (none)       0  <NULL>
> ** Booting bootflow '<NULL>' with efi_mgr
> Loading Boot0000 'mmc 0' failed
> EFI boot manager: Cannot load any image
> Boot failed (err=-14)
> Scanning bootdev 'mmc at ffc30000.bootdev':
> Card did not respond to voltage select! : -110
> Card did not respond to voltage select! : -110
> Card did not respond to voltage select! : -110
> Card did not respond to voltage select! : -110
> Scanning bootdev 'mmc at ffbf0000.bootdev':
>   ** fs_devread read error - block
>   ** fs_devread read error - block
>   ** fs_devread read error - block
> Unknown uclass 'nvme' in label
> Unknown uclass 'scsi' in label
> No USB controllers found
> Scanning bootdev 'ethernet at ffbe0000.bootdev':
> ethernet at ffbe0000 Waiting for PHY auto negotiation to complete..user 
> interrupt!
> phy_startup() failed: -4
> FAILED: -4
> BOOTP broadcast 1
> 
> => mmc read $loadaddr 0x40 0x4000
> MMC read: dev # 0, block # 64, count 16384 ... 0 blocks read: ERROR
> 
> => mmc erase 0x40 0x4000
> MMC erase: dev # 0, block # 64, count 16384 ... mmc erase failed
> 0 blocks erased: ERROR
> 
> => mmc part
> 
> Partition Map for mmc device 0  --   Partition Type: DOS
> 
> Part	Start Sector	Num Sectors	UUID		Type
> ** Can't read partition table on 0:0 **
> ```
> 
> By checking the mmc information:
> ```
> => mmc info
> Device: mmc at ffbf0000
> Manufacturer ID: ef
> OEM: 0
> Name: TLi16G
> Bus Speed: 200000000
> Mode: HS200 (200MHz)
> Rd Block Len: 512
> MMC version 5.1
> High Capacity: Yes
> Capacity: 14.7 GiB
> Bus Width: 4-bit
> Erase Group Size: 512 KiB
> HC WP Group Size: 128 MiB
> User Capacity: 14.7 GiB WRREL
> Boot Capacity: 4 MiB ENH
> RPMB Capacity: 4 MiB ENH
> ```
> 
> I found the bus width is not corrent, and no "Boot area X is not write 
> protected" tip.
> 
> This is the working `mmc info` output:
> ```
> Device: mmc at ffbf0000
> Manufacturer ID: ef
> OEM: 0
> Name: TLi16G
> Bus Speed: 200000000
> Mode: HS200 (200MHz)
> Rd Block Len: 512
> MMC version 5.1
> High Capacity: Yes
> Capacity: 14.7 GiB
> Bus Width: 8-bit
> Erase Group Size: 512 KiB
> HC WP Group Size: 128 MiB
> User Capacity: 14.7 GiB WRREL
> Boot Capacity: 4 MiB ENH
> RPMB Capacity: 4 MiB ENH
> Boot area 0 is not write protected
> Boot area 1 is not write protected
> ```
> 
> I tried to use the generic-rk3528 configuration, and it seems to work.
> After making some tests (about 50 times reboot/reset), I found the eMMC 
> works fine if `CONFIG_REGULATOR_PWM=y` is disabled.
> This is a bit weird. Maybe disabling this option just hides the real issue?
Interesting information and thanks for testing!
Without REGULATOR_PWM=y the cpu and logic regulators will keep their reset
init values instead of U-Boot trying to configure these pwm regulators.
The generic-rk3528 target does not include information about any of these
regulators so they would keep using the reset init values.
There could be two issues related to this, first both the pwm regulator
and rk pwm driver are not fully aligned with Linux and round values a
little bit different. I have some local work-in-progress patches that I
should complete and send out to fix this discrepancy.
The second issue could be that the logic regulator should be configured
with a higher regulator-init-microvolt value so that U-Boot do not
re-configure the regulator with a lower voltage than it has after reset.
Did your testing also include the "mmc: rockchip_sdhci: Set xx_TAP_VALUE
for RK3528" [1] patch?
> 
> Here's the build information:
> U-Boot commit: 4cad9faf8d28 ("MAINTAINERS: update my email address")
> rkbin commit: 74213af1e952 ("rv1126b: bl31: update version to v1.07")
> Build command:
> make CROSS_COMPILE=aarch64-linux-musl- 
> BL31=../rkbin/bin/rk35/rk3528_bl31_v1.20.elf 
> ROCKCHIP_TPL=../rkbin/bin/rk35/rk3528_ddr_1056MHz_v1.11.bin
I will make some runtime test on my E20C using these as a base and see
if I can replicate a similar issue.
I have also pushed my local pwm-regulator/rk-pwm relates patches to [2],
they need some re-work before being ready to be sent out.
[1] https://lore.kernel.org/u-boot/20250714203410.1782783-1-jonas@kwiboo.se/
[2] https://source.denx.de/u-boot/contributors/kwiboo/u-boot/-/commits/rk3528
Regards,
Jonas
> 
> Any help will be greatly appreciated!
> 
> Thanks,
> Tianling.
> 
>> Fixes: b112a44531cb ("board: rockchip: Add minimal generic RK3528 board")
>> Fixes: ccbddf645310 ("board: rockchip: Add Radxa E20C")
>> Signed-off-by: Jonas Karlman <jonas at kwiboo.se>
>> ---
>> Kever, Tom: Please consider this for the v2025.07 release as support for
>> RK3528 was added in v2025.07-rc1.
>> ---
>>   arch/arm/dts/rk3528-generic.dts            | 1 +
>>   arch/arm/dts/rk3528-radxa-e20c-u-boot.dtsi | 4 ++++
>>   2 files changed, 5 insertions(+)
>>
>> diff --git a/arch/arm/dts/rk3528-generic.dts b/arch/arm/dts/rk3528-generic.dts
>> index 792d3e04a4cb..3f6f0bed108d 100644
>> --- a/arch/arm/dts/rk3528-generic.dts
>> +++ b/arch/arm/dts/rk3528-generic.dts
>> @@ -18,6 +18,7 @@
>>   &sdhci {
>>   	bus-width = <8>;
>>   	cap-mmc-highspeed;
>> +	mmc-hs200-1_8v;
>>   	no-sd;
>>   	no-sdio;
>>   	non-removable;
>> diff --git a/arch/arm/dts/rk3528-radxa-e20c-u-boot.dtsi b/arch/arm/dts/rk3528-radxa-e20c-u-boot.dtsi
>> index 9c2f03a786cf..1372d8f1e38a 100644
>> --- a/arch/arm/dts/rk3528-radxa-e20c-u-boot.dtsi
>> +++ b/arch/arm/dts/rk3528-radxa-e20c-u-boot.dtsi
>> @@ -2,6 +2,10 @@
>>   
>>   #include "rk3528-u-boot.dtsi"
>>   
>> +&sdhci {
>> +	mmc-hs200-1_8v;
>> +};
>> +
>>   &sdmmc {
>>   	bus-width = <4>;
>>   	cap-mmc-highspeed;
> 
    
    
More information about the U-Boot
mailing list