rk3128 如何讀取 flash id

2022-05-18 03:55:51 字數 4574 閱讀 9084

2019-06-14

關鍵字:mmc 唯一id、flash 唯一識別碼

在 android 的系統中,預設是會將 flash 的唯一識別碼對映到檔案系統中的。它的預設路徑為

/sys/bus/mmc/devices

在這個路徑下通常你的板子上有多少塊儲存晶元,就會有多少個檔案。例如,筆者的開發板中它的檔案結構就只有乙個。

root@rk312x:/sys/bus/mmc/devices # ll

lrwxrwxrwx root root

1970-01-01

00:00 mmc0:0001 -> ../../../devices/1021c000.rksdmmc/mmc_host/mmc0/mmc0:0001

root@rk312x:/sys/bus/mmc/devices #

我們直接進這個目錄裡去。

檢視一下這個目錄內的檔案結構,可以發現有如下檔案與目錄

root@rk312x:/sys/bus/mmc/devices/mmc0:0001

# ll

drwxr-xr-x root root 1970-01-01

00:00

block

-r--r--r-- root root 4096

1970-01-01

00:00

cid-r--r--r-- root root 4096

1970-01-01

00:00

csd-r--r--r-- root root 4096

1970-01-01

00:00

date

lrwxrwxrwx root root

1970-01-01

00:00 driver -> ../../../../../bus/mmc/drivers/mmcblk

-r--r--r-- root root 4096

1970-01-01

00:00

enhanced_area_offset

-r--r--r-- root root 4096

1970-01-01

00:00

enhanced_area_size

-r--r--r-- root root 4096

1970-01-01

00:00

erase_size

-r--r--r-- root root 4096

1970-01-01

00:00

fwrev

-r--r--r-- root root 4096

1970-01-01

00:00

hwrev

-r--r--r-- root root 4096

1970-01-01

00:00

manfid

-r--r--r-- root root 4096

1970-01-01

00:00

name

-r--r--r-- root root 4096

1970-01-01

00:00

oemid

drwxr-xr-x root root 1970-01-01

00:00

power

-r--r--r-- root root 4096

1970-01-01

00:00

preferred_erase_size

-r--r--r-- root root 4096

1970-01-01

00:00

prv-r--r--r-- root root 4096

1970-01-01

00:00

raw_rpmb_size_mult

-r--r--r-- root root 4096

1970-01-01

00:00

rel_sectors

-r--r--r-- root root 4096

1970-01-01

00:00

serial

lrwxrwxrwx root root

1970-01-01

00:00 subsystem -> ../../../../../bus/mmc

-r--r--r-- root root 4096

1970-01-01

00:00

type

-rw-r--r-- root root 4096

1970-01-01

00:00

uevent

root@rk312x:/sys/bus/mmc/devices/mmc0:0001 #

其中,這個 cid 檔案就是用於記載 flash 唯一識別碼的檔案。我們看看它記載的格式是怎樣的

root@rk312x:/sys/bus/mmc/devices/mmc0:0001 # cat

cid11010030303447363002ca9c8c25a507

root@rk312x:/sys/bus/mmc/devices/mmc0:0001 #

真夠簡單乾脆的。

這個 cid 碼是乙個 128 位,即 16 個位元組的數值碼。我們上面直接 cat 出來的是乙個 32 位元組的字串,這說明這個唯一識別碼在 cid 檔案裡的記載方式是每兩個字元表示乙個十六進製制字串形數值。

然後這個 cid 碼也是有格式的,貌似是國際標準格式。

mid: [127:120

]   —— 8bit(1byte)manufacturer id,由mmca分配,比如sandisk為0x02,kingston為0x37,samsung為0x15。

oid: [

pnm: [

103:64

]    —— 40bit product name,產品名稱。

prv: [

63:56

]    —— 8bit product revision,產品版本,前4bit fw版本,後4bit hw版本。

psn: [

55:24

]    —— 32bit product serial number,產品序列號。

mdt: [

19:8]     —— 12bit manufacturing date

,生產日期,前4bit是月份,後8bit為年份,0對應2023年。

crc: [

7:1]    —— 7bit crc7 checksum,迴圈冗餘校驗。

知道了它會以普通檔案的形式出現在檔案系統以後就可以拿來應用了。一種最簡單的使用方式就是直接以 檔案 的形式來對它進行讀寫。大不了我們在 init.rc 的 on post-fs-data 上手動修改一下讀寫許可權就是了。

上面這一系列檔案在原始碼中又是如何來實現的呢?

./kernel/drivers/mmc

這個目錄下的**是關於 mmc ,即這個 flash 的一整套實現**。

可以重點關注的**主要是以下這個

./kernel/drivers/mmc/core/mmc.c

在這份原始碼中,入口函式是這個

int mmc_attach_mmc(struct mmc_host *host)

而關於 cid 相關的,在上面這個 mmc_attach_mmc 函式中有如下呼叫

/*

* detect and init the card.

*/err =mmc_init_card(host, rocr, null);

if(err)

goto err;

在這個 mmc_init_card 函式中就可以看到諸如取 cid ,csd 等這些的函式呼叫了

/*

* handle the detection and initialisation of a card.

* * in the case of a resume, "oldcard" will contain the card

* we're trying to reinitialise. */

static

int mmc_init_card(struct mmc_host *host, u32 ocr,

struct mmc_card *oldcard)

其實整套流程還不簡單,有興趣的自己去深入跟蹤一下原始碼好了。

參考部落格: 

rk3128網路機頂盒一些測試結果

1 rk3128的開機速度是23s。由於是裡面預裝了一大批軟體,很多是沒有必要的。最終版本的rom,我有把握做到18s。3 rk3128加入我們自己的機頂盒介面系統,反應速度效果不錯。我們的介面系統,呼叫rk3128的一些系統介面,基本上2天對接好。其介面比較規範好找。我們做的rom,優化了非常多的...

rk3128 lcd 驅動除錯記錄

最近剛除錯了基於rk3128平台的lcd驅動,順便記錄總結一下,有不足之處,望各位不吝賜教!1.架構 drivers video rockchip transmitter rk32 mipi dsi.c mipi 驅動主體檔案 rk32 mipi dsi.h 暫存器以及結構體的定義 mipi dsi...

RK3128 UBOOT logo顯示的坑

問題描述 在除錯mipi介面的顯示屏的時候出現如下兩種情況,1 在裝置樹arch arm boot dts rk3128 box rk88.dts中配置在uboot階段顯示logo,會出現程式跑飛。2 在在裝置樹arch arm boot dts rk3128 box rk88.dts中配置在ubo...