環境
開發板:orangepi3B
CPU:rk3566
TF卡速度標識:C10,U3,V30
起因
對于tf卡啟動的系統來說,io會成為一個很關鍵的瓶頸,所以總希望系統能跑得快一點。我手頭用的是一張金士頓的高性能tf卡,開機啟動發現比emmc慢不少,用dd命令簡單測速發現tf卡讀寫速度都只有25Mb/s而這個卡在usb3.0讀卡器加持下可以達到80Mb/s的寫入,150Mb/s的讀取速度,最后發現SDIO工作模式不正確導致的,下面說一下解決過程,方法理論上適用于所有支持sdio uhs的開發板。
解決過程
翻閱orangepi3b內核設備樹配置,發現這個板子是支持uhs SDR104并且已經啟用了uhs SDR104功能的。
從tf卡啟動系統之后查看內核日志發現tf卡工作在high speed模式,頻率只有50MHz,這里orangepi3b tf卡用了mmc1這個位置,mmc0是emmc
root@orangepi3b:/home/orangepi# dmesg |grep mmc1
[ 10.260135] vccio_sd: ramp_delay not set
[ 10.272792] mmc_host mmc1: Bus speed (slot 0) = 375000Hz (slot req 400000Hz, actual 375000HZ div = 0)
[ 10.314653] mmc_host mmc1: Bus speed (slot 0) = 50000000Hz (slot req 50000000Hz, actual 50000000HZ div = 0)
[ 10.314992] mmc1: new high speed SDXC card at address 5048
[ 10.316478] mmcblk1: mmc1:5048 SD128 116 GiB
[ 10.325545] mmcblk1: p1 p2
查看debugfs亦是如此:
root@orangepi3b:/home/orangepi# cat /sys/kernel/debug/mmc1/ios
clock: 50000000 Hz
vdd: 21 (3.3 ~ 3.4 V)
bus mode: 2 (push-pull)
chip select: 0 (don't care)
power mode: 2 (on)
bus width: 2 (4 bits)
timing spec: 2 (sd high-speed)
signal voltage: 0 (3.30 V)
driver type: 0 (driver type B)
但是,但是,但是,從emmc啟動系統之后再插入tf卡,而不是從tf卡啟動系統,情況就變得不一樣了
root@orangepi3b:/home/orangepi# dmesg |grep mmc1
[ 4156.323455] vccio_sd: ramp_delay not set
[ 4156.346018] mmc_host mmc1: Bus speed (slot 0) = 148500000Hz (slot req 150000000Hz, actual 148500000HZ div = 0)
[ 4156.610947] dwmmc_rockchip fe2b0000.dwmmc: Successfully tuned phase to 270
[ 4156.610973] mmc1: new ultra high speed SDR104 SDXC card at address 5048
[ 4156.612291] mmcblk1: mmc1:5048 SD128 116 GiB
[ 4156.617655] mmcblk1: p1 p2
root@orangepi3b:/home/orangepi# cat /sys/kernel/debug/mmc1/ios
clock: 150000000 Hz
actual clock: 148500000 Hz
vdd: 21 (3.3 ~ 3.4 V)
bus mode: 2 (push-pull)
chip select: 0 (don't care)
power mode: 2 (on)
bus width: 2 (4 bits)
timing spec: 6 (sd uhs SDR104)
signal voltage: 1 (1.80 V)
driver type: 0 (driver type B)
那問題也顯而易見了,tf卡在uboot啟動階段被初始化成了high speed模式,然后內核在初始化的時候并沒有再去重新配置tf卡的速度和工作模式了,這里有一個比較簡單的辦法在tf卡啟動系統過后切換到uhs SDR104模式:
root@orangepi3b:/home/orangepi# echo 150000000 > /sys/kernel/debug/mmc1/clock
只需要將sdio口的評率設置上去即可,這個時候再看debugfs會發現評率其實已經切換了,但是模式還沒有切換,這個不用擔心,之后對tf進行讀寫操作就會切換tf卡的模式為uhs SDR104了
root@orangepi3b:/home/orangepi# cat /sys/kernel/debug/mmc1/ios
clock: 150000000 Hz
actual clock: 148500000 Hz
vdd: 21 (3.3 ~ 3.4 V)
bus mode: 2 (push-pull)
chip select: 0 (don't care)
power mode: 2 (on)
bus width: 2 (4 bits)
timing spec: 2 (sd high-speed)
signal voltage: 0 (3.30 V)
driver type: 0 (driver type B)
切換過后一會兒的效果,可以看到模式已經切換到SDR104
root@orangepi3b:/home/orangepi# cat /sys/kernel/debug/mmc1/ios
clock: 150000000 Hz
actual clock: 148500000 Hz
vdd: 21 (3.3 ~ 3.4 V)
bus mode: 2 (push-pull)
chip select: 0 (don't care)
power mode: 2 (on)
bus width: 2 (4 bits)
timing spec: 6 (sd uhs SDR104)
signal voltage: 1 (1.80 V)
driver type: 0 (driver type B)
這個方法的缺點是系統啟動完成過后才能切換,開機速度依然上不去。
這個方法理論上適用于其他芯片和板子,希望這邊文章能對tf卡啟動開發板的小伙伴有一定的幫助。