1.小白自制Linux开发板 :Linux内核与文件系统移植
2.ARM处理器超频、编译备树内存超频方法——以主线内核设备树、设备树定主线u-boot为例
3.ARM & Linux 基础学习 / 配置交叉编译工具链 / 编译 Linux 应用和驱动 / 编译内核
4.linux设备驱动程序——设备树(0)-dtb格式
5.Linux内核DTB文件启动的有源译设几种方式
6.Linux驱动开发 - Linux 设备树学习 - DTS语法
小白自制Linux开发板 :Linux内核与文件系统移植
Linux内核
若要移植F1CS/F1CS至Linux,可直接利用官方源码对licheepi nano的码编命令支援。首先,文件访问kernel.org下载最新长支版本内核源码(建议使用5..),编译备树邀请码网站源码若使用特定版本,设备树定如5.7.1,有源译设则可直接下载对应链接。码编命令解压后,文件将内核源码复制至Ubuntu虚拟机。编译备树
配置编译
在Linux内核代码中找到Makefile文件,设备树定修改ARCH和CROSS_COMPILE配置为Arm,有源译设使用编译工具交叉编译。码编命令完成内核配置后,文件下载licheepi_nano的配置文件,放置于arch/arm/configs目录下。使用图形化配置界面完成内核与开发板soc的对应配置。
配置TF卡设备树信息
在arch/arm/boot/dts目录下修改suniv-f1cs.dtsi和suniv-f1cs-licheepi-nano.dts文件,添加相应的头文件与配置选项。确保内核编译成功,生成zImage和dtb文件。
TF分区配置
通过Gparted软件分区,将TF卡分为两个分区,一个用于存放zImage、dtb文件,另一个用于根文件系统。格式化为fat和ext4,确保正确分配分区大小并保存配置。
内核复制与执行
将内核文件复制至TF卡的BOOT分区,插入开发板后,通过u-boot启动并自动进入内核启动环节。确保TF卡根文件系统正确挂载。
文件系统移植
使用Buildroot制作根文件系统,选择目标选项、编译选项、工具链与系统配置,确保文件系统兼容并能正常挂载。构建完成的根文件系统镜像解压至TF卡第二分区。
执行与升级
登录自制Linux系统,通过修改/etc/profile文件调整命令行显示。运行GPIO实验,利用Linux GPIO子系统实现LED灯的点灯功能,探索Linux内核的驱动实现。
总结
完成了Linux内核与文件系统的三底形态源码移植,从内核配置到文件系统挂载,再到驱动实验,逐步实现自制Linux开发板的操作系统。后续将升级硬件设备并进行更有意义的项目开发,期待你的进步。
ARM处理器超频、内存超频方法——以主线内核设备树、主线u-boot为例
ARM处理器超频和内存超频可以通过主线内核设备树和u-boot来实现。首先,内存频率设置可通过查看/sys/kernel/debug/clk/clk_summary得到,初始频率为 MB/s。为了提升到厂商推荐的 MB/s,需在u-boot源码的menuconfig中修改sunxi dram clock speed,编译并刷写后,内存频率即提升至 MB/s,操作后系统反应速度会有所提升。
对于CPU频率,ARM平台的Linux内核主要通过设备树文件配置。以香橙派pc为例,通过修改sun8i-h3-orangepi-pc.dts文件,根据SYA提供的电压管理,可增加新的频率档位。注意在超频前确保良好的散热措施,如安装散热片或风扇,以防止过热。我的CPU在调整后最高频率可达1.5GHz。
GPU频率设置同样在设备树中进行,Mali GPU的频率通常受负载自动调节,可以通过powertop或搜索GPU名称查看。全志H3的GPU理论上可达MHz,但在良好散热下可以超频至MHz,但仍需注意避免过度导致性能问题。
为了进一步提升系统速度,可以考虑将USB固态硬盘作为系统盘,通过修改boot argument和fstab文件来优化系统分区。这样可以有效提升系统的运行速度。
ARM & Linux 基础学习 / 配置交叉编译工具链 / 编译 Linux 应用和驱动 / 编译内核
基于 ARM & Linux 的基础学习 本文整理自“ask imx6ull”开发板的相关资料,以及菜鸟教程、C语言中文网等资源,旨在提炼核心内容,方便后续查阅。对于基础知识,本文将不再详述,如有错误,做市高频源码期待您的指正。请记住,文章基于IMX6ULL的A7内核,配置的交叉编译器对应ARMv7 位,对于A内核如i.mx8mm,则需使用ARMv8 位的工具链。保持清晰的学习态度,耐心探索。 获取Linux应用和驱动的编译指南,可以从三个途径入手:开发板供应商提供的SDK工具链、ARM官网下载、以及Linaro GCC编译器。具体操作涉及编辑~/.bashrc文件以添加环境变量,并测试编译器版本。 针对IMX6ULL,SDK中的工具链位于/.../ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin。通过添加至.bashrc并激活,验证工具链可用性。在编写和编译驱动程序时,需编写Makefile并确保环境变量设置正确。 编译内核时,需根据特定开发板的配置文件,如arch/arm/configs/目录下的内容进行。首先在Linux源码目录执行配置命令,生成内核文件和设备树文件。对于内核模块的编译,同样在Linux源码目录进行,完成后将模块导入目标板的lib/modules目录。 对于Buildroot构建系统,它简化了嵌入式Linux定制过程,自动化构建bootloader、内核和文件系统。通过一系列Makefile命令,可以快速生成适用于不同目标板的嵌入式Linux环境。学习Buildroot,可以参考相关文档。 构建过程可能耗时较长,但通过配置不同的配置文件,可以定制化地创建不同需求的文件系统。编译成功后,输出的文件需传输到嵌入式板并安装或烧录至SD卡或eMMC中。linux设备驱动程序——设备树(0)-dtb格式
设备树的一般操作方式是:开发人员根据开发需求编写dts文件,然后使用dtc将dts编译成dtb文件。
dts文件是街拍打赏源码文本格式的文件,而dtb是二进制文件,在linux启动时被加载到内存中,接下来我们需要来分析设备树dtb文件的格式。
为什么要了解设备树dtb文件的格式
dtb作为二进制文件被加载到内存中,然后由内核读取并进行解析,如果对dtb文件的格式不了解,那么在看设备树解析相关的内核代码时将会寸步难行,而阅读源代码才是了解设备树最好的方式,所以,如果需要更透彻的了解设备树解析的细节,第一步就是需要了解设备树的格式。
dtb格式总览
dtb的格式是这样的:
dtb header
但凡涉及到数据的记录,就一定会有一个总的描述部分,就像磁盘的超级块,书的目录,dtb当然也不例外,这个描述头部就是dtb的header部分,通过这个header部分,用户可以快速地了解到整个dtb的大致信息。
header可以用这么一个结构体来描述:
magic
设备树的魔数,魔数其实就是一个用于识别的数字,表示设备树的开始,linux dtb的魔数为 0xddfeed.
totalsize
这个设备树的size,也可以理解为所占用的实际内存空间。
off_dt_struct
offset to dt_struct,表示整个dtb中structure部分所在内存相对头部的偏移地址
off_dt_strings
offset to dt_string,表示整个dtb中string部分所在内存相对头部的偏移地址
off_mem_rsvmap
offset to memory reserve map,dtb中memory reserve map所在内存相对头部的偏移地址,
version
设备树的版本,截至目前的最新版本为.
last_comp_version
最新的兼容版本
boot_cpuid_phys
这部分仅在版本2中存在,后续版本不再使用。
size_dt_strings
表示整个dtb中string部分的大小
size_dt_struct
表示整个dtb中struct部分的大小
alignment gap
中间的alignment gap部分表示对齐间隙,它并非是必须的,它是否被提供以及大小由具体的平台对数据对齐和的要求以及数据是否已经对齐来决定。
memory reserve map
memory reserve map:描述保留的内存部分,这个map的数据结构是这样的:
这部分存储了此结构的列表,整个部分的结尾由一个数据为0的结构来表示(即physical_address和size都为0,总共字节)。
这一部分的数据并非是节点中的memory子节点,而是在设备开始之前(也就是第一个花括号之前)定义的,例如:
这一部分的作用是告诉内核哪一些内存空间需要被保留而不应该被系统覆盖使用,因为在内核启动时常常需要动态申请大量的内存空间,只有提前进行注册,用户需要使用的内存才不会被系统征用而造成数据覆盖。
值得一提的光遇辅助源码是,对于设备树而言,即使不指定保留内存,系统也会默认为设备树保留相应的内存空间。
同时,这一部分需要位(8字节)对齐。
device-tree structure
device-tree structure:每个节点都会被描述为一个struct,节点之间可以嵌套,因此也会有嵌套的struct。
structure的的结构是这样的:
device-tree strings
device-tree strings:在dtb中有大量的重复字符串,比如"model","compatile"等等,为了节省空间,将这些字符串统一放在某个地址,需要使用的时候直接使用索引来查看。
需要注意的是,属性部分格式为key = value,key部分被放置在strings部分,而value部分的字符串并不会放在这一部分,而是直接放在structure中。
dtb文件解析示例
光说不练假把式,下面我就使用一个简单的示例来剖析dtb的文件格式。
下述示例仅仅是一个演示demo,不针对任何平台,为了演示方便,编写了一个非常简单的dts文件。 /dts-v1/; / {
编译当前dts文件,获取对应的dtb文件。
鉴于dtb文件为二进制文件,普通编辑器打开显示乱码,我们使用ultraEdit查看,它将数据以进制形式显示:
整个dtb文件还是比较简单的,图中的红色框出的部分为header部分的数据,可以看到:
整个头部为字节,进制为0x,从头部信息中off_mem_rsvmap部分可以得到,reserve memory起始地址为0x,上文中提到,这一部分使用一个字节的struct来描述,以一个全为0的struct结尾。
后字节全为0,可以看出,这里并没有设置reserve memory。
structure 部分
上文回顾:每一个属性都是以 key = value的形式来描述,value部分可选。
偏移地址来到0x(0x+0x),接下来8个字节为,根据上述structure中的描述,这是OF_DT_PROP,即标示属性的开始。
接下来4字节为,表明该属性的value部分size为字节。
接下来4字节是当前属性的key在string 部分的偏移地址,这里是,由头部信息中off_dt_strings可以得到,string部分的开始为,偏移地址为0,所以对应字符串为"compatible".
之后就是value部分,这部分的数据是字符串,可以直接从右侧栏看出,总共字节的字符串"hd,test_dts", "hd,test_xxx",因为字符串之间以0结尾,所以程序可以识别出这是两个字符串。
可以看出,到这里,compatible = "hd,test_dts", "hd,test_xxx";这个属性就被描述完了,对于属性的描述还是非常简单的。
按照固有的规律,接下来就是对#address-cells = <0x1>的解析,然后是#size-cells = <0x1>...
然后就是递归的子节点chosen,memory@等等都是按照上文中提到的structure解析规则来进行解析,最后以结尾。
与根节点不同的是,子节点有一个unit name,即chosen,memory@这些名称,并非节点中的.name属性。
而整个结构的结束由来描述。
一般而言,在位系统中,dtc在编译dts文件时会自动考虑对齐问题,所以对于设备树的对齐字节,我们只需要有所了解即可,并不会常接触到。
好了,关于linux设备树dtb文件格式的讨论就到此为止啦。
Linux内核DTB文件启动的几种方式
Device Tree简介
Linus Torvalds在年提出Device Tree概念,作为一种硬件描述数据结构,它源于OpenFirmware。在Linux2.6中,ARM架构的板级硬件细节过多地被硬编码在内核中。Device Tree引入后,许多硬件细节可以直接传递给Linux,减少内核中的冗余编码。
Device Tree由结点和属性组成,描述硬件信息如CPU、总线、设备的连接关系。Bootloader将Device Tree传递给内核,内核识别并展开硬件,创建如platform_device、i2c_client等设备对象。
Device Tree编译
Device Tree文件(dts)需编译为dtb格式,便于Linux和Bootloader识别。编译工具是dtc,可以通过在Linux源码目录下执行命令安装。
早期Linux内核启动
早期Linux内核通过硬编码的方式描述硬件信息,如在arch/arm/mach-xxx文件中。zImage文件需要通过u-boot转换为uImage后,通过bootm命令启动。
设备树启动
Linux-3.x后内核统一启用Device Tree,硬件信息描述在dts文件中。编译内核时使用make dtbs生成dtb文件。启动时需要加载uImage和dtb文件。
设备树和uImage合并
dtb文件将硬件信息与内核分离,通过合并uImage和dtb文件,可为不同硬件开发板提供统一内核。例如,使用cat命令合并文件后,使用mkimage生成uImage文件。
u-boot FIT image合并
使用FIT Image格式合并uImage和dtb文件。FIT Image利用Device Tree Source files语法,通过mkimage命令生成itb文件。u-boot需要配置支持FIT Image启动。
总结
Device Tree提供了一种灵活的硬件描述方式,使内核与硬件解耦。通过合并uImage和dtb文件,或使用FIT Image格式,可简化启动流程,支持不同硬件开发板。
Linux驱动开发 - Linux 设备树学习 - DTS语法
设备树(Device Tree)是一种描述硬件设备的树形结构文件,主要用于Linux系统中描述板级设备信息,如CPU数量、内存基地址、IIC接口和SPI接口所连接的设备等。设备树的主干是系统总线,IIC控制器、GPIO控制器、SPI控制器等设备是系统总线上的分支。例如,IIC控制器分为IIC1和IIC2,其中IIC1连接了FT和ATC这两个IIC设备,IIC2仅连接了MPU一个设备。
在开发Linux设备驱动时,需要了解DTS(Device Tree Source)、DTB(Device Tree Binary)和DTC(Device Tree Compiler)之间的关系。DTC工具依赖于特定的源代码文件,最终生成主机文件DTC。要编译DTS文件,只需在Linux源码根目录下执行命令“make all”或“make dtbs”,后者仅编译设备树。
在开发板中,每个板子都对应一个DTS文件,以I.MX6ULL芯片为例,打开arch/arm/boot/dts/Makefile文件,可以找到特定编译配置。当选中I.MX6ULL芯片后,与该芯片相关的DTS文件会被编译成DTB文件。若要为新的板子编写DTS文件,只需新建此板子对应的DTS文件,并在dtb-$(CONFIG_SOC_IMX6ULL)下添加对应的DTB文件名,这样在编译设备树时会自动编译为二进制文件。
在Linux内核源码分析学习方面,可参考指定地址。此外,Linux内核源码分析交流群提供学习资源,包括书籍、视频等,通过加入该群可以获取这些资源。
在编写设备树文件时,需要了解DTS语法。DTS文件支持头文件,扩展名为.dtsi。设备树节点通过属性信息描述,属性是键值对形式。例如,在imx6ull.dtsi文件中,描述了CPU架构、频率、外设寄存器地址范围等信息。设备节点是树形结构中描述设备的节点,通过节点名字和地址来描述。
兼容性属性(compatible)是设备树中非常重要的属性,用于将设备与驱动绑定。属性值是一个字符串列表,格式为“厂商名称, 设备名称”。Linux下的外设驱动通常会使用这些兼容性属性来查找与设备匹配的驱动程序。
模型属性(model)描述设备模块信息,如设备名字。状态属性(status)记录设备状态,可选状态包括正在运行、已停止、错误等。地址属性(address-cells和size-cells)用于描述设备子节点的地址信息,reg属性用于描述设备地址空间资源信息。ranges属性用于描述设备子地址和父地址的映射关系。
在产品开发过程中,设备树文件需要随着硬件需求的变更而更新。例如,需要在I.MX6U-ALPHA开发板的I2C1接口上添加一个新设备时,需要在对应的DTS文件中向已有节点添加新子节点。
在Linux内核启动时,设备树信息会被解析并在根文件系统中以目录/proc/devicetree的形式体现。通过该目录可以查看根节点的属性和子节点,如模型、兼容性、地址等信息。这些信息与设备树文件中的描述相匹配。
sdr开发篇 6. zynq+ad的linux工程搭建
SDR开发过程中,我们首先从hdl源码开始,从github下载_r1分支的zip包,解压后放置在工作区~/work/zynq_dev/ados。然后,创建Vivado工程,配置环境并编译,需要注意的是,这个工程需要针对xmzed进行修改。接着,对DDR和EMIO接口进行适配,并导出HDF文件。
接着,我们进入Petalinux 2.1工程阶段,拷贝适配后的HDF文件,并从github获取ADI的Linux内核和meta-adi。内核和meta-adi需下载、解压并配置,硬件信息目录中需要设置唯一的HDF文件。初次配置后,后续只需在修改后重新编译,配置启动方式、接口、SD卡,并解决source bitbake失败的问题。
内核配置中,USB和IIO功能默认开启。设备树部分,需在dash环境下修改,并在device-tree.bbappend中添加自定义设置。root文件系统配置时,由于meta-adi的影响,需要调整petalinux-user-image.bbappend以恢复默认设置。
编译工程时,注意分配足够的CPU资源,可能需要解决网络问题并设置全局代理。遇到错误时,如jesd-status-dev-r0的fetch问题,需替换相关文件。最后,打包boot.bin并制作SD卡文件系统,包括EXT和FAT分区,并进行启动测试。
测试阶段,通过拨码开关启动设备,使用默认root/root登录,进行IIO连接测试和Gnuradio发送信号测试。整个过程参考了相关教程和文档,如AD的开发指南和Linux驱动等。