2024年7月14日 星期日

Notes for JEDEC Standard No. 84-B51A - CH1~CH5


eMMC是一種管理型記憶體(managed memory ),專為儲存代碼和資料而設計,具有低功耗的特點,非常適合行動裝置使用。
eMMC 通訊匯流排: eMMC 使用一個包含11個訊號的匯流排進行通信,包括Clock、Data Strobe(資料同步訊號)、1位元Command、8位元Data Bus。

Clock: 支援的時脈頻率範圍為0到200MHz。
Data Bus: eMMC支援三種不同的資料匯流排寬度模式:1位(預設)、4位和8位。這些模式允許根據需要調整資料傳輸速度和並行性。

eMMC 的優勢:
低功耗: eMMC 設計具有低功耗特性,適合在電池供電的行動裝置中使用。 間接記憶體存取: eMMC 透過一個獨立的控制器來實現間接記憶體存取。這意味著設備可以在不依賴主機軟體的情況下處理後台記憶體管理任務。這種特性簡化了主機系統上的快閃記憶體管理層。


在 eMMC裝置中,記憶體定址和容量由定址模式和磁區大小決定。主要模式:byte addressing與sector addressing。
byte addressing:使用 32 位元直接定址單一位元組,最高支援 2GB,對於更大容量,這種定址模式不切實際。
sector addressing:對於大於 2GB 的設備,eMMC 切換到sector addressing。在這種模式下,定址指的是磁區而不是單一位元組。磁區大小通常為 512 位元組或 4 KB。
512B:理論上可以支援最高 2 TiB 的記憶體,2^32 個磁區 × 512 位元組/磁區 = 2^32 × 2^9 位元組 = 2^41 位元組 = 2 TiB。實際上,最大容量通常被認為是 256GB。這個差異是由於控制器複雜性、邏輯到實體位址映射、磨損均衡和壞區塊管理等開銷所致,這些都會消耗額外的資源。
4 KB 區:理論上可以支援最高2^32 個磁區 × 4 KB/磁區 = 2^32 × 2^12 位元組 = 2^44 位元組 = 16 TiB
控制器複雜性: 隨著磁區大小的減少和容量的增加,邏輯到實體映射、磨損均衡和壞區塊管理的複雜性和開銷也隨之增加。

eMMC 訊號線的解釋
CLK(時脈訊號):控制資料傳輸的時序。每個時脈週期觸發指令線上傳輸一位數據,資料線則傳輸一位(1x)或兩位數(2x)數據,視工作模式而定。時脈頻率可以從零到設備支援的最大頻率變化(0~200MHz)。

Data Strobe(資料同步訊號):eMMC 設備生成,用於 HS400 模式下的資料同步。Data Strobe的頻率與時脈訊號(CLK)頻率相符。對於資料輸出,每個週期可以傳輸兩位資料(一個在正邊緣,一個在負邊緣)。對於 CRC 狀態回應和指令回應輸出(僅在 HS400 enhanced strobe mode下),CRC 狀態和指令回應僅在正邊緣上鎖存,負邊緣則不考慮。

CMD(命令訊號):CMD 訊號是一個雙向頻道,用於從 eMMC host發送命令到 eMMC 設備,並接收設備的回應。它有兩種工作模式:
Open-Drain Mode: 初始化期間使用,以最小化雜訊並確保訊號完整性。這種模式對訊號完整性問題有較高的容忍度。
Push-Pull Mode: 用於快速指令傳輸,此模式下訊號主動驅動至高或低電平,實現邏輯狀態之間的快速可靠轉換。

DAT0-DAT7:是雙向資料線,用於在Host和 eMMC 裝置之間傳輸資料。它們工作在Push-Pull Mode模式下,允許快速資料傳輸,因為在任一時刻只有設備或主機驅動這些訊號。
通電或重置後,最初只有 DAT0 用於資料傳輸。然而,資料匯流排寬度可以擴展到包括 DAT0-DAT3(4 位元模式)或 DAT0-DAT7(8 位元模式),以增加資料吞吐量。 eMMC 裝置為 DAT1-DAT7 提供內部上拉電阻,當裝置進入對應的寬匯流排模式(4 位元或 8 位元)時,這些上拉電阻會被斷開。





bus protocol
在裝置上電重設後,主機必須透過特定的訊息初始化裝置。每個訊息由以下幾種標記組成:
Command:CMD是從主機發送到設備。命令透過 CMD 線傳輸。
Response:Response是設備作為先前接收到的命令的回復發送給主機的標記。響應同樣透過 CMD 線串行傳輸。
Data:Data可以從裝置傳輸到主機,也可以從主機傳輸到裝置。資料透過data bus傳輸,資料線的數量可以是 1(DAT0)、4(DAT0-DAT3)或 8(DAT0-DAT7)。對於每條資料線,資料傳輸可以是單一資料速率(每個時脈週期傳輸一位元)或雙資料速率(每個時脈週期傳輸兩位元)。


eMMC 指令和資料傳輸
命令發送一個資料塊後接 CRC 位元。讀取和寫入操作都允許單一或多個區塊的傳輸。多個區塊的傳輸會在 CMD 線上的停止命令發出後終止,類似於順序讀取。




寫入操作: 區塊寫入操作使用簡單DAT0傳輸忙碌訊號。




指令標記:每個指令標記前方有一個起始位元(‘0’)和一個結束位元(‘1’),總長度為 48 位元。每個標記都受到 CRC 位元的保護,以便偵測傳輸錯誤,如果發生錯誤,操作可以重複。


回應標記:根據其內容有五種編碼方案。標記長度為 48 位元或 136 位元。區塊資料的 CRC 保護演算法採用 16 位元 CCITT 多項式。這些規範確保 eMMC 設備與主機之間的資料和命令傳輸的可靠性和完整性。




    參考資料:
  • JESD84-B51A (Revision of JESD84-B51, February 2015)



2024年7月5日 星期五

Configuration of a minimal systemd setup in QEMU


本文記錄如何在 QEMU 環境中設定最小的 systemd init。基本上需要建立兩個必要的目標:sysinit.target 和 basic.target,以及用於登入的 getty@.service。
SRCROOT=/opt/armv7vet2hf/sysroots/
DSTROOT=initrd
SRCLIB=$SRCROOT/lib
DSTLIB=$DSTROOT/lib
SRCSYSDLIB=$SRCROOT/lib/systemd
DSTSYSDLIB=$DSTROOT/lib/systemd
SRCUSRLIB=$SRCROOT/usr/lib
DSTUSRLIB=$DSTROOT/usr/lib

rm -rf $DSTROOT
mkdir -p $DSTROOT/bin $DSTROOT/usr/lib $DSTROOT/lib/systemd/system $DSTROOT/etc/systemd/system

# copy libraries
cp -a $SRCLIB/libselinux.so* $DSTLIB
cp -a $SRCLIB/libmount.so* $DSTLIB
cp -a $SRCLIB/libaudit.so* $DSTLIB
cp -a $SRCLIB/libc.so* $DSTLIB
cp -a $SRCLIB/ld-linux-armhf.so* $DSTLIB
cp -a $SRCLIB/libblkid.so* $DSTLIB
cp -a $SRCLIB/libcap.so* $DSTLIB
cp -a $SRCLIB/libm.so* $DSTLIB
cp -a $SRCLIB/libpcre.so* $DSTLIB
cp -a $SRCLIB/libcap-ng.so* $DSTLIB

cp -a $SRCUSRLIB/libacl.so* $DSTUSRLIB
cp -a $SRCUSRLIB/libcrypt.so* $DSTUSRLIB
cp -a $SRCUSRLIB/liblzma.so* $DSTUSRLIB
cp -a $SRCUSRLIB/libattr.so* $DSTUSRLIB

cp -a $SRCSYSDLIB/systemd $DSTSYSDLIB
cp -a $SRCSYSDLIB/libsystemd-shared* $DSTSYSDLIB
install -m 555 busybox-build/busybox $DSTROOT/bin/


# Create basic.target
cat << EOF > $DSTSYSDLIB/system/basic.target
[Unit]
Description=Basic System
EOF

# Create sysinit.target
cat << EOF > $DSTSYSDLIB/system/sysinit.target
[Unit]
Description=System Initialization
DefaultDependencies=no
EOF

# Create getty@tty1.service
cat << EOF > $DSTSYSDLIB/system/getty@.service
[Unit]
Description=Getty on %I
ConditionPathExists=/dev/%I

[Service]
ExecStart=-/sbin/getty 115200 %I
Restart=always

[Install]
WantedBy=basic.target rescue.target
EOF


chmod 644 -R $DSTSYSDLIB/system/*

cat << EOF > $DSTROOT/init
#!/bin/busybox sh
## Mount essential filesystems
/bin/busybox mkdir -p /proc /sys /dev /home /run/systemd/journal /tmp /var /mnt /sbin /usr/bin /usr/sbin /etc/systemd/system/basic.target.wants /etc/systemd/system/rescue.target.wants /etc/systemd/system/default.target.wants
/bin/busybox --install -s
ln -sf /lib/systemd/systemd /sbin/init

## Set the path for BusyBox applets if using BusyBox
export PATH=/sbin:/bin:/usr/sbin:/usr/bin
mount -t proc none /proc
mount -t sysfs none /sys
mount -t devtmpfs none /dev
mkdir -p /dev/pts
mount -t devpts none /dev/pts
## Ensure the getty@ttyAMA0.service file is linked in the correct place
ln -sf /lib/systemd/system/getty@.service /etc/systemd/system/basic.target.wants/getty@ttyAMA0.service
# create default password
echo "root:vnpTT1BZdW1/s:0:0:root:/root:/bin/sh" > /etc/passwd
echo "root:x:0:" > /etc/group

# Ensure systemd can find its units
ln -sf /lib/systemd/system/basic.target /lib/systemd/system/default.target

# Start systemd
exec /sbin/init
EOF
chmod +x $DSTROOT/init

fakeroot bash -c "cd linux && ./usr/gen_initramfs.sh ../$DSTROOT -o ../initrd-arm.img"



熱門文章