当前位置: 首页 > news >正文

海思ubootsd卡协议

start_armboot()函数中调用mmc_initialize(0)初始化mmc;最终调用到int hi_mci_initialize(unsigned int dev_num)函数;内容如下:

static int hi_mci_initialize(unsigned int dev_num)
{struct mmc *mmc = NULL;static struct himci_host *host;unsigned int regval;unsigned long base_addr = 0;HIMCI_DEBUG_FUN("Function Call");/* enable SDIO clock and clock 50MHz 使能时钟且设置时钟为50M*/hi_mci_sys_init(dev_num);base_addr = SDIO0_BASE_REG; //SDIO基地址/* check controller version. 检查控制器协议*/regval = himci_readl(base_addr +  MCI_VERID);if ((regval != MCI_VERID_VALUE) && (regval != MCI_VERID_VALUE2)) {printf("MMC/SD/EMMC controller version incorrect.\n");return -ENODEV;}host = malloc(sizeof(struct himci_host)); //申请内存if (!host)return -ENOMEM;memset(host, 0, sizeof(struct himci_host));mmc = &host->mmc; //获得host中的mmc变量,下面准备填充mmc;mmc->priv = host;//私有指针放上级(父)对象;host->base = base_addr;//赋值基地址host->dma_des = hi_dma_des;host->dev_id = dev_num;//设备编号host->card_status = hi_mci_sys_card_detect(host);//探测卡状态host->port = 0;
#ifdef CONFIG_EMMC_SUPPORT
#ifdef CONFIG_EMMC_PORThost->port = CONFIG_EMMC_PORT;
#endif
#endifsprintf(mmc->name, DRIVER_NAME);mmc->send_cmd = hi_mci_request;//发送命令回调mmc->set_ios = hi_mci_set_ios;mmc->init = hi_mci_init;//初始化回调mmc->host_caps = MMC_MODE_HS | MMC_MODE_HS_52MHz| MMC_MODE_4BIT | MMC_MODE_8BIT;mmc->voltages = MMC_VDD_32_33 | MMC_VDD_33_34;//电压值范围mmc->f_min = MMC_CCLK_MIN;mmc->f_max = MMC_CCLK_MAX;
#ifdef CONFIG_HIMCI_V200mmc->is_init = 0;
#endifmmc_register(mmc);//注册mmcadd_shutdown(himci_shutdown);//关机回调return 0;
}

重要的两个结构体struct mmc和struct himci_host

struct himci_host {struct mmc        mmc;unsigned long        base;//基地址unsigned int        card_status;//卡状态(插入/拔出)unsigned int        dev_id;//设备编号idunsigned int        port;int            cmd_id;struct mmc_cmd        *cmd;struct himci_dma_des    *dma_des;
};

mmc结构体其中几个变量对应下面sd卡协议中的寄存器;

struct mmc {
#ifdef CONFIG_HIMCI_V200int is_init;
#endifstruct list_head link;char name[32];//名字void *priv;//私有指针uint voltages;//电压值uint version;//版本号uint f_min;uint f_max;int high_capacity;//最高容量uint bus_width;//总线宽度uint clock;//时钟uint card_caps;//卡容量uint host_caps;uint ocr; //操作条件寄存器; 32bituint scr[2];//sd卡配置寄存器;有关sd存储卡特殊功能的信息;64bituint csd[4];//卡特定数据;有关卡操作条件的信息; 128bituint cid[4];//卡片识别号:用于识别的卡片个人编号; 128bitushort rca;//相对卡地址;卡的本地系统地址,由卡动态建议并在初始化期间由主机批准;16bituint tran_speed;//传输速度uint read_bl_len;uint write_bl_len;u64 capacity;block_dev_desc_t block_dev;int (*send_cmd)(struct mmc *mmc,struct mmc_cmd *cmd, struct mmc_data *data);void (*set_ios)(struct mmc *mmc);int (*init)(struct mmc *mmc);
};

OCR寄存器:

其中0~23为电压范围;

bit30位:卡容量状态位,当卡为大容量内存卡时,该位为1; 当卡为标准内存卡时,该位为0;卡容量状态位在卡上电过程完成且卡上电状态位设置为1后生效;

Bit31位:卡上电状态位,若上电状态完成,设置为1;

CID寄存器

卡标识寄存器,128bit; 包含了卡标识信息在卡识别阶段使用; 每个读写卡应该具有唯一的识别号;

对应结构体为struct mmc_cid;

struct mmc_cid {unsigned long psn; //产品序列号unsigned short oid;//一个2字符ASCII字符串,用于标识卡OEM和/或卡内容unsigned char mid;//制造商IDunsigned char prv;//产品修订版unsigned char mdt;//制造日期char pnm[7];//产品名称
};

CSD寄存器

卡特定数据寄存器提供有关访问卡内容的信息;定义了数据格式,纠错类型,最大数据访问时间,DSR寄存器寄存器的寄存器可编程部分可由CMD27更改;

TAAC

定义数据访问时间的异步部分;

NSAC

定义数据访问时间的时钟相关因素的最坏情况。NSAC的单位是100时钟周期。因此,数据访问时间的时钟相关部分的最大值是25.5k个时钟周期。

总访问时间NAC是TAAC和NSAC的总和。它应由主机根据实际时钟速率进行计算。读取访问时间应被解释为数据块或流的第一数据位的典型延迟。

TRAN_SPPED

定义了每一个数据行的最大传输速率;

CCC

SD存储卡命令集分为多个子集(命令类); CCC中的值为1bit表示支持相应的命令类;

READ_BL_LEN

最大读取数据长度计算为2的read_bl_len次方;

READ_BL_PARTIAL

SD存储卡中始终允许部分块读取;意味着可以使用最小的块,最小块为一个字节;

WRITE_BLK_MISALIGN/READ_BLK_MISALIGN

定义由一个命令写入/读的数据块是否可以分布在多个物理块上存储设备的块;内存块的大小在WRITE_BL_LEN/READ_BL_LEN中定义; =0表示跨越物理块边界无效; =1表示允许跨越物理块边界;

DSR_IMP

定义可配置驱动程序阶段是否集成在卡上。=0表未被实施 =1表示已实施;

C_SIZE

此参数用于计算用户的数据卡容量;

VDD_R_CURR_MIN, VDD_W_CURR_MIN

最小电源VDD处的读取和写入电流的最大值编码如下;

VDD_R_CURR_MAX, VDD_W_CURR_MAX

最大电源V DD处的读和写电流的最大值编码;

C_SIZE_MULT

此参数用于编码因子MULT,以计算总设备大小;

MULT = 2的(C_SIZE_MULT+2)次方;

ERASE_BLK_EN

定义要擦除的数据的单位大小的粒度,擦除操作可以擦除512字节的一个或多个单位SECTOR_SIZE;

如果ERASE_BLK_EN=0,主机可以擦除一个或多个SECTOR_SIZE单元。擦除将开始从包含起始地址的扇区的开头到包含结束地址;

如果ERASE_BLK_EN=1,主机可以擦除一个或多个512字节的单元。包含数据的所有块从起始地址到结束地址被擦除;

SECTOR_SIZE

可擦除扇区的大小;

WP_GRP_ENABLE

值为0表示不可能进行组写保护;

R2W_FACTOR

将典型块编程时间定义为读取访问时间的倍数;

WRITE_BL_LEN

最大写入数据块长度计算为2 的write_BL_LEN次方。最大块长度可能因此在512到2048字节的范围内。始终支持512字节的写入块长度。

WRITE_BL_PARTIAL

定义块写入命令中是否可以使用部分块大小。

WRITE_BL_PARTIAL=0表示在512字节单位的分辨率可用于面向块的数据写入。

WRITE_BL_PARTIAL=1表示也可以使用更小的块。最小块大小为1字节;

FILE_FORMAT_GRP

指示选定的文件格式组;

COPY

定义内容是原始(=0)还是已复制(=1);

PERM_WRITE_PROTECT

永久保护整个卡内容不被覆盖或擦除(所有写入和擦除此卡的命令被永久禁用)。默认值为0,即不永久写入受保护的。

TMP_WRITE_PROTECT

暂时保护整个卡内容不被覆盖或擦除(所有写入和擦除此卡的命令暂时禁用)。该位可以设置和重置。默认值为0,即不写保护。

FILE_FORMAT

指示卡上的文件格式;

CRC

CRC字段携带CSD内容的校验和;

uboot中对应结构体如下:

struct mmc_csd
{u8    csd_structure:2,spec_vers:4,rsvd1:2;u8    taac;u8    nsac;u8    tran_speed;u16    ccc:12,read_bl_len:4;u64    read_bl_partial:1,write_blk_misalign:1,read_blk_misalign:1,dsr_imp:1,rsvd2:2,c_size:12,vdd_r_curr_min:3,vdd_r_curr_max:3,vdd_w_curr_min:3,vdd_w_curr_max:3,c_size_mult:3,sector_size:5,erase_grp_size:5,wp_grp_size:5,wp_grp_enable:1,default_ecc:2,r2w_factor:3,write_bl_len:4,write_bl_partial:1,rsvd3:5;u8    file_format_grp:1,copy:1,perm_write_protect:1,tmp_write_protect:1,file_format:2,ecc:2;u8    crc:7;u8    one:1;
};

hi_mci_initialize()函数又调用了mmc_register(mmc);

int mmc_register(struct mmc *mmc)
{
#ifdef CONFIG_HIMCI_V200struct himci_host *host = mmc->priv;
#endif/* Setup the universal parts of the block interface just once */mmc->block_dev.if_type = IF_TYPE_MMC;mmc->block_dev.part_type = PART_TYPE_DOS;
#ifdef CONFIG_HIMCI_V200mmc->block_dev.dev = host->dev_id;
#elsemmc->block_dev.dev = cur_dev_num++;
#endifmmc->block_dev.removable = 1;mmc->block_dev.block_read = mmc_mbread;mmc->block_dev.block_write = mmc_bwrite;INIT_LIST_HEAD (&mmc->link);list_add_tail (&mmc->link, &mmc_devices);//将mmc加入全局mmc设备链表return 0;
}

其中主要初始化block_dev结构体,结构体如下:

typedef struct block_dev_desc {int        if_type;    /* type of the interface 接口类型*/int        dev;        /* device number 设备号*/unsigned char    part_type;    /* partition type 分区类型*/unsigned char    target;        /* target SCSI ID 目标SCSI ID*/unsigned char    lun;        /* target LUN 目标LUN*/unsigned char    type;        /* device type 设备类型*/unsigned char    removable;    /* removable device 可移动的设备*/
#ifdef CONFIG_LBA48unsigned char    lba48;        /* device can use 48bit addr (ATA/ATAPI v7) 设备可以使用48bit地址*/
#endiflbaint_t        lba;        /* number of blocks 块数量*/unsigned long    blksz;        /* block size 块大小*/char        vendor [40+1];    /* IDE model, SCSI Vendor */char        product[20+1];    /* IDE Serial no, SCSI product IDE型号,SCSI供应商*/char        revision[8+1];    /* firmware revision 固件版本*/unsigned long    (*block_read)(int dev,unsigned long start,lbaint_t blkcnt,void *buffer);unsigned long    (*block_write)(int dev,//设备号unsigned long start,//块起始地址lbaint_t blkcnt,//块数量const void *buffer);void        *priv;        /* driver private struct pointer */
}block_dev_desc_t;

其中block_read和block_write回调函数用于块读/写;

两个回调函数都调用了mmc_send_cmd命令;

int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)
{return mmc->send_cmd(mmc, cmd, data);
}

又回调了send_cmd函数, 该函数在最初的hi_mci_initialize函数中被赋值为hi_mci_request;

mmc_send_cmd调用示例:

int mmc_read_block(struct mmc *mmc, void *dst, uint blocknum)
{struct mmc_cmd cmd;struct mmc_data data;cmd.cmdidx = MMC_CMD_READ_SINGLE_BLOCK;if (mmc->high_capacity)cmd.cmdarg = blocknum;elsecmd.cmdarg = blocknum * mmc->read_bl_len;cmd.resp_type = MMC_RSP_R1;cmd.flags = 0;data.dest = dst;data.blocks = 1;data.blocksize = mmc->read_bl_len;data.flags = MMC_DATA_READ;return mmc_send_cmd(mmc, &cmd, &data);
}

其中将cmd和data结构体填充后调用mmc_send_cmd(); 读buf地址被赋值到data.dest处返回;

hi_mci_request()函数中先调用hi_mci_setup_data()准备数据,如将目的地址赋值给dma对应地址等;填充好dma结构体; 然后调用hi_mci_idma_start()开启dma; 完成数据的读/写;

在函数hi_mci_initialize()中还初始化了初始化回调mmc->init = hi_mci_init;

然后在start_armboot中调用mmc_flash_init(0); 该函数最终调用了hi_mci_init();

hi_mci_init()调用了hi_mci_init_card();

static void hi_mci_init_card(struct himci_host *host)
{unsigned int tmp_reg;HIMCI_DEBUG_FUN("Function Call");HIMCI_ASSERT(host);hi_mci_sys_reset(host);/* card reset */himci_writel(~(1<<host->port), host->base + MCI_RESET_N);__udelay(CONFIG_MMC_RESET_LOW_TIMEOUT);/* card power off and power on */hi_mci_ctrl_power(host, POWER_OFF);__udelay(CONFIG_MMC_POWER_OFF_TIMEOUT * 1000);hi_mci_ctrl_power(host, POWER_ON);__udelay(CONFIG_MMC_POWER_ON_TIMEROUT * 1000);/* card reset cancel */himci_writel(1<<host->port, host->base + MCI_RESET_N);__udelay(CONFIG_MMC_RESET_HIGH_TIMEROUT);/* set drv/smpl phase shift 时钟相位*/tmp_reg = himci_readl(host->base + MCI_UHS_REG_EXT);tmp_reg &= ~(DRV_PHASE_MASK | SMPL_PHASE_MASK);tmp_reg |= DRV_PHASE_SHIFT | SMPL_PHASE_SHIFT;himci_writel(tmp_reg, host->base + MCI_UHS_REG_EXT);/* clear MMC host intr  MCI_RINTSTS:原始中断状态寄存器*/himci_writel(ALL_INT_CLR, host->base + MCI_RINTSTS);/* MASK MMC host intr  MCI_INTMASK:中断屏蔽寄存器*/tmp_reg = himci_readl(host->base + MCI_INTMASK);tmp_reg &= ~ALL_INT_MASK;himci_writel(tmp_reg, host->base + MCI_INTMASK);/* enable inner DMA mode and close intr of MMC host controler */tmp_reg = himci_readl(host->base + MCI_CTRL);tmp_reg &= ~INTR_EN; //全局中断使能 1:=使能tmp_reg |= USE_INTERNAL_DMA;//使用内置DMA搬移数据himci_writel(tmp_reg, host->base + MCI_CTRL);/* enable dma intr */tmp_reg = himci_readl(host->base + MCI_IDINTEN);tmp_reg &= ~MCI_IDINTEN_MASK;tmp_reg = TI | RI | NI;//使能发送接收中断himci_writel(tmp_reg, host->base + MCI_IDINTEN);/* set timeout param [31-8]:卡数据传输超时时间[7-0]:回复超时时间*/himci_writel(DATA_TIMEOUT | RESPONSE_TIMEOUT, host->base + MCI_TIMEOUT);/* set FIFO param */himci_writel(BURST_SIZE | RX_WMARK | TX_WMARK, host->base + MCI_FIFOTH);
}

该函数实现了 (a)复位mmc主机控制器; (b)卡复位 (c)卡掉电后上电 (d)取消卡复位 (e)设置时钟相位 (f)清空mmc主机中断寄存器 (g)设置中断掩码 (h)使能dma模式且关闭mmc主机控制器中断使能;(i)使能dma中断 (j)设置超时参数 (k)设置fifo参数;

相关文章:

海思ubootsd卡协议

在start_armboot()函数中调用mmc_initialize(0)初始化mmc;最终调用到int hi_mci_initialize(unsigned int dev_num)函数;内容如下:static int hi_mci_initialize(unsigned int dev_num) {struct mmc *mmc NULL;static struct himci_host *host;unsigned int regval;unsigned l…...

nuxt3使用总结

目录 背景 安装 项目配置 路由 Tailwindcss引入 全局样式配置 css预处理器 安装 Tailwindcss 项目的配置 部署上线 seo优化 背景 新入职了一家公司&#xff0c;刚进入公司第一个需求就是先做一个公司的官网&#xff0c;需要使用vue写&#xff0c;作为祖师爷的粉丝…...

指向函数的指针详解,以及如何使用指向函数的指针变量做函数参数

指向函数的指针作为函数参数&#xff0c;是 C 语言实际应用中的一个比较深入的部分。 目录 一、什么是函数的指针 二、用函数指着变量调用函数 2.1举例说明 三、怎样定义和使用指向函数的指针变量 3.1定义指向函数的指针变量 3.2指向函数的指针变量详解 3.3通过指针变量…...

Spring——spring整合JUnit

JUnit定义: Junit测试是程序员测试&#xff0c;即所谓 白盒测试 &#xff0c;因为程序员知道被测试的软件如何&#xff08;How&#xff09;完成功能和完成什么样&#xff08;What&#xff09;的功能。 Junit是一套框架&#xff0c;继承TestCase类&#xff0c;就可以用Junit进行…...

保障信息安全:使用PyZbar库识别二维码图片可以快速获取二维码中的信息,保障信息安全。

目录 简介&#xff1a; 源代码&#xff1a; 源代码说明&#xff1a; 效果如下所示&#xff1a; 简介&#xff1a; 不用摄像头识别二维码可以应用在以下场景&#xff1a; 批量处理二维码图片&#xff1a;可以在服务器上使用PyZbar等库来批量处理二维码图片&#xff0c;例如读…...

从LeNet到ResNet:深入探索卷积神经网络

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️&#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…...

计算机组成原理_总线标准

计算机组成原理总目录总线标准 总线标准是系统与各模块、模块与模块之间的一个互连的标准&#xff0c;就像我们用汉语来相互交流一样。 1. 系统总线 ISA总线的扩展插槽&#xff0c;其颜色一般为黑色&#xff0c;比PCI接口插槽要长些&#xff0c;位于主板的最下端。 可插接显卡&…...

蓝桥杯C/C++VIP试题每日一练之芯片测试

💛作者主页:静Yu 🧡简介:CSDN全栈优质创作者、华为云享专家、阿里云社区博客专家,前端知识交流社区创建者 💛社区地址:前端知识交流社区 🧡博主的个人博客:静Yu的个人博客 🧡博主的个人笔记本:前端面试题 个人笔记本只记录前端领域的面试题目,项目总结,面试技…...

树莓派测试wifi与eth速率

测试网速方法&#xff1a; 1.安装插件&#xff1a; 首先在树莓派端安装iperf3 sudo apt install iperf3PC端也需要安装iperf3&#xff0c;单击下面网址即可 下载网址 压缩包解压到桌面&#xff0c;文件内容如下图所示&#xff1a; 2.开始测速服务&#xff1a; 树莓派端在…...

关系抽取方面的基础

关系抽取方面的基础一、基本概念1. 什么是关系抽取&#xff08;Relation Extraction&#xff0c;RE&#xff09;&#xff1f;2. 都有什么奇怪的关系&#xff1f;3. 任务评价指标二、 关系抽取方法2.1 按模型结构分——Pipeline 和 Joint方法Pipeline方法Joint方法2.2 按解码方式…...

蓝桥杯嵌入式(G4系列):定时器捕获

前言&#xff1a; 定时器的三大功能还剩下最后一个捕获&#xff0c;而这在蓝桥杯嵌入式开发板上也有555定时器可以作为信号发生器供定时器来测量。 原理图部分&#xff1a; 开发板上集成了两个555定时器&#xff0c;一个通过跳线帽跟PA15相连&#xff0c;最终接到了旋钮R40上&…...

多态的定义、重写、原理

多态 文章目录多态多态的定义和条件协变&#xff08;父类和子类的返回值类型不同&#xff09;函数隐藏和虚函数重写的比较析构函数的重写关键字final和override抽象类多态的原理单继承和多继承的虚函数表单继承下的虚函数表多继承下的虚函数表多态的定义和条件 定义&#xff1…...

Angular 配置api代理 proxy 实践

话不多说&#xff0c;直奔主题 $方式一 第一步&#xff0c;在根目录或/src 下新建一个 proxy.conf.json 文件 备注&#xff1a;这里不用纠结文件名称即xxx.xxx.json&#xff0c;只要使用时能找到&#xff0c;且正确配置文件内容格式即可 {"/dev-list": {"target…...

ES: 数据增,删,改,批量操作

1> 指定id 新增 _id 1 新增一条. 此命令重复执行,就是更新id1的数据 POST employee_zcy/_doc/1 {"uid" : "1234","phone":"12345678909","message" : "qq","msgcode" : "1","send…...

伯努利方程示例 Python 计算(汽水流体和喷泉工程)

伯努利原理 在流体的水平流动中&#xff0c;流体速度较高的点比流体速度较慢的点具有更小的压力。 不可压缩流体在到达狭窄的收缩部分时必须加速&#xff0c;以保持恒定的体积流量。 这就是为什么软管上的窄喷嘴会导致水流加速的原因。 但有些事情可能会困扰您这一现象。 如果…...

2022年中职网络安全竞赛——应用服务漏洞扫描与利用解析(详细)

应用服务漏洞扫描与利用 任务环境说明: 服务器场景:Server2115服务器场景操作系统:未知(关闭链接)使用命令nmap探测目标靶机的服务版本信息,将需要使用的参数作为FLAG进行提交;通过上述端口访问靶机系统并探测隐藏的页面,将找到的敏感文件、目录名作为FLAG(形式:[敏…...

yyds,Elasticsearch Template自动化管理新索引创建

文章目录一、什么是Elasticsearch Template&#xff1f;二、Elasticsearch Template的用法2.1、创建模板2.2、验证模板2.3、应用模板2.4、删除模板2.5、组合模板2.6、如何在同一个模板中定义多种匹配模式2.7、模板优先级2.8、提前模拟索引的最终映射三、Elasticsearch Template…...

蓝桥杯嵌入式ADC与DAC(都不需要中断)

目录 1.原理图 &#xff08;1&#xff09;ADC的原理图 &#xff08;2&#xff09;DAC的原理图 2.STM32CubeMX的配置 &#xff08;1&#xff09;ADC的配置 &#xff08;2&#xff09;DAC配置 3.代码部分 &#xff08;1&#xff09;ADC代码 &#xff08;2&#xff09;DA…...

网络视频的防盗与破解

网络视频(Web 视频)是指利用 HTML5 技术在浏览器中播放的视频,这类视频资源通常可以被随意下载,某些行业(比如教培行业)如果希望保护自己的视频资源不被下载,就需要对视频做防盗链处理。 防盗链需要着重加强两个方面的安全性:网络传输和客户端。 网络传输安全 网络传…...

FPGA 20个例程篇:20.USB2.0/RS232/LAN控制并行DAC输出任意频率正弦波、梯形波、三角波、方波(二)

通过上面的介绍相信大家对数字变频已经有了一个较为整体性的认识&#xff0c;下面笔者来对照XILINX的DDS IP核对数字变频技术展开更进一步的说明&#xff0c;做到了理论和实践很好地结合&#xff0c;这样大家再带入Modelsim进行仿真测试就不仅掌握了数字变频的理论知识&#xf…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

【生成模型】视频生成论文调研

工作清单 上游应用方向&#xff1a;控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...

「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案

在移动互联网营销竞争白热化的当下&#xff0c;推客小程序系统凭借其裂变传播、精准营销等特性&#xff0c;成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径&#xff0c;助力开发者打造具有市场竞争力的营销工具。​ 一、系统核心功能架构&…...

【HarmonyOS 5】鸿蒙中Stage模型与FA模型详解

一、前言 在HarmonyOS 5的应用开发模型中&#xff0c;featureAbility是旧版FA模型&#xff08;Feature Ability&#xff09;的用法&#xff0c;Stage模型已采用全新的应用架构&#xff0c;推荐使用组件化的上下文获取方式&#xff0c;而非依赖featureAbility。 FA大概是API7之…...

React父子组件通信:Props怎么用?如何从父组件向子组件传递数据?

系列回顾&#xff1a; 在上一篇《React核心概念&#xff1a;State是什么&#xff1f;》中&#xff0c;我们学习了如何使用useState让一个组件拥有自己的内部数据&#xff08;State&#xff09;&#xff0c;并通过一个计数器案例&#xff0c;实现了组件的自我更新。这很棒&#…...

SQL注入篇-sqlmap的配置和使用

在之前的皮卡丘靶场第五期SQL注入的内容中我们谈到了sqlmap&#xff0c;但是由于很多朋友看不了解命令行格式&#xff0c;所以是纯手动获取数据库信息的 接下来我们就用sqlmap来进行皮卡丘靶场的sql注入学习&#xff0c;链接&#xff1a;https://wwhc.lanzoue.com/ifJY32ybh6vc…...