嵌入式PowerPC上的扁平设备树FDT

VXWORKS 7.0 基于设备树驱动程序编写方法 VXBUS 设备树 阅读详情

嵌入式 PowerPC Linux 平台扁平设备树FDT解析

摘 要:设备树的引入减少了内核为支持新硬件而需要的改变,提高代码重用,加速了Linux支持包的开发,使得单个内核镜像能支持多个系统。作为U-Boot 和Linux内核之间的动态接口,本文阐述了设备树的数据存储格式以及源码描述语法,进而分析了U-Boot对扁平设备树的支持设置,Linux内核对设 备树的解析流程。

关键词:扁平设备树  DTS  PowerPC  Linux

1 引言
 IBM、Sun等厂家的服务器最初都采用了Firmware(一种嵌入到硬件设备中的程序,用于提供软件和硬件之间的接口),用 于初始化系统配置,提供操作系统软件和硬件之间的接口,启动和运行系统。后来为了标准化和兼容性,IBM、Sun等联合推出了固件接口IEEE 1275标准,让他们的服务器如IBM PowerPC pSeries,Apple PowerPC,Sun SPARC等均采用Open Firmware,在运行时构建系统硬件的设备树信息传递给内核,进行系统的启动运行[1]。这样做的好处有,减少内核对系统硬件的严重依赖,利于加速支 持包的开发,降低硬件带来的变化需求和成本,降低对内核设计和编译的要求。

 随着Linux/ppc64内核的发展,内核代码从原来的arch/ppc32和arch/ppc64逐渐迁移到统一的arch/powerpc 目录,并在内核代码引入Open Firmware API以使用标准固件接口[2]。Linux内核在运行时,需要知道硬件的一些相关信息。对于使用ARCH=powerpc参数编译的内核镜像,这个信息 需要基于Open Firmware规范,以设备树的形式存在[3]。这样内核在启动时读取扫描Open Firmware提供的设备树,从而获得平台的硬件设备信息,搜索匹配的设备驱动程序并将该驱动程序绑定到设备。

 在嵌入式PowerPC中,一般使用U-Boot之类的系统引导代码,而不采用Open Firmware。早期的U-Boot使用include/asm-ppc/u-boot.h中的静态数据结构struct bd_t将板子基本信息传递给内核,其余的由内核处理。这样的接口不够灵活,硬件发生变化就需要重新定制编译烧写引导代码和内核,而且也不再适应于现在的 内核。为了适应内核的发展及嵌入式PowerPC平台的千变万化,吸收标准Open Firmware的优点,U-Boot引入了扁平设备树FDT这样的动态接口,使用一个单独的FDT blob(二进制大对象,是一个可以存储二进制文件的容器)存储传递给内核的参数[3]。一些确定信息,例如cache大小、中断路由等直接由设备树提 供,而其他的信息,例如eTSEC的MAC地址、频率、PCI总线数目等由U-Boot在运行时修改。U-Boot使用扁平设备树取代了bd_t,而且也 不再保证对bd_t的后向兼容。

2 设备树的存储格式
 简单的说,设备树是一种描述硬件配置的树形数据结构,有且仅有一个根节点[4]。它包含了有关CPU、物理内存、总 线、串口、PHY以及其他外围设备信息等。该树继承了Open Firmware IEEE 1275设备树的定义。操作系统能够在启动时对此结构进行语法分析,以此配置内核,加载相应的驱动。
 U-Boot需要将扁平设备树在内存地址传给内核。该树主要由三大部分组成:头(Header)、结构块(Structure block)、字符串块(Strings block)。在内存中分配图如下:

2.1 头(header)
 头主要描述设备树的基本信息,如设备树魔数标志、设备树块大小、结构块的偏移地址等,其具体结构boot_param_header如下。这个结构中的值都是以大端模式表示,并且偏移地址是相对于设备树头的起始地址计算的。
struct boot_param_header {
        u32     magic;                  /* magic word OF_DT_HEADER */
        u32     totalsize;              /* total size of DT block */
        u32     off_dt_struct;          /* offset to structure */
        u32     off_dt_strings;         /* offset to strings */
        u32     off_mem_rsvmap;         /* offset to memory reserve map */
        u32     version;                /* format version */
        u32     last_comp_version;      /* last compatible version */

        /* version 2 fields below */
        u32     boot_cpuid_phys;        /* Which physical CPU id we're
                                           booting on */
        /* version 3 fields below */
        u32     size_dt_strings;        /* size of the strings block */

        /* version 17 fields below */
        u32 size_dt_struct;  /* size of the DT structure block */
};
2.2 结构块(structure block)
 扁 平设备树结构块是线性化的树形结构,和字符串块一起组成了设备树的主体,以节点形式保存目标板的设备信息。在结构块中,节点起始标志为32位常值宏 OF_DT_BEGIN_NODE,节点结束标志为宏OF_DT_END_NODE;子节点定义在节点结束标志前。一个节点的基本结构如下所示:
 1. 节点起始标志OF_DT_BEGIN_NODE(即0x0000_0001);
 2. 节点路径或者节点单元名(version < 3以及节点路径表示,version > 16时以节点单元名表示);
 3. 填充字节保证四字节对齐;
 4. 节点属性。每个属性以常值宏OF_DT_PROP 开始,后面依次为属性值的字节长度、属性名在在字符串块中的偏移值、属性值及字节对齐填充段;
 5. 如果存在子节点,则定义子节点。
 6. 节点结束标志OF_DT_END_NODE(即0x0000_0002)。
 归纳起来,一个节点可以概括为以OF_DT_BEGIN_NODE开始,节点路径、属性列表、子节点列表以及OF_DT_END_NODE结束的序列,每一个子节点自身也是类似的结构。
2.3 字符串块(Strings block)
 为 了节省空间,对于那些属性名,尤其是很多属性名是重复冗余出现的,提取出来单独存放到字符串块。这个块中包含了很多有结束标志的属性名字符串。在设备树的 结构块中存储了这些字符串的偏移地址,因为可以很容易的查找到属性名字符串。字符串块的引入节省嵌入式系统较为紧张的存储空间。

3 设备树源码DTS表示
 设备树源码文件(.dts)以可读可编辑的文本形式描述系统硬件配置设备树,支持C/C++方式的注释,该结构 有一个唯一的根节点“/”,每个节点都有自己的名字并可以包含多个子节点。设备树的数据格式遵循了Open Firmware IEEE standard 1275。本文只简述设备树的数据布局及语法,Linux板级支持包开发者应该详细参考IEEE 1275标准[5]及其他文献[2] [4]。
 为了说明,首先给出基于PowerPC MPC8349E处理器的最小系统的设备树源码示例。可以看到,这个设备树中有很多节点,每个节点都指定了节点单元名称。每一个属性后面都给出相应的值。 以双引号引出的内容为ASCII字符串,以尖括号给出的是32位的16进制值。这个树结构是启动Linux内核所需节点和属性简化后的集合,包括了根节点 的基本模式信息、CPU和物理内存布局,它还包括通过/chosen节点传递给内核的命令行参数信息。

/ {
    model = "MPC8349EMITX";
    compatible = "MPC8349EMITX", "MPC834xMITX", "MPC83xxMITX";
    #address-cells = <1>;        /* 32bit address */
    #size-cells = <1>;        /* 4GB size */

    cpus {
        #address-cells = <1>;
        #size-cells = <0>;

        PowerPC,8349@0 {
            device_type = "cpu";
            reg = <0>;
            d-cache-line-size = <20>;        /* 32 Bytes */
            i-cache-line-size = <20>;
            d-cache-size = <8000>;        /* L1 dcache, 32K */
            i-cache-size = <8000>;
            timebase-frequency = <0>;    /* From bootloader */
            bus-frequency = <0>;
            clock-frequency = <0>;
        };
    };

    memory {
        device_type = "memory";
        reg = <00000000 10000000>;        /* 256MB */
    };

    chosen {                     /* add by starby  */
        name = "chosen";
        bootargs = "root=/dev/ram rw console=ttyS0,115200";
        linux,stdout-path = "/soc8349@e0000000/serial@4500 ";
    };
};


3.1 根节点
 设备树的起始点称之为根节点"/"。属性model指明了目标板平台或模块的名称,属性compatible值指明和目标板为同一系列的兼容的开发板名称。对于大多数32位平台,属性#address-cells和#size-cells的值一般为1。
3.2 CPU节点
 /cpus 节点是根节点的子节点,对于系统中的每一个CPU,都有相应的节点。/cpus节点没有必须指明的属性,但指明#address-cells = <1>和 #size-cells = <0>是个好习惯,这同时指明了每个CPU节点的reg属性格式,方便为物理CPU编号。
 此节点应包含板上每个CPU的属性。CPU名称一般写作PowerPC,<name>,例如Freescale会使用PowerPC,8349来描述本文的MPC8349E处理器。CPU节点的单元名应该是cpu@0 的格式,此节点一般要指定device_type(固定为"cpu"),一级数据/指令缓存的表项大小,一级数据/指令缓存的大小,核心、总线时钟频率等。在上面的示例中通过系统引导代码动态填写时钟频率相关项。

3.3 系统内存节点
 此节点用于描述目标板上物理内存范围,一般称作/memory节点,可以有一个或多个。当有多个节点时,需要后跟单元地址予以区分;只有一个单元地址时,可以不写单元地址,默认为0。
 此节点包含板上物理内存的属性,一般要指定device_type(固定为"memory")和reg属性。其中reg的属性值以<起始地址 空间大小>的形式给出,如上示例中目标板内存起始地址为0,大小为256M字节。

3.4 /chosen节点
 这个节点有一点特殊。通常,这里由Open Firmware存放可变的环境信息,例如参数,默认输入输出设备。
 这个节点中一般指定bootargs及linux,stdout-path属性值。bootargs属性设置为传递给内核命令行的参数字符串。linux,stdout-path常常为标准终端设备的节点路径名,内核会以此作为默认终端。
 U- Boot在1.3.0版本后添加了对扁平设备树FDT的支持,U-Boot加载Linux内核、Ramdisk文件系统(如果使用的话)和设备树二进制镜 像到物理内存之后,在启动执行Linux内核之前,它会修改设备树二进制文件。它会填充必要的信息到设备树中,例如MAC地址、PCI总线数目等。U- Boot也会填写设备树文件中的“/chosen”节点,包含了诸如串口、根设备(Ramdisk、硬盘或NFS启动)等相关信息。
 U-Boot源码common/cmd_bootm.c的如下代码,显示了在执行内核代码前将调用ft_setup函数填写设备树。
#if defined(CONFIG_OF_FLAT_TREE)
    /*
     * Create the /chosen node and modify the blob with board specific
     * values as needed.
     */
    ft_setup(of_flat_tree, kbd, initrd_start, initrd_end);
    /* ft_dump_blob(of_flat_tree); */
#endif
 
3.5 片上系统SOC节点
 此 节点用来描述片上系统SOC,如果处理器是SOC,则此节点必须存在。顶级SOC节点包含的信息对此SOC上的所有设备可见。节点名应该包含此SOC的单 元地址,即此SOC内存映射寄存器的基址。SOC节点名以/soc<SOCname>的形式命名,例如MPC8349的SOC节点 是"soc8349"。
 在属性中应该指定device_type(固定为"soc")、ranges、bus-frequency等属性。 ranges属性值以<bus_addr parent_bus_addr size>的形式指定。SOC节点还包含目标板使用的每个SOC设备子节点,应该在设备树中尽可能详细地描述此SOC上的外围设备。如下给出带有看 门狗设备的SOC节点DTS示例。
       soc8349@e0000000 {
           #address-cells = <1>;
           #size-cells = <1>;
           device_type = "soc";
           compatible = "simple-bus";
           ranges = <0 e0000000 100000>;        /* 1MB size */
           reg = <e0000000 00000200>;
           bus-frequency = <0>;              /* From bootloader */

            wdt@200 {
               device_type = "watchdog";
               compatible = "mpc83xx_wdt";
               reg = <200 100>;                    /* Offset: 0x200 */
          };

3.6 其他设备节点
 分级节点用来描述系统上的总线和设备,类似物理总线拓扑,能很方便的描述设备间的关系。对于系统上的每个总线和设备,在设备树中都有其节点。对于这些设备属性的描述和定义请详细参考IEEE 1275及Linux内核文档booting-without-of.txt。
 设 备树的中断系统稍显复杂,设备节点利用interrupt-parent和interrupts属性描述到中断控制器的中断连接。其中 interrupt-parent属性值为中断控制器节点的指针,#interrupts属性值描述可触发的中断信号,其值格式与中断控制器的 interrupt-cells属性值有关。一般#interrupt-cells属性值为2,interrupts属性就对应为一对描述硬件中断号和中 断触发方式的十六进制值。其具体内容见参考文献[x](Open Firmware Recommended Practice: Interrupt Mapping Version 0.9".  The document is available at: <http://playground.sun.com/1275/practice >.)


4 设备树编译
 由于内核只识别二进制格式的扁平设备树,因此需要一个特殊的设备树编译器"dtc",将设备树源码文件 (.dts)编译二进制文件(.dtb)。dtc编译器会对输入文件进行语法和语义检查,并根据Linux内核的要求检查各节点及属性,将设备树源码文件 (.dts)编译二进制文件(.dtb),以保证内核能正常启动。最新的dtc编译器Git仓库位于www.gdl.com ,可以通过如下命令获得源码
 $git clone http://www.gdl.com/projects/dtc.git
 dtc编译器的使用方法如下所示[6]:
 dtc [-I <input_fomat>] [-O <ouput_fomat>] [-o output_filename] [-V output_version] input_filename
 input_format可以使用以下三个参数:
 dtb: 表示输入文件为dtb文件;
 dts: 表示输入文件为dts文件;
 fs: 表示输入文件为与/proc/device-tree文件的格式相同。
 output_format可以使用以下三个参数:
 dtb: 表示输出文件为dtb文件;
 dts: 表示输出文件为dts文件;
 asm: 表示输出文件为汇编语言文件;
 如 果output_format为“dtb”是,ouput_version用来规定生成的dtb文件的版本号,目前dtb文件可用的版本号为 1,2,3,16或17,output_format的缺省值为17。-S指定的是生成的dtb文件的大小,需要适当地扩大以供u-boot 创建/chose节点时使用。input_filename和output_filename分别为输入和输出文件名。从dtc编译器的使用方法中发 现,dtc编译器不仅可以实现dts文件到dtb文件的转换,也可以实现dtb文件到dts文件的转换。

 Linux源码的arch/powerpc/boot/dts/目录下存放了很多dts文件,可以作为参考文件。另外dtc编译器在内核源码2.6.25版本之后已经被包含进去。在2.6.26版本之后,生成blob的简单规则已经加入makefile,如下命令:
 $ make ARCH=powerpc canyonlands.dtb

 也可以根据自己的硬件修改好dts文件后,用下面类似命令生成dtb文件。
 $ dtc -f -I dts -O dtb -R 8 -S 0x3000 test.dts  > mpc836x_mds.dtb
 $ mkimage -A ppc -O Linux -T flat_dt -C none -a 0x300000 -e 0 -d mpc836x_mds.dtb mpc836x_mds.dtu

 注:最新的U-Boot使用dtb镜像文件。而freescale的U-Boot需要如上使用mkimage为dtb添加镜像信息。

5 U-Boot相关设置
 为使U-Boot支持设备树,需要在板子配置头文件中设置一系列宏变量。如本文在MPC8349E处理器目标板中移植的U-Boot配置如下:
/* pass open firmware flat tree */
#define CONFIG_OF_LIBFDT    1
#undef  CONFIG_OF_FLAT_TREE
#define CONFIG_OF_BOARD_SETUP   1
#define CONFIG_OF_HAS_BD_T  1
#define CONFIG_OF_HAS_UBOOT_ENV 1

启动引导代码U-Boot在完成自己的工作之后,会加载Linux内核,并将扁平设备树的地址传递给内核,其代码形式如下:
#if defined(CONFIG_OF_FLAT_TREE) || defined(CONFIG_OF_LIBFDT)
    if (of_flat_tree) { /* device tree; boot new style */
        /*
         * Linux Kernel Parameters (passing device tree):
         *   r3: pointer to the fdt, followed by the board info data
         *   r4: physical pointer to the kernel itself
         *   r5: NULL
         *   r6: NULL
         *   r7: NULL
         */
        (*kernel) ((bd_t *)of_flat_tree, (ulong)kernel, 0, 0, 0);
        /* does not return */
    }
#endif
 
 arch/powerpc 内核的入口有且只有一个,入口点为内核镜像的起始。此入口支持两种调用方式,一种是支持Open Firmware启动,另一种对于没有OF的引导代码,需要使用扁平设备树块,如上示例代码。寄存器r3保存指向设备树的物理地址指针,寄存器r4保存为 内核在物理内存中的地址,r5为NULL。其中的隐含意思为:假设开启了mmu,那么这个mmu的映射关系是1:1的映射,即虚拟地址和物理地址是相同 的。

6 Linux内核对设备的解析。

 扁平设备树描述了目标板平台中的设备树信息。每个设备都有一个节点来描述其信息,每个节点又可以有子节点及其相应的属性。内核源码中 include/linux/of.h及drivers/of/base.c等文件中提供了一些Open Firmware API,通过这些API,内核及设备驱动可以查找到相应的设备节点,读取其属性值,利用这些信息正确地初始化和驱动硬件。

分析Linux内核的源码,可以看到其对扁平设备树的解析流程[7 待详细分析]如下:
(1)首先在内核入口处将从u-boot传递过来的镜像基地址和dtb文件映像基地址保存通用寄存器r30和r31。
(2)通过调用machine_init()、early_init_devtree()函数来获取内核前期初始化所需的bootargs,cmd_line等系统引导参数。
(3)根据bootargs,cmd_line等系统引导参数进入start_kernel()函数,进行内核的第二阶段初始化。
(4)调用start_kernel()、setup_arch()、unflatten_device_tree()函数来解析dtb文件,构建一个由device_node结构连接而成的单项链表,并使用全局变量allnodes 指针来保存这个链表的头指针。
(5)内核调用OF 提供的API函数获取allnodes链表信息来初始化内核其他子系统、设备等。


7 内核折中

 引入了设备树FDT blob,相应的会占用一定的存储空间,同时引入了FDT API代码,相比之下内核代码有所增加,但是一个内核镜像可以支持多个硬件平台,不同的平台间只需修改设备树FDT blob即可。

8 结束语

 本文介绍了设备树的起源及其优点,进而阐述了设备树的数据存储格式以及源码描述语法,给出了设备树的编译方法,最后引出了移植过程中的U- Boot相关设置说明及内核的解析过程分析。设备树为嵌入式系统向Linux内核传递参数的动态接口,希望本文对嵌入式PowerPC Linux开发者具有一定的参考价值,加快嵌入式PowerPC Linux开发中的设备树DTS移植过程。

参考文献

[1] Matt Tyrlik. Booting Linux on Embedded PowerPCTM Systems [R]. Embedded Linux Developers Conference, 2007
[2] Benjamin Herrenschmidt, Becky Bruce, et al. Booting the Linux/ppc kernel without Open Firmware [Z]. bootint-without-of.txt from the Linux kernel source tree , 2006
[3] DENX. Flattened Device Tree Blob [EB/OL]. http://www.denx.de/wiki/view/DULG/LinuxFDTBlob , 2009
[4] Grant Likely, Josh Boyer. A Symphony of Flavours: Using the device tree to describe embedded hardware [R]. Ottawa, Canada: Linux Symposium, 2008
[5] SUN. The Open Firmware Home Page [EB/OL]. http://playground.sun.com/1275/home.html , 2005
[6] David Gibson, Benjamin Herrenschmidt, OzLabs. Device trees everywhere [R]. 2006
[7] 邱文华,邱珍珍. 基于扁平设备树的Linux内核启动方式[J]. 现代计算机,2009年第3期,115-118. 2009.3

原文地址: http://blog.chinaunix.net/u2/80953/showart_2127321.html
Linux - Devicetree规范: 中断和中断映射 参考: Specifications - DeviceTree Releases · devicetree-org/devicetree-specification · GitHub devicetree-specification-v0.4-rc1.pdf(但里面标注是:Devicetree Specification Release v0.3-40-g7e1cc17) 2.4 中断和中断映射 Interrupts and Interrupt Mapping DTSpec采用Open ... 阅读详情

相关推荐

powerpc Linux设备树DTS移植

摘 要:设备树的引入减少了内核为支持新硬件而需要的改变,提高代码重用,加速了Linux 支持包的开发,使得单个内核镜像能支持多个系统。作为U-Boot 和Linux 内核之间的动态 接口,本文阐述了设备树的数据存储格式以及源码描述语法,进而分析了U-Boot 对扁平设 备树的支持设置,Linux 内核对设备树的解析流程。 Pages: 7

嵌入式Linux--设备树(DeviceTree fdt)

目录1. Device Tree简介2. Device Tree编译3、设备树启动 1. Device Tree简介  Linus Torvalds在2011年3月17日的ARM Linux邮件列表宣称“this whole ARM thing is a fucking pain in the ass”,引发ARM Linux社区的地震,随后ARM社区进行了一系列的重大修正。在过去的ARM Linux中,arch/arm/plat-xxx和arch/arm/mach-xxx中充斥着大量的垃圾代码,相当多数的

似水流年 5182

Open Firmware Recommended Practice: Interrupt Mapping Version 0.9

Open Firmware Recommended Practice: Interrupt Mapping Version 0.9

Devicetree SpecificationRelease 之(2)THE DEVICETREE

2.1 Overview DTSpec采用了一个称为设备树的数据结构来描述系统的硬件信息。引导程序将设备树加载到客户端程序的内存中,并将指向该设备树的指针传递给客户端。

u013818917的博客 611

practice:从2020年7月12日开始

practice:从2020年7月12日开始

设备树使用手册.PDF

Linux设备树使用手册

嵌入式 设备树解析

/* add by starby */ name = "chosen"; bootargs = "root=/dev/ram rw console=ttyS0,115200"; linux,stdout-path = "/soc8349@e0000000/serial@4500"; }; }; 3.1 根节点 设备树的起始点称之为

books_world的博客 2897

uni-app刮奖

uni-app的刮奖效果,要注意的点: 1.小程序的canvas层级问题(可用cover-view规避) 2.不能操作dom 以下是uni-app刮奖效果的代码: <template> <!-- 刮奖 --> <view v-else class="scratch"> <view class="box"> &lt...

qq_40101922的博客 4307

嵌入式 PowerPC Linux 平台扁平设备树FDT解析

嵌入式 PowerPC Linux 平台扁平设备树FDT解析      摘 要:设备树的引入减少了内核为支持新硬件而需要的改变,提高代码重用,加速了Linux支持包的开发,使得单个内核镜像能支持多个系统。作为U-Boot 和Linux内核之间的动态接口,本文阐述了设备树的数据存储格式以及源码描述语法,进而分析了U-Boot对扁平设备树的支持设置,Linux内核对设 备树的解析流程。

ermuzhi的专栏 4566

手把手拆解:储能电站如何实现‘孤岛运行’与‘黑启动’?从SVPWM控制到无缝并网

本文深入解析储能电站的孤岛运行与黑启动技术,从SVPWM控制策略到电网重构实战。通过详细的三环控制架构和黑启动五阶段技术路线,展示储能电站在电网故障时如何快速切换为独立电压源并实现电网重建。文章还探讨了虚拟惯量补偿、多站协同控制等前沿技术,为电力系统应急恢复提供关键解决方案。

weixin_30509393的博客 304

TMS320C6678开发笔记1-6---C6678单核烧写程序

第6节 单核烧写加载程序 6.1节 TI参考文档 参考文档:《KeystoneI Bootloader Resources and FAQ》讲的非常好,建议一定要看 https://processors.wiki.ti.com/index.php/KeystoneI_Bootloader_Resources_and_FAQ#Direct_Boot_Examples_.28without_IBL.29 里面有三个工程: C6678 EVM SPI boot example C6657 EVM ..

kunkliu的博客 5693

【嵌入式Linux学习七步曲之第三篇 Linux系统bootlaoder移植】全面解析PowerPC架构下的扁平设备树FDT

全面解析PowerPC架构下的扁平设备树FDTSailor_forever  sailing_9806#163.com(本原创文章发表于Sailor_forever 的个人blog,未经本人许可,不得用于商业用途。任何个人、媒体、其他网站不得私自抄袭;网络媒体转载请注明出处,增加原文链接,否则属于侵权行为。如有任何问题,请留言或者发邮件给sailing_9806@163.com

Sailor_forever 1万+

芯片原厂linux驱动开发的分享

大家好,我是XX,来自湖南XX学院,电子信息18级,也曾在创新基地控制组学习过两三年,毕业后就职于一家芯片原厂的解决方案部,担任驱动工程师的职位,算上实习期,我的工作时长已有两年。在此我想将这两年期间学习与积累到的一些经验输出出来,与大家一同分享。知识面有限,只能简单介绍一些驱动开发方向的一些经验,且由于经验尚浅,文中难免会有一些疏漏和错误之处,还请大家积极地批评指正。

嵌入式技术开发 847

linux3.5 usb 设备树,嵌入式 PowerPC Linux 平台扁平设备树FDT解析

] [-O ] [-o output_filename] [-V output_version] input_filenameinput_format可以使用以下三个参数:dtb: 表示输入文件为dtb文件;dts: 表示输入文件为dts文件;fs: 表示输入文件为与/proc/device-tree文件的格式相同。output_format可以使用以下三个参数:dtb: 表示输出文件为dtb文件...

weixin_36160690的博客 825

优化dalsa相机检测界面

上节实现了使用qt结合dalsa相机显示检测到缺陷的画面,由于窗口过于简陋,本节将进行一个界面优化。

A1983Z的博客 987

基于深度学习的茶叶等级检测识别系统:YOLOv8 + UI界面 + 数据集完整实现

随着深度学习技术的不断进步,基于计算机视觉的茶叶等级检测系统可以大大提高检测效率,提供客观一致的评估标准。本系统将利用YOLOv8进行茶叶等级的检测与识别,通过图形用户界面(UI)实现与用户的交互,提供茶叶等级分类的实时反馈。本文将详细介绍如何使用YOLOv8结合UI界面,建立一个完整的茶叶等级检测与识别系统,包括数据集的准备、模型的训练、UI的设计及完整的代码实现。本系统的目标是通过深度学习技术,结合YOLOv8模型和图形用户界面(UI),实现对茶叶等级的自动化检测与识别。

YOLO 972

开源硬件1:基本概念

“开源硬件”:描述如今基于嵌入式产品平台、基于硬件描述语言、以软件技术为主的智能硬件的开发模式。 一类是由用户板进化出的可二次开发的板级开源硬件(早期以树莓派为代表); 另一类是开源硬件描述语言(以Chisel为代表源代码开放的开源硬件); 还有一类是开源操作系统中的开源硬件数据结构(如ARM Device Tree)。 硬件描述语言HDL是一种用形式化方法描述数字电路和系统的语言。 硬...

dongzengwu的专栏 3145

Vins-Fusion 外参camera-imu 标定

Vins-Fusion是一种基于优化的多传感器状态估计器,一大特色是支持实时camera-imu外参校准(相机和IMU之间的旋转)。Vins-Fusion 外参camera-imu校准是利用两帧间计算相机位姿和imu预积分得到位姿,构建最小二乘问题,并通过SVD求解camera-imu外参旋转矩阵。

u010196944的博客 2490

全面解析PowerPC架构下的扁平设备树FDT

全面解析PowerPC架构下的扁平设备树FDT Sailor_forever  sailing_9806#163.com (本原创文章发表于Sailor_forever 的个人blog,未经本人许可,不得用于商业用途。任何个人、媒体、其他网站不得私自抄袭;网络媒体转载请注明出处,增加原文链接,否则属于侵权行为。如有任何问题,请留言或者发邮件给sailing_9806@163.com)

若水心境的专栏 1955

把时间当成数据:SAP ABAP 里的 DATS/TIMS 与 DATN/TIMN,怎么选才不踩坑

SAP项目中日期时间字段的陷阱与优化 日期时间字段(DATS/TIMS)在SAP项目中看似简单却常引发事故,主要问题包括: 非法日期(如20201331)入库后,在月结、对账时爆发异常 空值被处理为00000000导致排序错误 ABAP提供两种处理方案: 经典类型DATS/TIMS:存储为字符格式,校验宽松易存脏数据 HANA原生类型DATN/TIMN:数据库级校验,写入即拦截非法值 优化建议: 在接口层和入库前进行严格校验 新项目优先使用DATN/TIMN类型 对遗留数据使用DATS_IS_VALID等函

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 184

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

全面解析PowerPC架构下的扁平设备树FDT(ZT)

Sailor_forever sailing_9806#163.com (本原创文章发表于Sailor_forever 的个人blog,未经本人许可,不得用于商业用途。任何个人、媒体、其他网站不得私自抄袭;网络媒体转载请注明出处,增加原文链接,否则属于侵权行为。如有任何问题,请留言或者发邮件给sailing_9806@163.com) http://blog.youkuaiyun.com/sailo...

fanrey123的博客 1124

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

全面解析PowerPC架构下的扁平设备树FDT 、设备树节点DTB

Sailor_forever  sailing_9806#163.com(本原创文章发表于Sailor_forever 的个人blog,未经本人许可,不得用于商业用途。任何个人、媒体、其他网站不得私自抄袭;网络媒体转载请注明出处,增加原文链接,否则属于侵权行为。如有任何问题,请留言或者发邮件给sailing_9806@163.com)http://blog.youkuaiyun.com/sailor_8318

LYJ个人博客,记录技术、八卦、生活,分享各种心得,期待与朋友们一同进步 7039

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

下一篇: Android Binder
hellolwl
博客等级 码龄24年 16粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值