Marvell交换芯片88E6321/88E6320驱动总结-寄存器篇

2023-05-16

由于我在项目中将该芯片作为PHY和SERDES使用,因此本文内容主要还是围绕PHY和SERDES的相关功能,至于其他功能则没有进行深入研究。


工作模式

在之前的硬件篇中有提到,该芯片有两种寻址模式:单芯片寻址和多芯片寻址。

  • 多芯片寻址
    对于多芯片寻址,需要给芯片设置一个非零的SMI地址(ADDR[4:0]的反码)。在多芯片寻址模式下,仅有两个寄存器(0x00:SMI Command Register 0x01:SMI Data Register)能够使用,内部各PORT的寄存器均由这两个寄存器间接访问。
    请输入图片描述

通过向SMI Command Register的[9:5]写入内部SMI设备地址,[4:0]写入内部SMI寄存器地址来访问各个Port的内部寄存器,[11:10]决定决前是写入还是读出操作。
请输入图片描述

通过向SMI Data Register的[15:0]位写入或读取SMI Command Register设定的寄存器内容。
请输入图片描述

  • 单芯片寻址
    对于单芯片寻址,其SMI地址为0x00(针对整个芯片),即ADDR[4:0]=0x1F。
    请输入图片描述

在单芯片寻址模式下,每个Port都有各自的SMI地址(针对内部每个Port),Port0-Port6对应的SMI地址分别为0x10-0x16(直接访问)。
若Port0、1、2、5、6接有外部PHY,则必须使用以下SMI地址,0x00对应Port0,0x01对应Port1,0x02对应Port2,0x05对应Port5,0x06对应Port6,这样PPU才能自动的轮询各个PHY获取各自的连接状况,速度,双工情况,流控状态等信息,这些外部PHY需要使用Global2 offset 0x18、0x19进行访问。对于Port3、Port4的内部PHY地址映射为0x03、0x04;Port0、Port1的内部SERDES映射为0x0C、0x0D,同样的,也是需要使用Global2 offset 0x18、0x19进行访问。

Global2 寄存器的 Offset24,25 寄存器

前文提到,两个非常重要的寄存器,即Global2 offset 0x18、0x19寄存器,在单芯片寻址模式下PHY和SERDES寄存器的访问都必须通过这两个寄存器间接访问。

  • Global2 offset 0x18 (SMI PHY Command Register)寄存器
    请输入图片描述

与多芯片存储能够访问的Command Register寄存器一样,[9:5]写入SMI设备地址,[4:0]写入SMI寄存器地址来访问各个Port的内部寄存器,[11:10]决定当前是写入还是读出操作。

  • Global2 offset 0x19 (SMI PHY Data Register)寄存器
    请输入图片描述

与SMI Data Register相同,通过[15:0]位写入或读取SMI Command Register设定的寄存器内容。

  • PHY读写函数(伪代码)
    对于单纯的PHY器件,如LAN8720A,我们对于PHY寄存器的访问(按照Clauses 22)直接通过SMI接口设置phy地址,和内部寄存器地址就可以访问了。
Preamble(32bits)Start(2bits)OP Code(2bits)PHYAD(5bits)REGAD(5bits)Turn Around(2bits)Data(16bits)Idle
Read1…10110A4A3A2A1A0R4R3R2R1R0Z0D15…D0Z*
Write1…10101A4A3A2A1A0R4R3R2R1R0Z0D15…D0Z*

而这里,对于88E6321的访问就不那么直接了,下面通过伪代码形式讲述如何正确读写内部PHY寄存器:
首先必须实现最直接的SMI读写函数,不同的平台实现方式可能不同,在STM32的HAL库下,提供了

HAL_StatusTypeDef HAL_ETH_WritePHYRegister(ETH_HandleTypeDef *heth, uint16_t PHYReg, uint32_t RegValue)
HAL_StatusTypeDef HAL_ETH_ReadPHYRegister(ETH_HandleTypeDef *heth, uint16_t PHYReg, uint32_t RegValue)

但是这个函数的PhyAddress是由heth带入的,而我们要频繁在各个Port与Global寄存器间切换,因此改写该库函数,PhyAddress主动传入。

HAL_StatusTypeDef HAL_ETH_WritePHYRegister_New(ETH_HandleTypeDef *heth, uint16_t DevAddr, uint16_t PHYReg, uint32_t *RegValue)
HAL_StatusTypeDef HAL_ETH_ReadPHYRegister_New(ETH_HandleTypeDef *heth, uint16_t DevAddr, uint16_t PHYReg, uint32_t *RegValue)
//具体实现就是把原来heth传入的地址替换为DevAddr

有了最基础读写的函数,我们来构建内部PHY读写函数:

/*!
 * \fn write_smi_phy_reg
 * \brief PHY寄存器设置
 *          
 * \param [in] ETH_HandleTypeDef *heth STM32以太网结构体定义
 * \param [in] uint16_t dev_addr PHY地址,单芯片寻址模式下为0x03或0x04
 * \param [in] uint16_t reg_addr 寄存器地址
 * \param [in] uint32_t reg_value 写入值
 * 
 * \retval error_code_t  
 */
error_code_t write_smi_phy_reg(ETH_HandleTypeDef *heth, uint16_t dev_addr, uint16_t reg_addr, uint32_t reg_value)
{
    volatile uint16_t time_out;
    uint32_t smi_reg;
    time_out = 100;

    /*!
     *  检测当前PHY是否Busy
     */
    do {
        if (HAL_ETH_ReadPHYRegister_New(heth, GLOBAL2_DEV_ADDR(0x1C), SMI_PHY_CMD_REG(0x18), &smi_reg) != ok) {
            ERROR_MSG("Read SMI_PHY_CMD_REG register failed");
            return error;
        }
        if (time_out-- < 1) {
            ERROR_MSG("Read SMI_PHY_CMD_REG register timed out");
            return error;
        }
    } while (smi_reg & SMI_BUSY(0x8000));

    /*!
     *  先将需要写入的数据写入SMI_PHY_DATA_REG,待后续写命令时完成传输
     */
    if (HAL_ETH_WritePHYRegister_New(heth, GLOBAL2_DEV_ADDR, SMI_PHY_DATA_REG, reg_value) != ok) {
        return error;
    }

    smi_reg = SMI_BUSY | (dev_addr << 5) | (SMI_WRITE(0x01) << 10) | (reg_addr << 0) | (SMI_CLAUSE22 << 12);//!< 设置需要写入的命令(写命令、smi地址、phy寄存器地址、条款) By: Ouqichen 2019年2月11日
    
    /*!
     *  写入命令
     */
    if (HAL_ETH_WritePHYRegister_New(heth, GLOBAL2_DEV_ADDR, SMI_PHY_CMD_REG, smi_reg) != ok) {
        ERROR_MSG("Write PHY_QD_REG_SMI_PHY_CMD Register Failed");
        return error;
    }

    return ok;
}

/*!
 * \fn read_smi_phy_reg
 * \brief PHY寄存器读取
 *          
 * \param [in] ETH_HandleTypeDef *heth STM32以太网结构体定义
 * \param [in] uint16_t dev_addr PHY地址,单芯片寻址模式下为0x03或0x04
 * \param [in] uint16_t reg_addr 寄存器地址
 * \param [out] uint32_t *reg_value 读出值
 * 
 * \retval error_code_t 
 */
error_code_t read_smi_phy_reg(ETH_HandleTypeDef *heth, uint16_t dev_addr, uint16_t reg_addr, uint32_t reg_value)
{
    volatile uint16_t time_out;
    uint32_t smi_reg;

    time_out =100;
    /*!
     *  检测当前PHY是否Busy
     */
    do {
        if (HAL_ETH_ReadPHYRegister_New(heth, GLOBAL2_DEV_ADDR(0x1C), SMI_PHY_CMD_REG(0x18), &smi_reg) != ok) {
            ERROR_MSG("Read SMI_PHY_CMD_REG register failed");
            return error;
        }
        if (time_out-- < 1) {
            ERROR_MSG("Read SMI_PHY_CMD_REG register timed out");
            return error;
        }
    } while (smi_reg & SMI_BUSY(0x8000));

    smi_reg = SMI_BUSY | (dev_addr << 5) | (SMI_READ_22(0x02) << 10) | (reg_addr << 0) | (SMI_CLAUSE22 << 12);//!< 设置需要写入的命令(读命令、smi地址、phy寄存器地址、条款) By: Ouqichen 2019年2月11日

    /*!
     *  写入命令
     */
    if (HAL_ETH_WritePHYRegister_New(heth, GLOBAL2_DEV_ADDR, SMI_PHY_CMD_REG, smi_reg) != ok) {
        ERROR_MSG("Write PHY_QD_REG_SMI_PHY_CMD Register Failed");
        return error;
    }

    time_out =100;
    /*!
     *  检测当前PHY是否Busy
     */
    do {
        if (HAL_ETH_ReadPHYRegister_New(heth, GLOBAL2_DEV_ADDR(0x1C), SMI_PHY_CMD_REG(0x18), &smi_reg) != ok) {
            ERROR_MSG("Read SMI_PHY_CMD_REG register failed");
            return error;
        }
        if (time_out-- < 1) {
            ERROR_MSG("Read SMI_PHY_CMD_REG register timed out");
            return error;
        }
    } while (smi_reg & SMI_BUSY(0x8000));

    /*!
     *  待总线不忙碌时读取数据
     */
    if (HAL_ETH_WritePHYRegister_New(heth, GLOBAL2_DEV_ADDR, SMI_PHY_DATA_REG, reg_value) != ok) {
        return error;
    }

    *reg_value = smi_reg;

    return ok; 
}

从以上伪代码可以看出:写入PHY时,先写入数据,在写入命令。读取PHY时,先写入命令,等待数据准备完成,再读取数据

PHY寄存器

实现了PHY的读写函数后,再来看看有那些寄存器可以访问。
IEEE中只为PHY定义了32个寄存器地址,为了拓展寄存器地址,这里采用的页机制,其中寄存器22的[7:0]用于切换页。
请输入图片描述

这里介绍几个主要的寄存器:

  • Page 0, Register 0 Copper Control Register
    寄存器0是PHY控制寄存器,通过Control Register可以对PHY的主要工作状态进行设置,具体内容可以查询datasheet,下面介绍主要的功能:
    bit15 Copper Reset: 软复位功能,对其写“1”触发软复位,并在复位结束后自动清为“0”,在某些操作(如修改自协商模式)后需要软复位才能使其生效。
    bit14 Loopback: lookback测试功能,用于开发调试,写一使能该功能。
    bit12 Auto-Negotiation Enable: 自动协商使能位,软件复位后生效,具体的Auto-Negotiation选项设置,在Copper Auto-Negotiation Advertisement Register (Page 0, Register 4)配置。

  • Page 0, Register 1 Copper Status Register
    寄存器1是PHY状态寄存器,主要包含PHY的状态信息,如速率、双工情况、自协商是否完成、自协商能力等。
    bit5 Copper Auto-Negotiation Complete: 自动协商完成位,此时PHY的其他寄存器才是可靠的。
    bit2 Copper Link Status: Link状态指示位Link状态指示位,PHY Polling通过轮询该位来确定Link状态,该位只在Auto-Negotiation Complete完成后才可靠。
    FBI WARINIG下,这里的链路状态每次读取会得到上一次的链路状态,也就是这里的链路状态是滞后的,因此,想要获得最新状态,建议连续读取两次,或者直接读取寄存器17的bit10,获取实时状态。)

  • Page 0, Register 4 Copper Auto-Negotiation Advertisement Register
    寄存器4是指示自动协商所支持的能力的寄存器,在AN enable的情况下,该端口会使用快速连接脉冲(Fast Link Pulse FLP)与对端交互端口自协商能力,协商完成后,会选择双方均支持的能力建立连接。
    bit9-bit5 分别指示能够支持的能力。

  • Page 0, Register 5 Copper Link Partner Ability Register
    寄存器5用于指示自动协商后,对端的所支持的自协商能力,该寄存器在调试时非常有用,能够表明,链路上是否有数据交互。

  • Page 0, Register 9 1000BASE-T Control Register
    寄存器9用于设置1000BASE-T的主从配置与自协商能力。需要注意的是,1000BASE-X的自协商除了双工和流控信息之外,并不能协商速率信息,也就是说端口只能工作在1000M模式下。

  • Page 0, Register 10 1000BASE-T Status Register
    寄存器10主要用于保存自协商完成后的对端所支持的自协商能力。

  • Page 0, Register 16 Copper Specific Control Register 1
    寄存器16主要是寄存器0的拓展。
    bit10 强制设置网络已经连接功能 在我们进行lookback测试,而网线又不能接入时,可以强制使寄存器link up,而方便测试进行。
    bit6:5 MDI交差模式,一般来说设置为11b,PHY根据FLP信号自动切换为MDI或者MDIX,因此该功能需要自协商功能的支持。

  • Page 0, Register 17 Copper Specific Status Register 1
    寄存器17是主要是寄存器1的拓展,在这个寄存器中,我们可以获取到当前的连接状态,当前MDI Crossover的模式等。

  • Page 0, Register 18 Copper Specific Interrupt Enable Register
    寄存器18,顾名思义,就是中断使能寄存器。初始化时配置了相关中断使能后,一旦中断发生,INT0引脚则会拉低,此时MCU通过读取Register 19,则可以确定发生了什么中断。

  • Page 0, Register 19 Copper Interrupt Status Register
    寄存器19为中断状态寄存器,读取该寄存器将清除中断。

  • Page ANY, Register 22 Page Address
    bit7:0 页选择寄存器 用于在各个寄存器中进行页切换。

了解了以上主要寄存器,下面来实现具备页切换的PHY读写函数:

/*!
 * \fn read_smi_page_phy_reg
 * \brief 带页切换的PHY寄存器读取
 *          
 * \param [in] ETH_HandleTypeDef *heth STM32以太网结构体定义
 * \param [in] uint16_t port_num 端口号
 * \param [in] uint8_t page_num 页号码
 * \param [in] uint16_t reg_addr 寄存器地址
 * \param [out] uint32_t *reg_value 读出值
 * 
 * \retval error_code_t 
 */
error_code_t read_smi_page_phy_reg(ETH_HandleTypeDef *heth, uint8_t port_num, uint8_t page_num, uint16_t reg_addr, uint32_t *reg_value)
{
    error_code_t ret_value;
    ret_value = write_smi_phy_reg(heth, (uint16_t)port_num, SMI_PHY_PAGE_ANY_REG(0x16), (uint32_t)page_num);

    if (ret_value != ok)
        return ret_value;

    ret_value = read_smi_phy_reg(heth, (uint16_t)port_num, reg_addr, reg_value);
    return ret_value;
}

/*!
 * \fn write_smi_phy_reg
 * \brief PHY寄存器设置
 *          
 * \param [in] ETH_HandleTypeDef *heth STM32以太网结构体定义
 * \param [in] uint16_t port_num 端口号
 * \param [in] uint8_t page_num 页号码
 * \param [in] uint16_t reg_addr 寄存器地址
 * \param [in] uint32_t reg_value 写入值
 * 
 * \retval error_code_t  
 */
error_code_t read_smi_page_phy_reg(ETH_HandleTypeDef *heth, uint8_t port_num, uint8_t page_num, uint16_t reg_addr, uint32_t reg_value)
{

    error_code_t ret_value;
    ret_value = write_smi_phy_reg(heth, (uint16_t)port_num,SMI_PHY_PAGE_ANY_REG(0x16), (uint32_t)page_num);

    if (ret_value != ok)
        return ret_value;

    ret_value = write_smi_phy_reg(heth, (uint16_t)port_num, reg_addr, reg_value);
    return ret_value;
}

中断相关寄存器

88E632x包含了一个中断控制器,将各种中断统一合并到一个引脚INTn上。全局寄存器1 offset 0x04中包含了各种中断源的总开关,为了能够使用设备相关中断,我们需要将bit7 DevIntEn置为1 。
请输入图片描述

接着,还需要设置中断掩码(Global2 Offset1),确保PHY相关中断使能。
请输入图片描述

最后还需要设置PHY寄存器(0x12),使能具体使用哪些中断。
请输入图片描述

完成以上操作后,一旦相关中断发生,这会拉低88E632x的INTn引脚,MCU则可以通过下降沿触发中断,对芯片具体发生什么中断进行判断与处理。
需要注意的是,在中断发生后,如果没有对该中断进行处理,则该INTn引脚会一直处于低电平,这样就无法再次捕获相关中断了,因此,中断发生后应及时清除中断,清除中断需要读取2个寄存器,Global1 Offset 0 Switch Global Status Register 寄存器和PHY 19 Copper Interrupt Status Register寄存器。

SERDES寄存器

SERDES寄存器的配置与PHY基本相同,这里不再赘述,不过需要注意的是,光纤相关的自协商只能协商双工和流控等信息,而速率则是固定的,因此协商前需要确定通信速率。
在switch芯片的Px_SMODE可以决定是千兆还是百兆光纤。
请输入图片描述
通过读取 Fiber Specific Control Register 1的bit1:0可以知道其当前工作模式。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Marvell交换芯片88E6321/88E6320驱动总结-寄存器篇 的相关文章

  • I2C设备注册的4种方法

    文章目录 前言一 静态注册二 动态注册三 用户空间注册四 i2c驱动扫描注册 前言 I2C设备的4种添加方法 xff1a 1 xff09 静态注册 2 xff09 动态注册 3 xff09 用户空间注册 4 xff09 i2c驱动扫描注册
  • pm_wakeup.h

    pm wakeup h Power management wakeup interface Copyright C 2008 Alan Stern Copyright C 2010 Rafael J Wysocki Novell Inc T
  • GTK+ Reference Manual

    GTK 43 Reference Manual for GTK 43 2 6 2 Table of Contents I GTK 43 Overview Compiling the GTK 43 libraries How to compi
  • Linux获取进程列表

    实现思路是 xff1a 遍历 proc目录下的所有进程描述文件夹 xff0c 从而获取进程列表 代码如下 xff1a include lt stdio h gt include lt dirent h gt include lt unist
  • ubuntu18.04 下firefox 不能 播放视频,因为默认未安装FLASH插件。(当然只是原因之一)

    ubuntu18 04 下firefox 不能 播放视频 xff0c 默认未安装FLASH插件 终端输入 xff1a sudo apt get install flashplugin nonfree
  • Ubuntu上可使用的15个桌面环境

    Ubuntu上可使用的15个桌面环境 发布者 红黑魂 来自 Ubuntu之家 摘要 Linux下桌面环境很多 xff0c Ubuntu之家给大家总结了比较常用的15个桌面环境 xff0c 并附上Ubuntu 12 10 xff08 Linu
  • C语言数据类型

    数据类型在数据结构中的定义是一个值的集合以及定义在这个值集上的一组操作 数据类型包括原始类型 多元组 记录单元 代数数据类型 抽象数据类型 参考类型以及函数类型 本文主要以51单片机中的数据类型为中心而展开的话题 在keil C51或者ia
  • 《Cortex-M0权威指南》之Cortex-M0技术综述

    Cortex M0权威指南 之Cortex M0技术综述 转载请注明来源 xff1a cuixiaolei的技术博客 Cortex M0 处理器简介 1 Cortex M0 处理器基于冯诺依曼架构 xff08 单总线接口 xff09 xff
  • xos详解5:PendSV_Handler

    PendSV Handler PendSV Handler LDR R2 61 OSTcbCurr 不必关中断 嵌套中断发生时会自动保存 R0 R3 到 MSP 并恢复 LDR R0 R2 如果发生咬尾的多个 PendSV xff0c 上半
  • M0最高优先级的中断设计

    1 Reset 3 Highest Reset 绝大部分处理器设计时 xff0c 将复位中断放在最高优先级 一般来说这样设计是合理的 xff0c 个人认为在某些应用场景这样处理仍有局限性 2 NMI 2 Nonmaskable interr
  • 如何从零开始写一个操作系统?

    首页发现等你来答 登录加入知乎 如何从零开始写一个简单的操作系统 xff1f 关注问题 写回答 操作系统 编程学习 如何从零开始写一个简单的操作系统 xff1f 看了这个 xff1a 从零开始写一个简单的操作系统 求指教 关注者 4 787
  • 每次听到同事跳槽后的薪资,我就像打了鸡血一样

    本文总结了现阶段 34 大龄程序员 34 的职业生存状况 xff0c 内容包含职位需求量 xff0c 议价能力如何以及如何度过传说中的 34 中年危机 34 等等 xff0c 供大家参考 xff01 值此金 三 银四跳槽季 的开端 xff0
  • Lua性能优化—Lua内存优化

    原文链接https blog uwa4d com archives usparkle luaperformance html 这是侑虎科技第236篇原创文章 xff0c 感谢作者舒航供稿 xff0c 欢迎转发分享 xff0c 未经作者授权请
  • Jetson Xavier NX(emmc)烧录系统时可能遇到的问题(避坑)

    目录 Ununtu18虚拟机无法联网 当NX接上电源后 xff0c 指示灯没有亮 xff08 不工作 xff09 在登陆SDK时 xff0c 可能会出现卡在初始界面的情况 在烧录镜像时 xff0c 可能会卡在该处没有变化 Ununtu18虚
  • 互斥量、条件变量与pthread_cond_wait()函数的使用,详解(一)

    1 首先pthread cond wait 的定义是这样的 The pthread cond wait and pthread cond timedwait functions are used to block on a conditio
  • STAR法则写简历

    STAR 法则是在面试 xff0c 求职 xff0c 写简历时候的常用利器 虽然常用 xff0c 但是我想知道的人一定很少很少 xff0c 不然为什么那么多人面试的时候犯那么低级的错误呢 xff1f STAR法则无法帮你提高你的实力 xff
  • 论文发表为什么不可以一稿多投呢

    论文发表为什么不可以一稿多投呢 很多作者在担心投一家杂志会被拒稿 xff0c 就会选择一篇稿件投多家期刊的方法 xff0c 大家应该或多或少都听过不能一稿多投 xff0c 但具体原因是什么大家知道吗 一稿多投会有什么后果 一稿多投是自稿件发
  • ROS下视频消息发布与订阅

    https download csdn net download v7xyy 10869743 下下来后 1 发布视频消息 rosrun video transport tutorial video publisher xff08 节点 c
  • ros中标志位设计(4)

    由于需要涉及控制权的交接事件 xff0c 需要通过标志位的方式进行设计 首先需要自定一个标志位的信息在ros中用于标志位信息的发布 下面是用于标志位的头文件Flag h Generated by gencpp from file xx ms
  • 全球最贵域名Sex.com将再度出售

    金融时报消息称 xff0c Sex com域名曾位居全球最贵域名前例 xff0c 四年前 xff0c 它以1400万美元成交 xff0c 不过 xff0c 买下此域名的公司面临破产 xff0c 因此Sex com将再度拿来出售 Sex co

随机推荐

  • 微信消息推送消息加解密(golang)

    本篇介绍如何使用golang对微信消息推送进行加解密 xff0c 后续会补充 xff0c 目前先写个原理 xff0c 大概自己看一下 xff0c 其他的自己应该也能写 老套路 xff0c 分为三步 xff0c 为啥写 xff0c 教程 xf
  • C++数据可视化MathGL使用简示

    C 43 43 数据可视化 MathGL 使用指南 效果演示 搭建环境与依赖项 Windows10 64位 VS2017 Zlib1 2 11 xff08 已编译好的可用版本已集成在我后面的项目链接里 xff09 libpng1 6 37
  • 飞思卡尔智能车——舵机及PID控制

    本篇博客已迁移至 xff1a 飞思卡尔智能车 舵机及PID控制 请帮个忙 xff0c 去新地址访问 xff1a xff09 舵机 xff1a 小车转向的控制 机构 也就是控制小车的转向 它的特点是结构紧凑 易安装调试 控制简单 大扭力 成本
  • Github Actions + Docker实现HTML静态前端页面CICD部署

    使用 Github Actions 可以实现 CICD 自动构建部署 简单来说就是你只需要执行 git push 命令 xff0c 你服务器上的网页就可以自动部署更新 xff0c 无需你执行编译指令 前置环境 服务器一台 xff0c 我的是
  • Ubuntu显示“submodule(s) are missing“或“子模块未对路径注册“解决方案

    最近测试openMVG的三维重建效果 xff0c 于是在github下克隆openMVG的库 xff0c git clone过程成功进行 xff0c 但是在build文件夹下cmake的时候error occured 错误显示 34 sub
  • 互斥量、条件变量与pthread_cond_wait()函数的使用,详解(二)

    1 Linux 线程 进程与线程之间是有区别的 xff0c 不过Linux内核只提供了轻量进程的支持 xff0c 未实现线程模型 Linux是一种 多进程单线程 的操作系统 Linux本身只有进程的概念 xff0c 而其所谓的 线程 本质上
  • 网易视频云:流媒体服务器原理和架构解析

    网易视频云 是网易公司旗下的视频云服务产品 xff0c 以Paas服务模式 xff0c 向开发者提供音视频编解码SDK和开放API xff0c 助力APP接入音视频功能 今天 xff0c 网易视频云的技术专家给大家分享一篇流媒体技术性文章
  • MATLAB语言中int函数

    在MATLAB语言中 xff0c 求符号函数的定积分是使用int函数 xff0c 其调用格式如下 xff1a int F x a b a表示定积分的下限 xff1b b表示定积分的上限 xff1b 上式表示 xff0c 被积函数F在区间 a
  • matlab中的subs函数用法

    matlab中subs 是符号计算函数 xff0c 表示将符号表达式中的某些符号变量替换为指定的新的变量 xff0c 常用调用方式为 xff1a subs S OLD NEW 表示将符号表达式S中的符号变量OLD替换为新的值NEW 下面具体
  • Android配置临时ipv6地址

    Google公网DNS 2001 4860 4860 64642001 4860 4860 64 ifconfig wlan0 inet6 add IPV6ADDR ifconfig wlan0 inet6 add 2001 4860 48
  • MFC:pic控件的矩形的left、right、top、bottom 坐标位置

    CRect rect 然后 获取矩形控件 那么这个矩形控件的左上 和右下 分别对应 xff0c left xff0c top xff1b right xff0c bottom left xff0c top为左上角的点坐标 right xff
  • ubuntu下对sd卡 分区和格式化 挂载sd卡

    一 sd卡分区和格式化 1 查看自己的设备号 命令 xff1a mount 可以看到 最后一行即为sd卡的挂载目录 2 umount 由于sd卡插上之后会自动mount xff0c 所以需要unmout 命令 xff1a umount 路径
  • linux c 线程间同步(通信)的几种方法--互斥锁,条件变量,信号量,读写锁

    Linux下提供了多种方式来处理线程同步 xff0c 最常用的是互斥锁 条件变量 信号量和读写锁 下面是思维导图 xff1a 一 互斥锁 xff08 mutex xff09 锁机制是同一时刻只允许一个线程执行一个关键部分的代码 1 初始化锁
  • IMX头部详细解析之一 头部组成

    镜像组成 完整的imx镜像由以下四部分组成 xff1a Image Vector Table xff08 映像向量表 xff09 Boot Data xff08 启动数据 xff09 Device Configuration Data xf
  • IMX头部详细解析之二 头部生成工具

    前言 在之前的文章中 xff0c 介绍了imx的头部组成部分 xff0c 本文将介绍u boot如何通过mkimage工具构建imx的头部 正文 在imx6平台上进行裸机程序开发时 xff0c 通常需要添加imx头部信息 xff0c 才能使
  • Linux命令查询工具 O-LinuxCmd

    Linux命令查询工具 O linuxCmd 前言 一直以来 xff0c 遇到不熟悉的Linux命令都会直接百度 xff0c 找到一些命令查询网站再进行查询 xff0c 比如这个man linuxde net网站就很不错 虽然加入收藏夹就能
  • 嵌入式Linux利用ppp实现4G模块联网

    之前做项目时需要用到SIM7100模块 xff0c 便快速了解下ppp拨号 xff0c 实现了功能 xff0c 但是功能虽然实现了 xff0c 却依然有许多疑问 xff0c 这段时间有点时间 xff0c 打算更加详细的研究下 编译ppp2
  • O-ComTool V2.0.0串口调试工具

    O ComTool V2 1 0更新 xff0c 点击访问 O ComTool V2 0 0 简介 本次更新带来了 船新 的串口助手 xff0c 相较于V1 0 0版本 xff0c 代码重构 xff0c 添加了更多实用功能 xff0c 如
  • Marvell交换芯片88E6321/88E6320驱动总结-硬件篇

    芯片特性 Marvell 88E6321 88E6320 是一个7 Port千兆以太网交换芯片 支持最新的IEEEE802 1 Audio Video Bridging标准 芯片包含两个10 100 1000三速以太网收发器 xff08 P
  • Marvell交换芯片88E6321/88E6320驱动总结-寄存器篇

    由于我在项目中将该芯片作为PHY和SERDES使用 xff0c 因此本文内容主要还是围绕PHY和SERDES的相关功能 xff0c 至于其他功能则没有进行深入研究 工作模式 在之前的硬件篇中有提到 xff0c 该芯片有两种寻址模式 xff1