设备树的使用(三)

这一节正式开始使用设备树来写驱动
在上一节我们我们添加了名称属性le_test
这里直接复制别人写的测试程序

#include <linux/init.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/of.h>
#include <linux/of_gpio.h>

#define DRIVER_NAME "leds_test"

static int leds_probe(struct platform_device * pdev)
{
	printk(KERN_ALERT "probe init\n");
    return 0;
}

static int leds_remove(struct platform_device * pdev)
{
	printk(KERN_ALERT "Goodbye, curel world, this is remove\n");
    return 0;
}

static const struct of_device_id of_leds_dt_match[] = {
	{.compatible = DRIVER_NAME},
	{},
};

MODULE_DEVICE_TABLE(of,of_leds_dt_match);

static struct platform_driver leds_driver = {
	.probe 	= leds_probe,
	.remove = leds_remove,
	.driver = {
		.name = DRIVER_NAME,
		.owner = THIS_MODULE,
		.of_match_table = of_leds_dt_match,
		},
};

static int leds_init(void)
{
	printk(KERN_ALERT "Hello, world\n");
	return platform_driver_register(&leds_driver);
	return 0;
}

static void leds_exit(void)
{
	printk(KERN_ALERT "Goodbye, curel world\n");
	platform_driver_unregister(&leds_driver);
}

module_init(leds_init);
module_exit(leds_exit);

MODULE_LICENSE("Dual BSD/GPL");
<think>好的,用户现在想了解如何使用设备树创建One File Linux文件系统。首先,我需要确认用户提到的“oneflielinux”是否是指“One File Linux”或者可能有拼写错误。假设是“One File Linux”,这可能是指一个极简的Linux系统,所有必需的文件都包含在一个镜像文件中。 接下来,用户提到了设备树(Device Tree),所以需要将设备树的创建和集成到文件系统构建过程中。设备树在嵌入式Linux中用于描述硬件配置,因此用户可能是在为特定硬件定制一个最小化的Linux文件系统。 我需要回顾之前用户的历史问题,之前他们询问了构建Linux文件系统镜像的方法,涉及ext4、SquashFS、initramfs等。现在的问题更具体,涉及到设备树使用,可能用户现在在开发嵌入式系统,需要将设备树编译后的dtb文件整合到文件系统中,或者需要在内核启动时正确加载设备树。 接下来,需要确定One File Linux的具体含义。可能是指initramfs,因为initramfs是一个临时的根文件系统,通常打包成一个镜像文件,由内核在启动时加载。这种情况下,设备树可能需要包含在initramfs中,或者在启动时由bootloader传递给内核。 可能需要分步骤说明如何创建一个包含设备树的initramfs镜像,或者如何配置内核以使用设备树。此外,用户可能需要知道如何将设备树二进制文件(dtb)放置在正确的位置,例如在/boot目录下,或者在U-Boot中指定设备树地址。 另外,用户可能对设备树的编译和打包过程不太熟悉,需要解释如何将dts源文件编译成dtb,并将dtb文件包含在文件系统镜像中。同时,可能需要提到在启动过程中如何正确加载设备树,例如通过修改bootargs或使用U-Boot命令。 还需要考虑用户可能遇到的常见问题,比如设备树未正确应用导致硬件无法识别,或者文件系统镜像中没有正确包含dtb文件。因此,在回答中应包括验证步骤和故障排除方法,例如如何检查设备树是否被正确加载,如何调试设备树中的错误等。 此外,用户可能希望有一个具体的示例,展示从编写设备树文件到构建完整文件系统镜像的整个过程。需要提供具体的命令和代码示例,例如使用mkinitramfs工具生成initramfs,并在其中包含dtb文件,或者如何配置Buildroot或Yocto这样的构建系统来自动化这一过程。 最后,确保回答结构清晰,步骤明确,覆盖设备树的创建、编译、集成到文件系统镜像,以及启动配置等关键环节。同时,参考之前回答中的工具和流程,保持一致性,并补充设备树相关的具体内容。</think>构建支持设备树(Device Tree)的单一文件Linux系统(如initramfs)是嵌入式开发中的常见需求。以下是详细构建指南: --- ### 一、设备树集成原理 ```mermaid graph LR A[硬件描述.dts] -->|编译| B[二进制设备树.dtb] B --> C[内核启动参数] C --> D[文件系统/boot目录] ``` --- ### 二、基础环境准备 ```bash # 安装设备树编译器 sudo apt install device-tree-compiler # 验证dtc版本 dtc -v # 需≥1.4.7 ``` --- ### 、完整构建流程 #### 1. 创建设备树文件 ```dts // myboard.dts /dts-v1/; / { model = "Custom Board"; compatible = "myboard"; #address-cells = <1>; #size-cells = <1>; memory@80000000 { device_type = "memory"; reg = <0x80000000 0x10000000>; }; chosen { bootargs = "console=ttyS0,115200 earlycon"; }; }; ``` #### 2. 编译设备树 ```bash dtc -O dtb -o myboard.dtb myboard.dts # 生成二进制设备树 ``` #### 3. 构建最小文件系统 ```bash mkdir -p rootfs/{boot,dev,proc,sys,usr/bin} cp myboard.dtb rootfs/boot/ # 关键步骤:放置设备树 # 创建初始化脚本 cat > rootfs/init <<EOF #!/bin/sh mount -t proc none /proc mount -t sysfs none /sys mknod /dev/console c 5 1 exec /bin/sh EOF chmod +x rootfs/init ``` #### 4. 打包为CPIO镜像 ```bash (cd rootfs && find . | cpio -H newc -ov > ../initramfs.cpio) gzip initramfs.cpio # 生成initramfs.cpio.gz ``` --- ### 四、内核配置关键项 ```bash # 确保内核支持设备树 CONFIG_ARM_APPENDED_DTB=y # 使用附加设备树 CONFIG_CMDLINE="root=/dev/ram rdinit=/init" # 初始化参数 ``` --- ### 五、QEMU启动验证 ```bash qemu-system-arm -M vexpress-a9 \ -kernel zImage \ -dtb myboard.dtb \ -initrd initramfs.cpio.gz \ -append "console=ttyAMA0" \ -nographic ``` --- ### 六、进阶集成方法 #### 1. 自动挂载设备树 ```bash # 在init脚本中添加自动加载逻辑 echo "mount -t configfs none /sys/kernel/config" >> rootfs/init ``` #### 2. 动态设备树覆盖 ```bash # 创建overlay目录 mkdir -p rootfs/overlays # 在启动参数添加: bootargs += "fdtoverlays=overlays/myoverlay.dtbo" ``` --- ### 七、常见问题排查 | 故障现象 | 诊断命令 | 解决方案 | |---------------------------|-----------------------------|-----------------------------------| | 内核无法识别设备树 | `dmesg | grep -i device_tree` | 检查CONFIG_OF配置项 | | 设备树版本不匹配 | `dtc -I dtb -O dts myboard.dtb` | 确保dtc版本与内核匹配 | | 内存地址映射错误 | `cat /proc/iomem` | 检查设备树memory节点reg参数 | | 外设驱动加载失败 | `ls /proc/device-tree` | 验证设备树节点命名与驱动匹配 | | 启动卡在Uncompressing kernel | `hexdump -C initramfs.cpio | head` | 确认CPIO文件头格式正确 | --- ### 八、性能优化技巧 1. **设备树压缩** ```bash # 启用LZO压缩 dtc -O dtb -@ -H epapr -W no-unit_address_vs_reg -o myboard.dtb myboard.dts ``` 2. **镜像瘦身方案** ```bash # 删除设备树冗余属性 fdtput -t s myboard.dtb / chosen bootargs "console=ttyS0" # 精简启动参数 strip --strip-debug myboard.dtb # 移除调试信息 ``` 3. **混合文件系统布局** ```bash # 组合使用initramfs和永久存储 / { chosen { linux,initrd-start = <0x84000000>; linux,initrd-end = <0x84800000>; }; }; ``` --- 通过合理集成设备树与文件系统,可构建出高度定制化的嵌入式Linux系统。实际开发中建议: - 使用`fdtdump`实时验证设备树结构 - 通过`CONFIG_DEBUG_DRIVER`开启驱动调试 - 在QEMU中先验证再烧录物理设备
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值