RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

SPINAND UBI離線燒錄開發(fā)指南

嵌入式Linux那些事 ? 來源:嵌入式Linux那些事 ? 作者:嵌入式Linux那些事 ? 2023-03-06 09:54 ? 次閱讀

1 概述

編寫目的: 介紹Sunxi SPINand 燒寫時的數(shù)據(jù)布局

2 名詞解釋

UBI unsorted block image
PEB physical erase block
LEB logical erase block

PEB 和logical block 關(guān)系

1 PEB = 1 logical block

1 logical block = 2 physical blocks

3 總體數(shù)據(jù)布局

ubi 方案FLASH 上的數(shù)據(jù)布局

pYYBAGQFR8GAC0SBAAPT4ujuHxY338.pngpoYBAGQFR8KAdRMsAAG0f6fE95U599.pngpYYBAGQFR8OAZpPTAAIo6okVbsA836.png

sys_partition.fex 文件中的各個分區(qū)大小會按照LEB 大小對齊,sunxi_mbr 分區(qū)概念與UBI卷(volume)概念相同 需要修改原鏡像文件:物理區(qū)TOC0 合邏輯區(qū)sunxi_mbr.fex 需要動態(tài)生成文件:邏輯區(qū)ubi layout volume 注意:

各分區(qū)鏡像以實(shí)際應(yīng)用為準(zhǔn)

logical page0 = logical block 的兩個page0

4 toc0 or boot0

4.1 input file

boot0_nand.fex(非安)or toc0.fex(安全)

4.2 flow

? 驗證checksum 是否準(zhǔn)確 ? 填充storage_data ? 重新生成checksum 并更新boot_file_head_t 中的check_sum

poYBAGQFR8OAHXWuAABB-sTY_2g234.pngpoYBAGQFR8SANnYfAAHX3xcACR0100.png

參考文件

include/private_boot0.h

sprite/sprite_download.c

參考函數(shù)

download_normal_boot0

download_secure_boot0

4.3 normal boot0

normal boot0 存放于block4-7 參考function: download_normal_boot0

typedef struct _boot0_file_head_t

{

boot_file_head_t boot_head;

boot0_private_head_t prvt_head;

char hash[64];

__u8 reserved[8];

union {

#ifdef CFG_SUNXI_SELECT_DRAM_PARA

boot_extend_head_t extd_head;

#endif

fes_aide_info_t fes1_res_addr;

} fes_union_addr;

}boot0_file_head_t;

/******************************************************************************/

/* file head of Boot0 */

/******************************************************************************/

typedef struct _boot0_private_head_t

{

>-------__u32 prvt_head_size;

>-------/*debug_mode = 0 : do not print any message,debug_mode = 1 ,print debug message*/

>-------__u8 debug_mode;

>-------/*0:axp, 1: no axp */

>-------__u8 power_mode;

>-------__u8 reserve[2];

>-------/*DRAM patameters for initialising dram. Original values is arbitrary*/

>-------unsigned int dram_para[32];

>-------/*uart: num & uart pin*/

>-------__s32>-->------->------->------->------->-------uart_port;

>-------normal_gpio_cfg uart_ctrl[2];

>-------/* jtag: 1 : enable, 0 : disable */

>-------__s32 enable_jtag;

normal_gpio_cfg>---- jtag_gpio[5];

>-------/* nand/mmc pin*/

normal_gpio_cfg storage_gpio[32];

>-------/*reserve data*/

char storage_data[512 - sizeof(normal_gpio_cfg) * 32];

}boot0_private_head_t;

4.4 secure boot0

secure boot0 存放于boot0-block3

typedef struct sbrom_toc0_config

{

unsigned char config_vsn[4];

unsigned int dram_para[32]; // dram參數(shù)

int uart_port; // UART控制器編號

normal_gpio_cfg uart_ctrl[2]; // UART控制器GPIO

int enable_jtag; // JTAG使能

normal_gpio_cfg jtag_gpio[5]; // JTAG控制器GPIO

normal_gpio_cfg storage_gpio[50]; // 存儲設(shè)備GPIO信息

// 0-23放nand,24-31存放卡0,32-39放卡2

// 40-49存放spi

char storage_data[384]; // 0-159,存儲nand信息;160-255,存放卡信息

unsigned int secure_dram_mbytes; //

unsigned int drm_start_mbytes; //

unsigned int drm_size_mbytes; //

unsigned int boot_cpu; //

special_gpio_cfg a15_power_gpio; //the gpio config is to a15 extern power enable

gpio

unsigned int next_exe_pa;

unsigned int secure_without_OS; //secure boot without semelis

unsigned char debug_mode; //1:turn on printf; 0 :turn off printf

unsigned char power_mode; /* 0:axp , 1: dummy pmu */

unsigned char rotpk_flag;

unsigned char reserver[1];

unsigned int card_work_mode;

unsigned int res[2]; // 總共1024字節(jié)

}

sbrom_toc0_config_t;

4.5 filling storage_data

pYYBAGQFR8WAff61AAI1r8ykyeY286.png

下表中紅色字體不能配置錯,大部分值直接參考drivers/mtd/awnand/spinand/physic/id.c

attribute name type value comment
ChipCnt unsigned char 1
ConnectMode unsigned char 1 忽略,可以不用理解
BankCntPerChip unsigned char 1 忽略,可以不用理解
DieCntPerChip unsigned char 1
PlaneCntPerDie unsigned char 2 忽略,可以不用理解
SectorCntPerPage unsigned char 4 以具體物料為準(zhǔn), 常見為4
ChipConnectInfo unsigned short 1 忽略,可以不用理解
PageCntPerPhyBlk unsigned int 64 以具體物料為準(zhǔn), 常見為64
BlkCntPerDie unsigned int 1024 以具體物料為準(zhǔn), 常見為1024,也可能為512 或2048
OperationOpt unsigned int 0x? 參考id.c 各個物料配置
FrequencePar unsigned int 100 忽略,可以不用理解
SpiMode unsigned int 0 忽略,可以不用理解
NandChipId[8] unsigned char 0x? 參考id.c 各個物料配置
pagewithbadflag unsigned int 0 忽略,可以不用理解
MultiPlaneBlockOffset unsigned int 1 忽略,可以不用理解
MaxEraseTimes unsigned int 忽略,可以不用理解
EccLimitBits unsigned int 忽略,可以不用理解
uboot_start_block unsigned int 8
uboot_next_block unsigned int 40
logic_start_block unsigned int 40 忽略,可以不用理解
nand_specialinfo_page unsigned int 0 忽略,可以不用理解
nand_specialinfo_offset unsigned int 0 忽略,可以不用理解
physic_block_reserved unsigned int 0 忽略,可以不用理解
Reserved[4] unsigned int 0 忽略,可以不用理解

以GigaDevice GD5F1GQ4UBYIG spinand 為例,其大部分信息直接來自id.c

{

.Model = "GD5F1GQ4UBYIG",

.NandID = {0xc8, 0xd1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},

.DieCntPerChip = 1,

.SectCntPerPage = 4,

.PageCntPerBlk = 64,

.BlkCntPerDie = 1024,

.OobSizePerPage = 64,

.OperationOpt = SPINAND_QUAD_READ | SPINAND_QUAD_PROGRAM |

SPINAND_DUAL_READ,

.MaxEraseTimes = 50000,

.EccFlag = HAS_EXT_ECC_SE01,

.EccType = BIT4_LIMIT5_TO_7_ERR8_LIMIT_12,

.EccProtectedType = SIZE16_OFF4_LEN8_OFF4,

.BadBlockFlag = BAD_BLK_FLAG_FRIST_1_PAGE,

},參考文件:

include/linux/mtd/aw-spinand.h /定義id.c 中id 表的數(shù)據(jù)結(jié)構(gòu)/

drivers/mtd/awnand/spinand/sunxi-spinand.h /定義boot_spinand_para_t 填充的數(shù)據(jù)結(jié)構(gòu)/

drivers/mtd/awnand/spinand/sunxi-driver.c /填充函數(shù)參考/

drivers/mtd/awnand/spinand/physic/id.c /不同物料的信息配置(id 表配置)/

參考函數(shù):

ubi_nand_get_flash_info–>spinand_mtd_get_flash_info

4.6 update checksum

參考文件:

sprite/sprite_download.c

sprite/sprite_verify.c

board/sunxi/board_common.c

參考函數(shù)流程:

download_normal_boot0/download_secure_boot0 -> sunxi_sprite_generate_checksum

-> sunxi_generate_checksum

4.7 burn boot0

? 參考文件:

drivers/mtd/awnand/spinand/sunxi-driver.c

參考函數(shù)流程:

spinand_mtd_download_boot0()

注意事項: 如果是安全方案,存放boot0 的blocks 中一半存放secure boot0,一半存放normal boot0, 參考UBI 方案分區(qū)表信息以及第2 章節(jié)說明

各個備份按block 對齊(如果boot0 超過1 個block, 單個備份起始block 地址為偶數(shù)), 若寫單個備份過程中遇到壞塊,則中止當(dāng)前備份寫過程,寫下一備份即可boot0 的鏡像文件已經(jīng)包含了boot0 header,不需額外分配組織boot0 header 格式,只需更新boot0 header 中的storage_data 部分,其他屬性(比如dram_para)不需更新。更新后,需重新生成boot0 header 中的校驗和check_sum

5 toc1 or uboot

區(qū)域:block8-block31 直接燒寫toc1 鏡像 參考文件:

sprite/sprite_download.c drivers/sunxi_flash/nand.c drivers/sunxi_flash/nand_for_ubi.c drivers/mtd/awnand/spinand/sunxi-driver.c

參考函數(shù):

sunxi_sprite_download_uboot–>sunxi_sprite_download_toc–sunxi_flash_nand_download_toc–> ubi_nand_download_uboot–>spinand_mtd_download_uboot

6 secure storage block

區(qū)域:block32-block39 燒錄器不用處理

7 計算邏輯區(qū)域LEB 總數(shù)

用戶可見LEB 數(shù)= 總物理塊數(shù)- 8 (boot0) - 24 (boot1) - 8 (secure storage) - 20* 總物理塊 數(shù)/1024 - 4,規(guī)則如下:

減去物理區(qū)域塊數(shù)

減去壞塊處理預(yù)留數(shù)(每1024 物理塊最多20 個物理塊,即10 個邏輯塊)

減去4(2 個用于ubi layout volume,1 個用于LEB 原子寫,1 個用于磨損均衡處理)推算方式可以參考u-boot-2018/cmd/ubi_simu.c 的ubi_sim_part 和ubi_simu_create_vol函數(shù)。 正常情況下,ubi 方案sys_partition.fex 中各個分區(qū)的大小會按照LEB 大小對齊。假如一款flash 有1024 個block, 每個block 有64 個page, 每個page 有2KB,則邏輯塊大小為256K(642K2), 那么PEB 大小是256K,LEB 大小為252K, PEB 中的首邏輯頁固定用于 存放ubi_ec_hdr 和ubi_vid_hdr。 由于預(yù)先不知道物料的容量信息及預(yù)留塊信息,因此sys_partition.fex(sunxi_mbr.fex)中最后一個分區(qū)的size 信息默認(rèn)先填0,待NAND 驅(qū)動初始化完成后才知道用戶可見LEB 數(shù)有多少個,此時需要根據(jù)信息改寫sunxi_mbr.fex 中最后一個分區(qū)的size。

8 動態(tài)調(diào)整sunxi_mbr 卷

sunxi_mbr.fex 共64k, 共4 個備份,每個備份16K

計算mbr 卷最后分區(qū)size, 單位:扇區(qū)(512 字節(jié)),計算規(guī)則如下: 根據(jù)第5 章節(jié)計算出的用戶可見leb 數(shù)轉(zhuǎn)化出總的扇區(qū)數(shù)total_sector,依次減去分區(qū)表中各個 分區(qū)占用的扇區(qū)數(shù)

回填sunxi_mbr.fex 最后一個分區(qū)size

重新計算并回填sunxi_mbr 的crc32

改寫其余3 個備份

sunxi_mbr_t 結(jié)構(gòu)體:u-boot-2018/include/sunxi_mbr.h,結(jié)構(gòu)體各個成員均使用小端存儲。 typedef struct sunxi_mbr { unsigned int crc32; unsigned int version; unsigned char magic[8]; unsigned int copy; unsigned int index; unsigned int PartCount; unsigned int stamp[1]; sunxi_partition array[SUNXI_MBR_MAX_PART_COUNT]; unsigned int lockflag; unsigned char res[SUNXI_MBR_RESERVED]; }attribute ((packed)) sunxi_mbr_t;

重新計算并回填sunxi_mbr crc32 的代碼請參考u-boot-2018/drivers/mtd/aw-spinand/sunxiubi. c 的adjust_sunxi_mbr 函數(shù)。

9 根據(jù)sunxi_mbr 動態(tài)生成ubi layout volume

ubi layout volume 可以理解為UBI 模塊內(nèi)部用的分區(qū)信息文件,sunxi_mbr 分區(qū)是用于全志燒寫framework 的分區(qū)信息文件。二者記錄的分區(qū)信息本質(zhì)上是一樣的,因此燒寫時, 可以由sunxi_mbr 卷轉(zhuǎn)化成ubi layout volume。 ubi layout volume 由128 個struct ubi_vtbl_record(u-boot-2018/drivers/mtd/ubi/ubimedia.h)組成, 結(jié)構(gòu)體各個成員使用大端表示。

struct ubi_vtbl_record { __be32 reserved_pebs; __be32 alignment; __be32 data_pad; __u8 vol_type; __u8 upd_marker; __be16 name_len; char name[UBI_VOL_NAME_MAX+1]; __u8 flags; __u8 padding[23]; __be32 crc; } __packed;

attribute name type value comment
reserved_pebs __be32 卷大小/LEB size, 對于ubi layout volume,固定為2
alignment __be32 1
data_pad __be32 0
vol_type __u8 1 動態(tài)卷:1,靜態(tài)卷:2,當(dāng)前方案均是動態(tài)卷
upd_marker __u8 0
name_len __be16 卷名長度
name[128] char
flags __u8 分區(qū)內(nèi)最后一個卷udisk,flags UBI_VTBL_AUTORESIZE_FLG
padding[23] __u8 0
crc __be32 crc32_le

ubi layout volume 的內(nèi)容填充及燒寫方法請參考u-boot-2018/cmd/ubi_simu.c 的ubi_simu_create_vol 和wr_vol_table 函數(shù) 注意ubi 中crc32_le 算法與sunxi_mbr 的crc32 算法不一樣。 ubi 中crc32_le 參考crc32_le.c 用法sunxi_mbr 中crc32 參考crc32.c 用法

10 燒寫邏輯卷

PEB = ubi_ec_hdr + ubi_vid_hdr + LEB 其中ubi_ec_hdr 和ubi_vid_hdr 存放于PEB 的首邏輯頁(logical page0)。

ubi_ec_hdr 存放于0 字節(jié)偏移處,大小與物理頁size 對齊 ubi_vid_hdr 存放于1 個物理頁size 偏移處,大小也與物理頁size 對齊

10.1 ubi_ec_hdr

ubi_ec_hdr:主要用于存儲PEB 的擦除次數(shù)信息,需動態(tài)生成crc32_le 校驗值。 struct ubi_ec_hdr 位于u-boot-2018/drivers/mtd/ubi/ubi-media.h,結(jié)構(gòu)體各個成員使用大端表示。

struct ubi_ec_hdr { __be32 magic; __u8 version; __u8 padding1[3]; __be64 ec; /* Warning: the current limit is 31-bit anyway! */ __be32 vid_hdr_offset; __be32 data_offset; __be32 image_seq; __u8 padding2[32]; __be32 hdr_crc; } __packed;

attribute name type value comment
magic __be32 0x55424923 UBI#
version __u8 1
padding1[3] __u8 0
ec __be64 1
vid_hdr_offset __be32 physical page size 2048
data_offset __be32 logical page size 4096
image_seq __be32 0
padding2[32] __u8 0
hdr_crc __be32 crc32_le

ubi_ec_hdr 的填充方法請參考u-boot-2018/cmd/ubi_simu.c 的fill_ec_hdr 函數(shù)。

10.2 ubi_vid_hdr

ubi_vid_hdr:存放PEB 和LEB&Volume 映射信息,需動態(tài)生成crc32_le 校驗值 struct ubi_vid_hdr 位于u-boot-2018/drivers/mtd/ubi/ubi-media.h,結(jié)構(gòu)體各個成員使用大端表示。

struct ubi_vid_hdr { __be32 magic; __u8 version; __u8 vol_type; __u8 copy_flag; __u8 compat; __be32 vol_id; __be32 lnum; __u8 padding1[4]; __be32 data_size; __be32 used_ebs; __be32 data_pad; __be32 data_crc; __u8 padding2[4]; __be64 sqnum; __u8 padding3[12]; __be32 hdr_crc; } __packed;

poYBAGQFR8WAJWuiAADcdvXXAfs932.png

ubi_vid_hdr 的填充方法請參考u-boot-2018/cmd/ubi_simu.c 的fill_vid_hdr 函數(shù)。

11 數(shù)據(jù)對齊

有數(shù)據(jù)對齊需求時,不能填充0xff 數(shù)據(jù),可選擇填充全0版

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11292

    瀏覽量

    209327
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4327

    瀏覽量

    62569
  • 燒錄
    +關(guān)注

    關(guān)注

    8

    文章

    259

    瀏覽量

    35561
  • UBI
    UBI
    +關(guān)注

    關(guān)注

    0

    文章

    9

    瀏覽量

    4120
收藏 人收藏

    評論

    相關(guān)推薦

    Linux SPI-NAND 驅(qū)動開發(fā)指南

    Linux SPI-NAND 驅(qū)動開發(fā)指南 1 概述1.1 編寫目的1.2 適用范圍1.3 相關(guān)人員3 流程設(shè)計3.1 體系結(jié)構(gòu)3.2 源碼結(jié)構(gòu)3.3 關(guān)鍵數(shù)據(jù)定義3.3.1 flash 設(shè)備信息
    的頭像 發(fā)表于 03-06 10:11 ?1552次閱讀
    Linux SPI-NAND 驅(qū)動<b class='flag-5'>開發(fā)指南</b>

    單片機(jī)實(shí)用開發(fā)指南 目錄

    單片機(jī)實(shí)用開發(fā)指南 目錄
    發(fā)表于 03-21 23:14 ?44次下載

    單片機(jī)實(shí)用開發(fā)指南

    單片機(jī)實(shí)用開發(fā)指南
    發(fā)表于 03-21 23:21 ?210次下載

    CPLD FPGA高級應(yīng)用開發(fā)指南

    CPLD FPGA高級應(yīng)用開發(fā)指南
    發(fā)表于 04-15 10:56 ?58次下載
    CPLD FPGA高級應(yīng)用<b class='flag-5'>開發(fā)指南</b>

    Tiny6410 Linux開發(fā)指南詳解

    Tiny6410 Linux 開發(fā)指南
    發(fā)表于 07-08 17:12 ?210次下載
    Tiny6410 Linux<b class='flag-5'>開發(fā)指南</b>詳解

    A64開發(fā)板LCD開發(fā)指南

    A64開發(fā)板LCD開發(fā)指南,驅(qū)動開發(fā)指南
    發(fā)表于 06-21 17:02 ?0次下載

    橫版排插開發(fā)指南

    橫版排插開發(fā)指南
    發(fā)表于 12-29 20:02 ?0次下載

    電熱毯開發(fā)指南

    電熱毯開發(fā)指南
    發(fā)表于 12-29 20:14 ?0次下載

    彩光燈開發(fā)指南

    彩光燈開發(fā)指南
    發(fā)表于 12-29 20:15 ?0次下載

    取暖器-油汀開發(fā)指南

    取暖器-油汀開發(fā)指南
    發(fā)表于 12-25 00:15 ?0次下載

    《Android基礎(chǔ)及典型案例開發(fā)指南》--創(chuàng)新移動開發(fā)系列

    《Android基礎(chǔ)及典型案例開發(fā)指南》--創(chuàng)新移動開發(fā)系列
    發(fā)表于 02-08 00:32 ?11次下載

    nRF52832開發(fā)指南-上冊

    nRF52832開發(fā)指南-上冊
    發(fā)表于 06-16 14:15 ?75次下載

    nRF52832開發(fā)指南-下冊

    nRF52832開發(fā)指南-下冊
    發(fā)表于 06-16 14:14 ?44次下載

    Tina Linux配置開發(fā)指南

    Tina Linux配置開發(fā)指南
    的頭像 發(fā)表于 03-02 15:28 ?1.6w次閱讀
    Tina Linux配置<b class='flag-5'>開發(fā)指南</b>

    Linux NOR開發(fā)指南

    Linux NOR開發(fā)指南
    的頭像 發(fā)表于 03-06 09:55 ?958次閱讀
    Linux NOR<b class='flag-5'>開發(fā)指南</b>
    RM新时代网站-首页