国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Linux SPI-NAND 驅(qū)動(dòng)開(kāi)發(fā)指南

這篇具有很好參考價(jià)值的文章主要介紹了Linux SPI-NAND 驅(qū)動(dòng)開(kāi)發(fā)指南。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

Linux SPI-NAND 驅(qū)動(dòng)開(kāi)發(fā)指南

1 概述

1.1 編寫(xiě)目的

介紹 Sunxi SPINand mtd/ubi 驅(qū)動(dòng)設(shè)計(jì), 方便相關(guān)驅(qū)動(dòng)和應(yīng)用開(kāi)發(fā)人員

1.2 適用范圍

本設(shè)計(jì)適用于所有 sunxi 平臺(tái)

1.3 相關(guān)人員

Nand 模塊開(kāi)發(fā)人員,及應(yīng)用開(kāi)發(fā)人員等

2 術(shù)語(yǔ)、縮略語(yǔ)及概念

MTD:(Memory Technology device)是用于訪問(wèn)存儲(chǔ)設(shè)備的 linux 子系統(tǒng)。本模塊是MTD 子系統(tǒng)的 flash 驅(qū)動(dòng)部分

UBI:UBI 子系統(tǒng)是基于 MTD 子系統(tǒng)的,在 MTD 上實(shí)現(xiàn) nand 特性的管理邏輯,向上屏蔽nand 的特性

壞塊 (Bad Block):制作工藝和 nand 本身的物理性質(zhì)導(dǎo)致在出廠和正常使用過(guò)程中都會(huì)產(chǎn)生壞塊

3 流程設(shè)計(jì)

3.1 體系結(jié)構(gòu)

NAND MTD/UBI 驅(qū)動(dòng)主要包括 5 大組件,如下圖:

Linux SPI-NAND 驅(qū)動(dòng)開(kāi)發(fā)指南

? 圖 3-1: UBI 架構(gòu)

說(shuō)明:

  • MTD standard interface: 對(duì)接 MTD 層通用讀寫(xiě)接口
  • FLASH bad block manager: 驅(qū)動(dòng)層對(duì) flash 壞塊的管理
  • FLASH SPL: 主要是實(shí)現(xiàn)讀寫(xiě) boot0、boot1,可用于 ioctl 對(duì)boot0、boot1 的升級(jí)
  • SECURESTORAGE:主要是給上層提供私有數(shù)據(jù)的管理 SPI:HOST端控制器層的實(shí)現(xiàn)。

3.2 源碼結(jié)構(gòu)

kernel 源碼目錄:linux-5.4/drivers/mtd/awnand/spinand

.
├── Kconfig
├── Makefile
├── physic
│?? ├── bbt.c
│?? ├── cache.c
│?? ├── core.c
│?? ├── ecc.c
│?? ├── id.c
│?? ├── Makefile
│?? ├── ops.c
│?? └── physic.h
├── secure-storage.c
├── sunxi-common.c
├── sunxi-core.c
├── sunxi-debug.c
├── sunxi-nftl-core.c
└── sunxi-spinand.h

內(nèi)核目錄下

`-- include
	`-- linux
	   `-- mtd
		    |-- aw-spinand.h

?

3.3 關(guān)鍵數(shù)據(jù)定義

3.3.1 flash 設(shè)備信息數(shù)據(jù)結(jié)構(gòu)
struct aw_spinand_phy_info {
    const char *Model;
    unsigned char NandID[MAX_ID_LEN];
    unsigned int DieCntPerChip;
    unsigned int BlkCntPerDie;
    unsigned int PageCntPerBlk;
    unsigned int SectCntPerPage;
    unsigned int OobSizePerPage;
    #define BAD_BLK_FLAG_MARK 0x03
    #define BAD_BLK_FLAG_FRIST_1_PAGE 0x00
    #define BAD_BLK_FLAG_FIRST_2_PAGE 0x01
    #define BAD_BLK_FLAG_LAST_1_PAGE 0x02
    #define BAD_BLK_FLAG_LAST_2_PAGE 0x03
    int BadBlockFlag;
    #define SPINAND_DUAL_READ BIT(0)
    #define SPINAND_QUAD_READ BIT(1)
    #define SPINAND_QUAD_PROGRAM BIT(2)
    #define SPINAND_QUAD_NO_NEED_ENABLE BIT(3)
    #define SPINAND_ONEDUMMY_AFTER_RANDOMREAD BIT(8)
    int OperationOpt;
    int MaxEraseTimes;
    #define HAS_EXT_ECC_SE01 BIT(0)
    #define HAS_EXT_ECC_STATUS BIT(1)
    enum ecc_status_shift ecc_status_shift;
    int EccFlag;
    enum ecc_limit_err EccType;
    enum ecc_oob_protected EccProtectedType;
};

說(shuō)明:

? ? Model:flash 的 model 名字

? ? NandID:flash 的 id 碼

? ? DieCntPerChip:每 chip 的 die 個(gè)數(shù)

? ? BlkCntPerDie:每 die 有多少個(gè) block

? ? PageCntPerBlk:每 block 有多少個(gè) page

? ? SectCntPerPage:每 page 有多少個(gè)扇區(qū)

? ? OobSizePerPage:每 page 的 obb 大小

? ? BadBlockFlag:壞塊標(biāo)志存放在每個(gè) block 的那個(gè) page 中

  1. BAD_BLK_FLAG_FRIST_1_PAGE

  2. BAD_BLK_FLAG_FIRST_2_PAGE

  3. BAD_BLK_FLAG_LAST_1_PAGE

  4. BAD_BLK_FLAG_LAST_2_PAGE

? OperationOpt:支持的操作

  1. SPINAND_DUAL_READ

  2. SPINAND_QUAD_READ

  3. SPINAND_QUAD_PROGRAM

  4. SPINAND_QUAD_NO_NEED_ENABLE

  5. SPINAND_ONEDUMMY_AFTER_RANDOMREAD

? MaxEraseTimes:最大擦除數(shù)據(jù)

? EccFlag:特性物料讀 ecc status 說(shuō)需目錄不同

? GD5F1GQ4UCYIG 通過(guò) 0Fh + C0h 獲取 ecc status,則無(wú)需配置 EccFlag

? MX35LF1GE4AB 通過(guò) 7Ch + one dummy byte 獲取 ecc status,則配置 EccFlag = HAS_EXT_ECC_STATUS

? EccType:設(shè)置 ecc 值對(duì)應(yīng)的狀態(tài)關(guān)系

? EccProtectedType:在 spare 去選擇收 ecc 保護(hù)的 16byte 作為 oob 區(qū)

例(MX35LF2GE4AD):

{
    .Model = "MX35LF2GE4AD",
    .NandID = {0xc2, 0x26, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff},
    .DieCntPerChip  = 1,
    .SectCntPerPage = 4,
    .PageCntPerBlk  = 64,
    .BlkCntPerDie   = 2048,
    .OobSizePerPage = 64,
    .OperationOpt = SPINAND_QUAD_READ | SPINAND_QUAD_PROGRAM | SPINAND_DUAL_READ,
    .MaxEraseTimes = 65000,
    .EccFlag = HAS_EXT_ECC_STATUS,
    .EccType = BIT4_LIMIT5_TO_8_ERR9_TO_15,
    .EccProtectedType = SIZE16_OFF4_LEN4_OFF8,
    .BadBlockFlag = BAD_BLK_FLAG_FIRST_2_PAGE,
},


3.3.2 flash chip 數(shù)據(jù)結(jié)構(gòu)
struct aw_spinand_chip {
    struct aw_spinand_chip_ops *ops;
    struct aw_spinand_ecc *ecc;
    struct aw_spinand_cache *cache;
    struct aw_spinand_info *info;
    struct aw_spinand_bbt *bbt;
    struct spi_device *spi;
    unsigned int rx_bit;
    unsigned int tx_bit;
    unsigned int freq;
    void *priv;
};

此結(jié)構(gòu)定義了 flash chip 層的物理模型數(shù)據(jù)結(jié)構(gòu)以及 chip 層對(duì) flash 的操作接口。

? aw_spinand_chip_ops:flash 讀、寫(xiě)、擦等操作接口

? aw_spinand_ecc:flash ecc 讀、寫(xiě)和校驗(yàn)操作接口

? aw_spinand_cache:對(duì)緩存 page 的管理,提高讀寫(xiě)效率

? aw_spinand_info:flash ID、page size 等信息及獲取信息的操作接口

? aw_spinand_bbt:flash 壞塊表及管理等操作接口

? spi_device:spi 父設(shè)備的操作結(jié)構(gòu)體

? rx_bit:讀狀態(tài)操作標(biāo)志

? tx_bit:寫(xiě)狀態(tài)操作標(biāo)志

3.3.3 aw_spinand_chip_request
struct aw_spinand_chip_request {
    unsigned int block;
    unsigned int page;
    unsigned int pageoff;
    unsigned int ooblen;
    unsigned int datalen;
    void *databuf;
    void *oobbuf;
    unsigned int oobleft;
    unsigned int dataleft;
};

操作目標(biāo)結(jié)構(gòu)體,改結(jié)構(gòu)體填充我們待操作的 block 的那個(gè) page 的多少偏移的數(shù)據(jù)

databuf/oobbuf

? block:待操作塊

? page:待操作頁(yè)

? pageoff:操作偏移

? ooblen:操作 oob 長(zhǎng)度

? datalen:操作數(shù)據(jù)長(zhǎng)度

? databuf:操作目標(biāo)數(shù)據(jù)

? oobbuf:操作目標(biāo) oob

3.3.4 ubi_ec_hdr
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;

@magic: erase counter header magic number (%UBI_EC_HDR_MAGIC)

@version: version of UBI implementation which is supposed to accept this UBI image

@padding1: reserved for future, zeroes

@ec: the erase counter

@vid_hdr_offset: where the VID header starts

@data_offset: where the user data start

@image_seq: image sequence number

@padding2: reserved for future, zeroes

@hdr_crc: erase counter header CRC checksum

EC: Erase Count,記錄塊的擦除次數(shù),在 ubiattach 的時(shí)候指定一個(gè) mtd,如果 PEB 上沒(méi)有

EC,則用平均的 EC 值,寫(xiě)入 EC 值只有在擦除的時(shí)候才會(huì)增加 1

3.3.5 ubi_vid_hdr
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;

@magic: volume identifier header magic number (%UBI_VID_HDR_MAGIC)

@version: UBI implementation version which is supposed to accept this UBI image(%UBI_VERSION)

@vol_type: volume type (%UBI_VID_DYNAMIC or %UBI_VID_STATIC)

@copy_flag: if this logical eraseblock was copied from another physical eraseblock(for wear-leveling reasons)

@compat: compatibility of this volume(%0, %UBI_COMPAT_DELETE, %UBI_COMPAT_IGNORE,%UBI_COMPAT_PRESERVE, or %UBI_COMPAT_REJECT)

@vol_id: ID of this volume

@lnum: logical eraseblock number

@padding1: reserved for future, zeroes

@data_size: how many bytes of data this logical eraseblock contains

@used_ebs: total number of used logical eraseblocks in this volume

@data_pad: how many bytes at the end of this physical eraseblock are not used

@data_crc: CRC checksum of the data stored in this logical eraseblock

@padding2: reserved for future, zeroes

@sqnum: sequence number

@padding3: reserved for future, zeroes

@hdr_crc: volume identifier header CRC checksum

參數(shù)說(shuō)明

@sqnum 是創(chuàng)建此 VID 頭時(shí)的全局序列計(jì)數(shù)器的值。每次 UBI 寫(xiě)一個(gè)新的 VID 頭到 flash 時(shí),全局序列計(jì)數(shù)器都會(huì)增加,比如當(dāng)它將一個(gè)邏輯的 eraseblock 映射到一個(gè)新的物理的 erase-block 時(shí)。全局序列計(jì)數(shù)器是一個(gè)無(wú)符號(hào) 64 位整數(shù),我們假設(shè)它永遠(yuǎn)不會(huì)溢出。@sqnum(序列號(hào)) 用于區(qū)分新舊版本的邏輯擦除塊。

有兩種情況,可能有多個(gè)物理 eraseblock 對(duì)應(yīng)同一個(gè)邏輯 eraseblock,即在卷標(biāo)識(shí)頭中有相同的 @vol_id@lnum 值。假設(shè)我們有一個(gè)邏輯的擦除塊 L,它被映射到物理的擦除塊 P。

  1. 因?yàn)?UBI 可以異步擦除物理上的擦除塊,所以可能出現(xiàn)以下情況:L 被異步擦除,所以 P 被安排擦除,然后 L 被寫(xiě)入,即。映射到另一個(gè)物理的擦除塊 P1,所以 P1 被寫(xiě)入,然后不干凈的重啟發(fā)生。結(jié)果-有兩個(gè)物理的 eraseblock P 和 P1 對(duì)應(yīng)同一個(gè)邏輯的 eraseblock L。但是 P1 的序列號(hào)更大,所以 UBI 在連接 flash 時(shí)選擇 P1。

  2. UBI 不時(shí)地將邏輯擦除塊移動(dòng)到其他物理擦除塊,以達(dá)到損耗均衡的目的。例如,如果 UBI將 L 從 P 移動(dòng)到 P1,在 P 被物理擦除之前會(huì)發(fā)生不干凈的重啟,有兩個(gè)物理擦除塊 P 和 P1 對(duì)應(yīng)于 L, UBI 必須在 flash 連接時(shí)選擇其中一個(gè)。@sqnum 字段表示哪個(gè) PEB 是原始的 (顯然 P 的 @sqnum 更低) 和副本。但是選擇具有更高序列號(hào)的物理擦除塊是不夠的,因?yàn)椴桓蓛舻闹匦乱龑?dǎo)可能發(fā)生在復(fù)制過(guò)程的中間,因此 P 中的數(shù)據(jù)被損壞(P->P1 沒(méi)復(fù)制完)。僅僅選擇序號(hào)較低的物理擦除塊是不夠的,因?yàn)槟抢锏臄?shù)據(jù)可能很舊 (考慮在復(fù)制之后向 P1 添加更多數(shù)據(jù)的情況)。此外,不干凈的重啟可能發(fā)生在擦除 P 剛剛開(kāi)始的時(shí)候,所以它會(huì)導(dǎo)致不穩(wěn)定的 P,“大部分” 是 OK 的,但仍然有不穩(wěn)定的情況。

UBI 使用 @copy_flag 字段表示這個(gè)邏輯擦除塊是一個(gè)副本。UBI 還計(jì)算數(shù)據(jù)的 CRC,當(dāng)數(shù)據(jù)被移動(dòng)時(shí),并將其存儲(chǔ)在副本 (P1) 的 @data_crc 字段。因此,當(dāng) UBI 需要從兩個(gè) (P 或 P1)中選擇一個(gè)物理擦除塊時(shí),會(huì)檢查新塊 (P1) 的 @copy_flag。如果它被清除,情況就簡(jiǎn)單了,新的就會(huì)被選中。如果設(shè)置了該值,則檢查副本 (P1) 的數(shù)據(jù) CRC。如果 CRC 校驗(yàn)和是正確的,這個(gè)物理擦除塊被選中 (P1)。否則,將選擇較老的 P。如果是靜態(tài)卷,@data_crc 字段包含邏輯擦除塊內(nèi)容的 CRC 校驗(yàn)和。對(duì)于動(dòng)態(tài)卷,它不包含 CRC 校驗(yàn)和規(guī)則。唯一的例外情況是,當(dāng)物理擦除塊的數(shù)據(jù)被磨損均衡子系統(tǒng)移動(dòng)時(shí),磨損均衡子系統(tǒng)計(jì)算數(shù)據(jù) CRC,并將其存儲(chǔ)在 @data_crc 字段中。

@used_ebs 字段僅用于靜態(tài)卷,它表示該卷的數(shù)據(jù)需要多少個(gè)擦除塊。對(duì)于動(dòng)態(tài)卷,這個(gè)字段不被使用并且總是包含 0。

@data_pad 在創(chuàng)建卷時(shí)使用對(duì)齊參數(shù)計(jì)算。因此,@data_pad 字段有效地減少了該卷的邏輯擦除塊的大小。當(dāng)一個(gè)人在 UBI 卷上使用面向塊的軟件 (比如,cramfs) 時(shí),這是非常方便的。

LEB PEB

Linux SPI-NAND 驅(qū)動(dòng)開(kāi)發(fā)指南

? 圖 3-2: PEB-LEB

3.4 關(guān)鍵接口說(shuō)明

3.4.1 MTD 層接口
3.4.1.1 aw_rawnand_mtd_erase
static int aw_rawnand_mtd_erase(struct mtd_info *mtd, struct erase_info *instr)

description:mtd erase interface

@mtd:MTD device structure

@instr:erase operation descrition structure

return:success return 0,fail return fail code

3.4.1.2 aw_rawnand_mtd_read
static int aw_rawnand_mtd_read(struct mtd_info *mtd, loff_t from, size_t len,size_t *retlen, u_char *buf)

description:mtd read interface

@mtd:MTD device structure

@from:offset to read from MTD device

@len: data len

@retlen:had read data len

@buf:data buffer

return:success return max_bitflips,fail return fail code

3.4.1.3 aw_rawnand_mtd_read_oob
static int aw_rawnand_mtd_read_oob(struct mtd_info *mtd, loff_t from, struct mtd_oob_ops *ops)

description:mtd read data with oob

@mtd:MTD device structure

@ops:oob eperation descrition structure

return:success return max_bitflips,fail return fail code

3.4.1.4 aw_rawnand_mtd_write
static int aw_rawnand_mtd_write(struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf)

description:mtd write data interface

@to:offset to MTD device

@len:want write data len

@retlen:return the writen len

@buf:data buffer

return:success return 0, fail return code fail

3.4.1.5 aw_rawnand_mtd_write_oob
static int aw_rawnand_mtd_write_oob(struct mtd_info *mtd, loff_t to, struct mtd_oob_ops *
ops)

description:write data with oob

@mtd:MTD device structure

@to:offset to MTD device

@ops:oob operation descrition structure

return:success return 0, fail return code fail

3.4.1.6 aw_rawnand_mtd_block_isbad

static int aw_rawnand_mtd_block_isbad(struct mtd_info *mtd, loff_t ofs)

description:check block is badblock or not

@mtd:MTD device structure

@ofs: offset the mtd device start (align to simu block size)

return:true if the block is bad, or false if the block is good

3.4.1.7 aw_rawnand_mtd_block_markbad
static int aw_rawnand_mtd_block_markbad(struct mtd_info *mtd, loff_t ofs)

description:mark block at the given offset as bad block

@mtd:MTD device structure

@ofs:offset the mtd device start

return:success to mark return 0, or fail return fail code.

3.4.2 物理層接口
3.4.2.1 aw_spinand_chip_read_single_page
static int aw_spinand_chip_read_single_page(struct aw_spinand_chip *chip, struct aw_spinand_chip_request *req)

description:Read physics on a page

@chip:See 3.3.2

@req:See 3.3.3

return:zero on success, else a negative error code.

3.4.2.2 aw_spinand_chip_write_single_page

static int aw_spinand_chip_write_single_page(struct aw_spinand_chip *chip, struct aw_spinand_chip_request *req)

description:Write physics on a page

@chip:See 3.3.2

@req:See 3.3.3

return:zero on success, else a negative error code.

3.4.2.3 aw_spinand_chip_erase_single_block
static int aw_spinand_chip_erase_single_block(struct aw_spinand_chip *chip, struct aw_spinand_chip_request *req)

description:Erase physics on a block

@chip:See 3.3.2

@req: See 3.3.3

return:zero on success, else a negative error code.

3.4.2.4 aw_spinand_chip_isbad_single_block
static int aw_spinand_chip_isbad_single_block(struct aw_spinand_chip *chip, struct aw_spinand_chip_request *req)

description:Set to bad block

@chip:See 3.3.2

@req:See 3.3.3

return:zero on success, else a negative error code.

3.4.2.5 aw_spinand_chip_markbad_single_block
static int aw_spinand_chip_markbad_single_block(struct aw_spinand_chip *chip, struct aw_spinand_chip_request *req)

description:Set to bad block

@chip:See 3.3.2

@req:See 3.3.3

return:zero on success, else a negative error code.

4 模塊配置

4.1 uboot 模塊配置

Device Drivers-->Sunxi flash support-->
[*]Support sunxi nand devices
[*]Support sunxi nand ubifs devices
[*]Support COMM NAND V1 interface

如下圖:

Linux SPI-NAND 驅(qū)動(dòng)開(kāi)發(fā)指南

? 圖 4-1: u-boot-spinand-menuconfig

?

4.2 kernel 模塊配置

Device Drivers->Memory Technology Device(MTD) support-->sunxi-nand

Linux SPI-NAND 驅(qū)動(dòng)開(kāi)發(fā)指南

? 圖 4-2: UBI

Linux SPI-NAND 驅(qū)動(dòng)開(kāi)發(fā)指南

? 圖 4-3: ker_nand-cfg

Linux SPI-NAND 驅(qū)動(dòng)開(kāi)發(fā)指南

? 圖 4-4: ker_spinand

Device Drivers->SPI support

Linux SPI-NAND 驅(qū)動(dòng)開(kāi)發(fā)指南

? 圖 4-5: spi-1

Linux SPI-NAND 驅(qū)動(dòng)開(kāi)發(fā)指南

? 圖 4-6: spi-2

Device Drivers->DMA Engine support

Linux SPI-NAND 驅(qū)動(dòng)開(kāi)發(fā)指南

? 圖 4-7: DMA-1

Linux SPI-NAND 驅(qū)動(dòng)開(kāi)發(fā)指南

? 圖 4-8: DMA-2

Device Drivers->SOC(System On Chip)

Linux SPI-NAND 驅(qū)動(dòng)開(kāi)發(fā)指南

? 圖 4-9: SID

File systems-->Miscellaneous filesystems-->

Linux SPI-NAND 驅(qū)動(dòng)開(kāi)發(fā)指南

? 圖 4-10: menuconfig_spinand_ubifs

4.3 env.cfg

在 env.cfg 中添加修改下值,setargs_nand_ubi 先 copy 一份 setargs_nand 再添加對(duì)應(yīng)變量

Linux SPI-NAND 驅(qū)動(dòng)開(kāi)發(fā)指南

? 圖 4-11: build-mkcmd文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-440948.html

到了這里,關(guān)于Linux SPI-NAND 驅(qū)動(dòng)開(kāi)發(fā)指南的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【全志V3s】SPI NAND Flash 驅(qū)動(dòng)開(kāi)發(fā)

    【全志V3s】SPI NAND Flash 驅(qū)動(dòng)開(kāi)發(fā)

    芯片:W25N01GVZEIG datasheet上的描述: SLC工藝 2KB*65536頁(yè) 10萬(wàn)次擦寫(xiě)次數(shù) 焊好以后用CH341A讀了一下 上面這張圖描述了soc啟動(dòng)的四個(gè)順序,分別是usb啟動(dòng)、sd卡啟動(dòng)、spi norflash啟動(dòng)、spi nandflash啟動(dòng)四種方式。前面的測(cè)試中一直走的是sd卡啟動(dòng),但是從成本和穩(wěn)定性上說(shuō),spi nandfla

    2024年02月07日
    瀏覽(20)
  • ArmSom---SPI開(kāi)發(fā)指南

    ArmSom---SPI開(kāi)發(fā)指南

    RK3588從入門(mén)到精通 本?主要介紹在Rockchip平臺(tái)配置spi接口并且使用的方法 開(kāi)發(fā)板:ArmSoM-W3 Kernel:5.10.160 OS:Debian11 SPI(Serial Peripheral Interface),即串行外圍設(shè)備接口,是一種同步的,全雙工的,多設(shè)備的,多主機(jī)的通信協(xié)議,用于連接外圍設(shè)備,如ADC、DAC、數(shù)據(jù)存儲(chǔ)器、定時(shí)

    2024年02月05日
    瀏覽(21)
  • 嵌入式linux之iMX6ULL驅(qū)動(dòng)開(kāi)發(fā) | 移遠(yuǎn)4G模塊EC800驅(qū)動(dòng)移植指南

    嵌入式linux之iMX6ULL驅(qū)動(dòng)開(kāi)發(fā) | 移遠(yuǎn)4G模塊EC800驅(qū)動(dòng)移植指南

    回顧下移遠(yuǎn)4G模塊移植過(guò)程, 還是蠻簡(jiǎn)單的。一通百通,無(wú)論是其他4G模塊都是一樣的。這里記錄下過(guò)程,分享給有需要的人。環(huán)境使用正點(diǎn)原子的imax6ul開(kāi)發(fā)板,板子默認(rèn)支持中興和移遠(yuǎn)EC20的驅(qū)動(dòng),這里要移植使用的是移遠(yuǎn)4G模塊EC800。 imax6ul開(kāi)發(fā)板 虛擬機(jī)(Ubuntu18.04) 交叉編譯

    2024年02月12日
    瀏覽(29)
  • NDIS協(xié)議驅(qū)動(dòng)開(kāi)發(fā)指南

    NDIS協(xié)議驅(qū)動(dòng)開(kāi)發(fā)指南

    我們知道,在以太網(wǎng)中所有的數(shù)據(jù)包都是通過(guò)以太網(wǎng)幀來(lái)發(fā)送的;但是在網(wǎng)絡(luò)上面的應(yīng)用程序如果需要通過(guò)網(wǎng)絡(luò)數(shù)據(jù)包交互,就需要依賴(lài)網(wǎng)絡(luò)協(xié)議來(lái)保障通信。平時(shí)我們用的最多的協(xié)議就是TCPIP協(xié)議。 其實(shí)在Windows中,我們可以注冊(cè)自己的協(xié)議,開(kāi)發(fā)自己的協(xié)議解析和封裝驅(qū)動(dòng)

    2024年02月03日
    瀏覽(18)
  • Java測(cè)試驅(qū)動(dòng)開(kāi)發(fā)實(shí)踐指南

    Java測(cè)試驅(qū)動(dòng)開(kāi)發(fā)(TDD)是一種軟件開(kāi)發(fā)方法,它集成了測(cè)試和開(kāi)發(fā)的操作,通過(guò)一組簡(jiǎn)單有效的流程來(lái)確保代碼的質(zhì)量和正確性。TDD可以在項(xiàng)目初期幫助開(kāi)發(fā)者明確需求和功能,并且在整個(gè)開(kāi)發(fā)過(guò)程中對(duì)代碼進(jìn)行快速、自動(dòng)化的測(cè)試,最終可以自動(dòng)化發(fā)現(xiàn)問(wèn)題和修復(fù)問(wèn)題。本

    2024年02月02日
    瀏覽(16)
  • 迅為RK3568開(kāi)發(fā)板驅(qū)動(dòng)開(kāi)發(fā)指南-輸入子系統(tǒng)

    迅為RK3568開(kāi)發(fā)板驅(qū)動(dòng)開(kāi)發(fā)指南-輸入子系統(tǒng)

    《iTOP-RK3568開(kāi)發(fā)板驅(qū)動(dòng)開(kāi)發(fā)指南》 更新,本次更新內(nèi)容對(duì)應(yīng)的是驅(qū)動(dòng) (第十三篇 輸入子系統(tǒng)) 視頻,幫助用戶(hù)快速入門(mén),大大提升研發(fā)速度。 第13篇-輸入子系統(tǒng) 目錄 第1篇 驅(qū)動(dòng)基礎(chǔ)篇 第2篇 字符設(shè)備基礎(chǔ) 第3篇 并發(fā)與競(jìng)爭(zhēng) 第4篇 高級(jí)字符設(shè)備進(jìn)階 第5篇 中斷 第6篇 平臺(tái)總

    2024年03月26日
    瀏覽(21)
  • 全志 Tina Linux LCD顯示屏調(diào)試指南 支持MIPI DSI RGB LVDS I8080 SPI等接口,開(kāi)發(fā)板支持百問(wèn)網(wǎng)T113 D1-H哪吒 DongshanPI-D1s V853

    全志 Tina Linux LCD顯示屏調(diào)試指南 支持MIPI DSI RGB LVDS I8080 SPI等接口,開(kāi)發(fā)板支持百問(wèn)網(wǎng)T113 D1-H哪吒 DongshanPI-D1s V853

    編寫(xiě)目的 本文檔將介紹sunxi 平臺(tái)Display Engine 模塊中LCD 的調(diào)試方法。 LCD 調(diào)試方法,調(diào)試手段。 LCD 驅(qū)動(dòng)編寫(xiě)。 lcd0 節(jié)點(diǎn)下各個(gè)屬性的解釋。 典型LCD 接口配置。 適用范圍:sunxi 平臺(tái)DE1.0/DE2.0 中LCD 屏幕參數(shù)設(shè)置。 表2-1: LCD 相關(guān)術(shù)語(yǔ) 術(shù)語(yǔ) 解釋說(shuō)明 SUNXI Allwinner 一系列SoC 硬件平臺(tái)

    2024年02月02日
    瀏覽(26)
  • 第22章 自旋鎖死鎖實(shí)驗(yàn)(iTOP-RK3568開(kāi)發(fā)板驅(qū)動(dòng)開(kāi)發(fā)指南 )

    第22章 自旋鎖死鎖實(shí)驗(yàn)(iTOP-RK3568開(kāi)發(fā)板驅(qū)動(dòng)開(kāi)發(fā)指南 )

    瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工藝,搭載一顆四核Cortex-A55處理器和Mali G52 2EE 圖形處理器。RK3568 支持4K 解碼和 1080P 編碼,支持SATA/PCIE/USB3.0 外圍接口。RK3568內(nèi)置獨(dú)立NPU,可用于輕量級(jí)人工智能應(yīng)用。RK3568 支持安卓 11 和 linux 系統(tǒng),主要面向物聯(lián)網(wǎng)

    2024年02月09日
    瀏覽(30)
  • 第19章 并發(fā)與競(jìng)爭(zhēng)實(shí)驗(yàn)(iTOP-RK3568開(kāi)發(fā)板驅(qū)動(dòng)開(kāi)發(fā)指南 )

    第19章 并發(fā)與競(jìng)爭(zhēng)實(shí)驗(yàn)(iTOP-RK3568開(kāi)發(fā)板驅(qū)動(dòng)開(kāi)發(fā)指南 )

    瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工藝,搭載一顆四核Cortex-A55處理器和Mali G52 2EE 圖形處理器。RK3568 支持4K 解碼和 1080P 編碼,支持SATA/PCIE/USB3.0 外圍接口。RK3568內(nèi)置獨(dú)立NPU,可用于輕量級(jí)人工智能應(yīng)用。RK3568 支持安卓 11 和 linux 系統(tǒng),主要面向物聯(lián)網(wǎng)

    2024年02月09日
    瀏覽(19)
  • Linux MIPI CSI 開(kāi)發(fā)指南

    Linux MIPI CSI 開(kāi)發(fā)指南

    1.1 文檔簡(jiǎn)介 介紹 VIN(video input)驅(qū)動(dòng)配置,API 接口和上層使用方法。 1.2 目標(biāo)讀者 camera 驅(qū)動(dòng)開(kāi)發(fā)、維護(hù)人員和應(yīng)用開(kāi)發(fā)人員。 1.3 適用范圍 ? 表 1-1: 適用產(chǎn)品列表 內(nèi)核版本 驅(qū)動(dòng)文件 Linux-4.9 drivers/media/platform/sunxi_vin/*.c Linux-5.4 drivers/media/platform/sunxi_vin/*.c 2.1 模塊功能介紹

    2024年01月18日
    瀏覽(21)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包