Linux SPI-NAND 驱动开发指南
文章目录
- Linux SPI-NAND 驱动开发指南
- 1 概述
- 1.1 编写目的
- 1.2 适用范围
- 1.3 相关人员
- 3 流程设计
- 3.1 体系结构
- 3.2 源码结构
- 3.3 关键数据定义
- 3.3.1 flash 设备信息数据结构
- 3.3.2 flash chip 数据结构
- 3.3.3 aw_spinand_chip_request
- 3.3.4 ubi_ec_hdr
- 3.3.5 ubi_vid_hdr
- 3.4 关键接口说明
- 3.4.1 MTD 层接口
- 3.4.1.1 aw_rawnand_mtd_erase
- 3.4.1.2 aw_rawnand_mtd_read
- 3.4.1.3 aw_rawnand_mtd_read_oob
- 3.4.1.4 aw_rawnand_mtd_write
- 3.4.1.5 aw_rawnand_mtd_write_oob
- 3.4.1.6 aw_rawnand_mtd_block_isbad
- 3.4.1.7 aw_rawnand_mtd_block_markbad
- 3.4.2 物理层接口
- 3.4.2.1 aw_spinand_chip_read_single_page
- 3.4.2.3 aw_spinand_chip_erase_single_block
- 3.4.2.4 aw_spinand_chip_isbad_single_block
- 3.4.2.5 aw_spinand_chip_markbad_single_block
- 4 模块配置
- 4.1 uboot 模块配置
- 4.2 kernel 模块配置
- 4.3 env.cfg
Linux SPI-NAND 驱动开发指南
1 概述
1.1 编写目的
介绍 Sunxi SPINand mtd/ubi 驱动设计, 方便相关驱动和应用开发人员
1.2 适用范围
本设计适用于所有 sunxi 平台
1.3 相关人员
Nand 模块开发人员,及应用开发人员等
2 术语、缩略语及概念
MTD:(Memory Technology device)是用于访问存储设备的 linux 子系统。本模块是MTD 子系统的 flash 驱动部分
UBI:UBI 子系统是基于 MTD 子系统的,在 MTD 上实现 nand 特性的管理逻辑,向上屏蔽nand 的特性
坏块 (Bad Block):制作工艺和 nand 本身的物理性质导致在出厂和正常使用过程中都会产生坏块
3 流程设计
3.1 体系结构
NAND MTD/UBI 驱动主要包括 5 大组件,如下图:

图 3-1: UBI 架构
说明:
- MTD standard interface: 对接 MTD 层通用读写接口
- FLASH bad block manager: 驱动层对 flash 坏块的管理
- FLASH SPL: 主要是实现读写 boot0、boot1,可用于 ioctl 对boot0、boot1 的升级
- SECURESTORAGE:主要是给上层提供私有数据的管理 SPI:HOST端控制器层的实现。
3.2 源码结构
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
内核目录下
`-- include`-- linux`-- mtd|-- aw-spinand.h
3.3 关键数据定义
3.3.1 flash 设备信息数据结构
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 0x03int 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;
};
说明:
• Model:flash 的 model 名字
• NandID:flash 的 id 码
• DieCntPerChip:每 chip 的 die 个数
• BlkCntPerDie:每 die 有多少个 block
• PageCntPerBlk:每 block 有多少个 page
• SectCntPerPage:每 page 有多少个扇区
• OobSizePerPage:每 page 的 obb 大小
• BadBlockFlag:坏块标志存放在每个 block 的那个 page 中
-
BAD_BLK_FLAG_FRIST_1_PAGE
-
BAD_BLK_FLAG_FIRST_2_PAGE
-
BAD_BLK_FLAG_LAST_1_PAGE
-
BAD_BLK_FLAG_LAST_2_PAGE
• OperationOpt:支持的操作
-
SPINAND_DUAL_READ
-
SPINAND_QUAD_READ
-
SPINAND_QUAD_PROGRAM
-
SPINAND_QUAD_NO_NEED_ENABLE
-
SPINAND_ONEDUMMY_AFTER_RANDOMREAD
• MaxEraseTimes:最大擦除数据
• EccFlag:特性物料读 ecc status 说需目录不同
• GD5F1GQ4UCYIG 通过 0Fh + C0h 获取 ecc status,则无需配置 EccFlag
• MX35LF1GE4AB 通过 7Ch + one dummy byte 获取 ecc status,则配置 EccFlag = HAS_EXT_ECC_STATUS
• EccType:设置 ecc 值对应的状态关系
• EccProtectedType:在 spare 去选择收 ecc 保护的 16byte 作为 oob 区
例(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 数据结构
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;
};
此结构定义了 flash chip 层的物理模型数据结构以及 chip 层对 flash 的操作接口。
• aw_spinand_chip_ops:flash 读、写、擦等操作接口
• aw_spinand_ecc:flash ecc 读、写和校验操作接口
• aw_spinand_cache:对缓存 page 的管理,提高读写效率
• aw_spinand_info:flash ID、page size 等信息及获取信息的操作接口
• aw_spinand_bbt:flash 坏块表及管理等操作接口
• spi_device:spi 父设备的操作结构体
• rx_bit:读状态操作标志
• tx_bit:写状态操作标志
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;
};
操作目标结构体,改结构体填充我们待操作的 block 的那个 page 的多少偏移的数据
databuf/oobbuf
• block:待操作块
• page:待操作页
• pageoff:操作偏移
• ooblen:操作 oob 长度
• datalen:操作数据长度
• databuf:操作目标数据
• oobbuf:操作目标 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,记录块的擦除次数,在 ubiattach 的时候指定一个 mtd,如果 PEB 上没有
EC,则用平均的 EC 值,写入 EC 值只有在擦除的时候才会增加 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
参数说明
@sqnum 是创建此 VID 头时的全局序列计数器的值。每次 UBI 写一个新的 VID 头到 flash 时,全局序列计数器都会增加,比如当它将一个逻辑的 eraseblock 映射到一个新的物理的 erase-block 时。全局序列计数器是一个无符号 64 位整数,我们假设它永远不会溢出。@sqnum(序列号) 用于区分新旧版本的逻辑擦除块。
有两种情况,可能有多个物理 eraseblock 对应同一个逻辑 eraseblock,即在卷标识头中有相同的 @vol_id 和 @lnum 值。假设我们有一个逻辑的擦除块 L,它被映射到物理的擦除块 P。
-
因为 UBI 可以异步擦除物理上的擦除块,所以可能出现以下情况:L 被异步擦除,所以 P 被安排擦除,然后 L 被写入,即。映射到另一个物理的擦除块 P1,所以 P1 被写入,然后不干净的重启发生。结果-有两个物理的 eraseblock P 和 P1 对应同一个逻辑的 eraseblock L。但是 P1 的序列号更大,所以 UBI 在连接 flash 时选择 P1。
-
UBI 不时地将逻辑擦除块移动到其他物理擦除块,以达到损耗均衡的目的。例如,如果 UBI将 L 从 P 移动到 P1,在 P 被物理擦除之前会发生不干净的重启,有两个物理擦除块 P 和 P1 对应于 L, UBI 必须在 flash 连接时选择其中一个。@sqnum 字段表示哪个 PEB 是原始的 (显然 P 的 @sqnum 更低) 和副本。但是选择具有更高序列号的物理擦除块是不够的,因为不干净的重新引导可能发生在复制过程的中间,因此 P 中的数据被损坏(P->P1 没复制完)。仅仅选择序号较低的物理擦除块是不够的,因为那里的数据可能很旧 (考虑在复制之后向 P1 添加更多数据的情况)。此外,不干净的重启可能发生在擦除 P 刚刚开始的时候,所以它会导致不稳定的 P,“大部分” 是 OK 的,但仍然有不稳定的情况。
UBI 使用 @copy_flag 字段表示这个逻辑擦除块是一个副本。UBI 还计算数据的 CRC,当数据被移动时,并将其存储在副本 (P1) 的 @data_crc 字段。因此,当 UBI 需要从两个 (P 或 P1)中选择一个物理擦除块时,会检查新块 (P1) 的 @copy_flag。如果它被清除,情况就简单了,新的就会被选中。如果设置了该值,则检查副本 (P1) 的数据 CRC。如果 CRC 校验和是正确的,这个物理擦除块被选中 (P1)。否则,将选择较老的 P。如果是静态卷,@data_crc 字段包含逻辑擦除块内容的 CRC 校验和。对于动态卷,它不包含 CRC 校验和规则。唯一的例外情况是,当物理擦除块的数据被磨损均衡子系统移动时,磨损均衡子系统计算数据 CRC,并将其存储在 @data_crc 字段中。
@used_ebs 字段仅用于静态卷,它表示该卷的数据需要多少个擦除块。对于动态卷,这个字段不被使用并且总是包含 0。
@data_pad 在创建卷时使用对齐参数计算。因此,@data_pad 字段有效地减少了该卷的逻辑擦除块的大小。当一个人在 UBI 卷上使用面向块的软件 (比如,cramfs) 时,这是非常方便的。
LEB 与 PEB

图 3-2: PEB-LEB
3.4 关键接口说明
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
如下图:

图 4-1: u-boot-spinand-menuconfig
4.2 kernel 模块配置
Device Drivers->Memory Technology Device(MTD) support-->sunxi-nand

图 4-2: UBI

图 4-3: ker_nand-cfg

图 4-4: ker_spinand
Device Drivers->SPI support

图 4-5: spi-1

图 4-6: spi-2
Device Drivers->DMA Engine support

图 4-7: DMA-1

图 4-8: DMA-2
Device Drivers->SOC(System On Chip)

图 4-9: SID
File systems-->Miscellaneous filesystems-->

图 4-10: menuconfig_spinand_ubifs
4.3 env.cfg
在 env.cfg 中添加修改下值,setargs_nand_ubi 先 copy 一份 setargs_nand 再添加对应变量

图 4-11: build-mkcmd
相关文章:
Linux SPI-NAND 驱动开发指南
文章目录Linux SPI-NAND 驱动开发指南1 概述1.1 编写目的1.2 适用范围1.3 相关人员3 流程设计3.1 体系结构3.2 源码结构3.3 关键数据定义3.3.1 flash 设备信息数据结构3.3.2 flash chip 数据结构3.3.3 aw_spinand_chip_request3.3.4 ubi_ec_hdr3.3.5 ubi_vid_hdr3.4 关键接口说…...
【THREE.JS学习(3)】使用THREEJS加载GeoJSON地图数据
本文接着系列文章(2)进行介绍,以VUE2为开发框架,该文涉及代码存放在HelloWorld.vue中。相较于上一篇文章对div命名class等,该文简洁许多。<template> <div></div> </template>接着引入核心库i…...
在windows搭建Redis集群并整合入Springboot项目
搭建集群配置规划Redis集群编写bat来启动每个redis服务安装Ruby安装Redis的Ruby驱动出现错误镜像过期SSL证书过期安装集群脚本redis-trib启动每个节点并执行集群构建脚本测试搭建是否成功配置springboot项目中配置规划Redis集群 我们搭建三个节点的集群,每个节点有…...
C++【内存管理】
文章目录C内存管理一、C/C内存分布1.1.C/C内存区域划分图解:1.2.根据代码进行内存区域分析二、C内存管理方式2.1.new/delete操作内置类型2.2.new和delete操作自定义类型三、operator new与operator delete函数四、new和delete的实现原理4.1.内置类型4.2.自定义类型4…...
Spring Cloud Nacos源码讲解(六)- Nacos客户端服务发现
Nacos客户端服务发现源码分析 总体流程 首先我们先通过一个图来直观的看一下,Nacos客户端的服务发现,其实就是封装参数、调用服务接口、获得返回实例列表。 但是如果我们要是细化这个流程,会发现不仅包括了通过NamingService获取服务列表…...
华为OD机试题,用 Java 解【计算最大乘积】问题
最近更新的博客 华为OD机试 - 猴子爬山 | 机试题算法思路 【2023】华为OD机试 - 分糖果(Java) | 机试题算法思路 【2023】华为OD机试 - 非严格递增连续数字序列 | 机试题算法思路 【2023】华为OD机试 - 消消乐游戏(Java) | 机试题算法思路 【2023】华为OD机试 - 组成最大数…...
蓝牙运动耳机哪个好,比较好的运动蓝牙耳机
很多想选择蓝牙运动耳机的朋友都不知道应该如何选择,运动首先需要注意的就是耳机的防水能力以及耳机佩戴舒适度,在运动当中会排出大量的汗水,耳机防水等级做到越高,可以更好地保护耳机不受汗水浸湿,下面就分享五款适合…...
苹果设计可变色Apple Watch表带,智能穿戴玩法多
苹果最新技术专利显示,苹果正在为 Apple Watch 设计一款可变色的表带,可以根据佩戴者所穿着的服装、所在的环境等自动改变颜色。据介绍,这款表带里的灯丝具有电致变色功能,可以通过施加不同的电压,来实现显示多种颜色或…...
Elasticsearch集群Yellow亚健康状态修复
Elasticsearch集群Yellow亚健康状态修复问题背景排查流程解决办法问题背景 Elasticsearch集群健康状态为Yellow,涉及到多个索引。 排查流程 在浏览器打开Kibana Console进行问题排查,console地址为: http://{Kibana_IP}:5601/app/dev_too…...
第52讲:SQL优化之UPDATE更新操作的优化
文章目录 1.UPDATE更新语句的优化2.UPDATE更新语句优化案例1.UPDATE更新语句的优化 我们在使用UPDATE更新语句更改表中数据时,可能会导致表中产生行级锁或者是表级锁。 UPDATE语句的优化就是为了避免表中出现表级锁,从而影响并发的性能。 当UPDATE语句更新表数据时,WHERE…...
logback 自定义日志输出到数据库
项目日志格式 Spring Boot 的默认日志输出类似于以下示例: 2021-12-14 22:40:14.159 INFO 20132 --- [ main] com.kuangstudy.SpringbootApplication : Started SpringbootApplication in 2.466 seconds (JVM running for 3.617)输出以下项目&…...
< elementUi 组件插件: el-table表格拖拽修改列宽及行高 及 使用注意事项 >
elementUi 组件插件: el-table拖拽修改列宽及行高 及 使用注意事项👉 资源Js包下载及说明👉 使用教程> 实现原理> 局部引入> 全局引入 (在main.js中)👉 注意事项往期内容 💨Ǵ…...
微信小程序的分享朋友圈
分享朋友圈官方API:分享到朋友圈 1、分享到朋友圈接口设置事项: 2、onShareTimeline()注意事项: 3、分享朋友圈后,测试发现,没有数据请求。 用户在朋友圈打开分享的小程序页面,并不会真正打开小程序&…...
华为OD机试真题Python实现【 寻找路径】真题+解题思路+代码(20222023)
寻找路径 题目 二叉树也可以用数组来存储,给定一个数组,树的根节点的值储存在下标 1, 对于储存在下标 n 的节点,他的左子节点和右子节点分别储存在下标 2*n 和 2*n+1, 并且我们用 -1 代表一个节点为空。 给定一个数组存储的二叉树,试求从根节点到最小的叶子节点的路径,…...
九头蛇hydra爆破http示例
使用hydra执行http表单暴力破解 通过浏览器自带分析得知: 提交地址:http://10.0.0.115/student_attendance/ajax.php?action=login 提交方式:POST 提交数据:username=a&password=a 服务响应:3 根据以上收集的信息就可以使用hydra进行密码爆破 hydra 10.0.0.115 http…...
jQuery基本使用
获取和设置元素内容学习目标能够知道获取和设置元素内容的操作1. html方法的使用jquery中的html方法可以获取和设置标签的html内容示例代码:<script>$(function(){var $div $("#div1");// 获取标签的html内容var result $div.html();alert(result);// 设置…...
互联网企业如何进行数字化转型?业务需求迭代频繁的应对之策!
互联网行业作为我国数字经济发展“四化”框架中生产力主要组成部分,是国家数字化转型的主要推动者之一。为此,相对于其他传统行业来说,互联网行业企业数字化转型的紧迫程度更高,如果不数字化转型或者转型不成功,会有更…...
前端学习日记——Vue之Vuex初识(一)
前言 学习前端一段时间了,因为一直是做Python开发,所以凭借着语言的通性学习Javascript、Vue轻快很多,但一些碎片化的知识及插件的使用方法还是需要记录一下,时而复习,形成系统化的知识体系(PS:…...
【C++】Windows动态库【.DLL文件】制作方法总结
如题,我们本篇介绍如何制作DLL,将代码类中的方法以接口的形式暴露出来给exe程序使用。会涉及类厂创建方法实例、声明DLL接口、.def文件的使用等。 目录 一、DLL介绍 二、C制作DLL文件 2.1 DLL端 2.2 调用端 三、DLL导出类方法 四、COM技术制作DLL…...
C 语言编程 — HelloWorld
目录 文章目录目录安装 Linux GCC 编译器YUM 安装发行版本编译安装指定版本HelloWorld基本语法编码运行安装 Linux GCC 编译器 YUM 安装发行版本 $ yum install gcc vim -y$ gcc --version gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39) Copyright © 2015 Free Software…...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
elementUI点击浏览table所选行数据查看文档
项目场景: table按照要求特定的数据变成按钮可以点击 解决方案: <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...
云安全与网络安全:核心区别与协同作用解析
在数字化转型的浪潮中,云安全与网络安全作为信息安全的两大支柱,常被混淆但本质不同。本文将从概念、责任分工、技术手段、威胁类型等维度深入解析两者的差异,并探讨它们的协同作用。 一、核心区别 定义与范围 网络安全:聚焦于保…...
C++--string的模拟实现
一,引言 string的模拟实现是只对string对象中给的主要功能经行模拟实现,其目的是加强对string的底层了解,以便于在以后的学习或者工作中更加熟练的使用string。本文中的代码仅供参考并不唯一。 二,默认成员函数 string主要有三个成员变量,…...
链式法则中 复合函数的推导路径 多变量“信息传递路径”
非常好,我们将之前关于偏导数链式法则中不能“约掉”偏导符号的问题,统一使用 二重复合函数: z f ( u ( x , y ) , v ( x , y ) ) \boxed{z f(u(x,y),\ v(x,y))} zf(u(x,y), v(x,y)) 来全面说明。我们会展示其全微分形式(偏导…...
