RK3568平台 sys虚拟文件系统添加节点

news2024/12/29 11:25:08

一.常见的linux文件系统

1. EXT2: EXT2是最早的Linux文件系统之一,它被广泛应用于Linux操作系统中。它支持大小为16TB的分区和最大文件大小为2TB。由于其简单性和高可靠性,在很长一段时间内仍被许多用户所选择。

2. EXT3: 2001年,Linux社区发布了EXT3作为EXT2的升级版。它添加了日志功能以提高数据完整性和可靠性,并且支持快速备份和恢复功能。这使得它更加适合生产环境中使用。

3. EXT4: 2008年发布的EXT4是EXT系列中最新版本的文件系统。在保持向前兼容性的同时,它引入了许多新特性,如支持更大的文件和分区、更快的读写速度以及更好地处理碎片等特点。

4. 高可靠性:EXT系列文件系统采用日志技术来防止出现文件系统损坏或异常情况时数据丢失或者损坏,保证数据的完整性和一致性。

5. 兼容性:EXT文件系统被广泛用于Linux操作系统中,并且可以在其他类Unix系统中进行兼容和交互操作。

二.sys文件系统

sys文件系统的主要作用,是对系统上的设备与总线进行组织与管理,以形成分级的文件。用户空间可以访问或配置这些文件,进而得知系统状态或者控制系统。

root@ubuntu:/sys# tree -L 1
.
├── block
├── bus
├── class 
├── dev
├── devices
├── firmware
├── fs
├── hypervisor
├── kernel
├── module
└── power
 

1.class目录

将设备按照功能分类。

root@ubuntu:/sys/class# ls
ata_device  dma       i2c-adapter  powercap      scsi_device    tty
ata_link    dmi       input        power_supply  scsi_disk      vc
ata_port    drm       leds         ppdev         scsi_generic   virtio-ports
backlight   extcon    mdio_bus     ppp           scsi_host      vtconsole
bdi         firmware  mem          printer       sound          watchdog
block       gpio      misc         pwm           spi_host
bluetooth   graphics  mmc_host     regulator     spi_master
bsg         hidraw    net          rfkill        spi_transport
devfreq     hwmon     pci_bus      rtc           thermal

 2、block目录

每个块设备在该目录下对应一个子目录。

每个子目录中又包含一些属性文件,它们描述了这个块设备的各方面的属性,比如设备大小。另外,loop块设备是使用文件来模拟的。

通过查看该目录下的详细信息,得知它们都是链接文件,指向/sys/devices/下的设备。

root@ubuntu:/sys/block# ls
loop0  loop3  loop6  ram1   ram12  ram15  ram4  ram7  sda
loop1  loop4  loop7  ram10  ram13  ram2   ram5  ram8  sr0
loop2  loop5  ram0   ram11  ram14  ram3   ram6  ram9  sr1
root@ubuntu:/sys/block# cd sr0
root@ubuntu:/sys/block/sr0# ls
alignment_offset  discard_alignment  holders   removable  subsystem
bdi               events             inflight  ro         trace
capability        events_async       power     size       uevent
dev               events_poll_msecs  queue     slaves
device            ext_range          range     stat
root@ubuntu:/sys/block/sr0# cat size 
2097151
root@ubuntu:/sys/block/sr0# cd ..
root@ubuntu:/sys/block# ls -l sda
lrwxrwxrwx 1 root root 0 Jul  4 20:50 sda -> ../devices/pci0000:00/0000:00:10.0/host32/target32:0:0/32:0:0:0/block/sda
root@ubuntu:/sys/block# ls -l sr0
lrwxrwxrwx 1 root root 0 Aug  2 00:03 sr0 -> ../devices/pci0000:00/0000:00:11.0/0000:02:05.0/ata3/host2/target2:0:0/2:0:0:0/block/sr0
root@ubuntu:/sys/block# ls -l sr1
lrwxrwxrwx 1 root root 0 Aug  2 00:03 sr1 -> ../devices/pci0000:00/0000:00:11.0/0000:02:05.0/ata4/host3/target3:0:0/3:0:0:0/block/sr1
root@ubuntu:/sys/block# ls -l ram1
lrwxrwxrwx 1 root root 0 Aug  2 00:03 ram1 -> ../devices/virtual/block/ram1
root@ubuntu:/sys/block# ls -l loop1
lrwxrwxrwx 1 root root 0 Aug  2 00:03 loop1 -> ../devices/virtual/block/loop1
root@ubuntu:/sys/block#

3、bus目录

在内核注册的每条总线,在该目录下对应一个子目录,比如i2c、spi、pci、scsi、usb等等。

root@ubuntu:/sys/bus# ls
ac97         cpu           hid           mdio_bus     platform  sdio   virtio
acpi         eisa          i2c           mmc          pnp       serio  workqueue
clockevents  event_source  isa           pci          rapidio   spi    xen
clocksource  gameport      machinecheck  pci_express  scsi      usb    xen-backend

 4、devices目录

包含系统的所有设备。

root@ubuntu:/sys/devices# ls
breakpoint  isa          pci0000:00  pnp0  rapidio   system      virtual
cpu         LNXSYSTM:00  platform    pnp1  software  tracepoint

5、fs目录

描述系统中的文件系统。

6、filewire目录

描述系统中的固件。

7、power目录

描述系统中的电源选项。

8、module目录

描述系统中的模块信息。

9、kernel目录

内核中的配置参数。

三.sys文件系统搭建

sys文件系统的搭建流程,左边是初始化流程,右边是sys的文件目录:

四.添加一个sys节点 

以ch423为例子,在sys/misc下面添加一个ch423的节点。

#include <linux/miscdevice.h>
#include <linux/cdev.h>
#include <linux/device.h>
#include <linux/fs.h>
#include <linux/i2c-dev.h>
#include <linux/i2c.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/notifier.h>
#include <linux/slab.h>
#include <linux/uaccess.h>
#include <linux/compat.h>
#include <linux/printk.h>
#include <linux/kobject.h>
#include <linux/version.h>
#include <linux/kthread.h>
#include <linux/gpio.h>
#include <linux/of_gpio.h>
#include <linux/of.h>
#include <linux/of_device.h>
#include <linux/platform_device.h>

struct ch423_dev {
    struct device *dev;
    struct device sys_dev;
    struct gpio_desc *ch423_clk;
    struct gpio_desc *ch423_dat;
};

struct ch423_dev *g_ch423;
struct ch423_dev *ch423;

static ssize_t ch423_gpio_oc_l_read(struct device *dev,
                      struct device_attribute *attr, char *buf)
{

    return sprintf(buf, "%lx\n",CH423_OC_L_STATUS);
}

static ssize_t ch423_gpio_oc_l_write(struct device *dev,
                       struct device_attribute *attr,
                       const char *buf, size_t count)
{
    return count;
}

static DEVICE_ATTR(ch423_gpio_oc_l, 0644,
        ch423_gpio_oc_l_read, ch423_gpio_oc_l_write);


static const struct file_operations ch423_fops = {
    .owner = THIS_MODULE,
    .read = ch423_read,
    .write = ch423_write,
    .unlocked_ioctl = ch423_ioctl,
};

struct miscdevice ch423_miscdev = {
    .minor = MISC_DYNAMIC_MINOR,
    .name = "ch423_dev",
    .fops = &ch423_fops,
};

static int ch423_probe(struct platform_device *pdev)
{
    struct ch423_dev *ch423;
    int ret = 0;

    ch423 = devm_kzalloc(&pdev->dev, sizeof(*ch423), GFP_KERNEL);
    if (!ch423)
        return -ENOMEM;

    ch423->dev = &pdev->dev;

    ch423->ch423_clk = devm_gpiod_get_optional(ch423->dev,
                             "ch423-clk", GPIOD_OUT_HIGH);
    if (IS_ERR(ch423->ch423_clk)) {
        dev_warn(ch423->dev, "Could not get ch423-clk!\n");
        ch423->ch423_clk = NULL;
    }

    ch423->ch423_dat = devm_gpiod_get_optional(ch423->dev,
                             "ch423-dat", GPIOD_OUT_HIGH);
    if (IS_ERR(ch423->ch423_dat)) {
        dev_warn(ch423->dev, "Could not get ch423-clk!\n");
        ch423->ch423_dat = NULL;
    }
    g_ch423 = ch423;

    ret = misc_register(&ch423_miscdev);
    if (ret) {
        ERR("ch423_miscdev ERROR: could not register ch423_miscdev device\n");
        return ret;
    }

    ret = device_create_file(ch423_miscdev.this_device,
                &dev_attr_ch423_gpio_oc_l);
    if (ret) {
        dev_err(ch423->dev, "failed to create attr ch423_gpio_oc_l!\n");
        return ret;
    }
    return 0;
}

static int ch423_remove(struct platform_device *client)
{
    kfree(ch423);

    return 0;
}

static const struct of_device_id ch423_of_match[] = {
    { .compatible = "ch423" },
    {}
};
MODULE_DEVICE_TABLE(of, ch423_of_match);

static struct platform_driver ch423_driver = {
    .probe = ch423_probe,
    .remove = ch423_remove,
    .driver = {
        .owner = THIS_MODULE,
        .name = DRIVER_NAME,
        .of_match_table = of_match_ptr(ch423_of_match),
    },
};

module_platform_driver(ch423_driver);


MODULE_DESCRIPTION("CH423 GPIO Switch");
MODULE_AUTHOR("Zewei Ye <yezw@ist.com.hk>");
MODULE_LICENSE("GPL v2");

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1144217.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【100天精通Python】Day72:Python可视化_一文掌握Seaborn库的使用《二》_分类数据可视化,线性模型和参数拟合的可视化,示例+代码

目录 1. 分类数据的可视化 1.1 类别散点图&#xff08;Categorical Scatter Plot&#xff09; 1.2 类别分布图&#xff08;Categorical Distribution Plot&#xff09; 1.3 类别估计图&#xff08;Categorical Estimate Plot&#xff09; 1.4 类别单变量图&#xff08;Cat…

《C和指针》笔记35:结构体

本文整理一下结构体的相关知识&#xff0c;记录是为了更好地加深理解。 1. 结构体声明 下面两个声明语句&#xff1a; struct {int a;char b;float c; } x;struct {int a;char b;float c; } y[20], *z;这两个声明被编译器当作两种截然不同的类型&#xff0c;即使它们的成员列…

数字电路与逻辑设计 之 组合电路的设计(多输出电路,全加器,乘法器)

一些例子 多输出的电路设计 全加器 我们尝试不去弄到最简 乘法器 要分析有几个输入&#xff0c;几个输出

代码签名证书续费

代码签名证书的有效周期是1-3年&#xff0c;这种情况下证书到期了就要重新申请办理&#xff0c;最开始同样的申请验证步骤还要再走一遍&#xff0c;尤其是Ukey还是要CA机构重新颁发&#xff0c;还是要等待快递配送。OV代码签名证书、EV代码签名证书目前行业内统一采取Ukey存储&…

链动2+1全新9.0版本 无限链动收益

一个平台能否长期存活取决于它是否有一个支撑其持续发展的商业模式。蜂群精选深谙用户心理&#xff0c;对链动21模式进行改造&#xff0c;创新出一种同时具备裂变能力和高效吸引用户留存的新玩法。 链动21模式在整个架构上都是完整的&#xff0c;可以说是一个非常出色的营销模式…

【JAVA】我们该如何规避代码中可能出现的错误?(三)

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️初识JAVA】 文章目录 前言throws/throw 关键字throw 关键字throws 关键字 finally关键字 前言 异常是程序中的一些错误&#xff0c;但并不是所有的错误都是异常&#xff0c;并且错误00有时候是可以避…

统计学习方法 决策树

文章目录 统计学习方法 决策树决策树模型与学习特征选择决策树的生成ID3 算法C4.5 的生成算法 决策树的剪枝CART 算法CART 回归树的生成CART 分类树的生成CART 剪枝 统计学习方法 决策树 阅读李航的《统计学习方法》时&#xff0c;关于决策树的笔记。 决策树模型与学习 决策…

C++学习笔记之四(标准库、标准模板库、vector类)

C 1、C标准库2、C标准模板库2.1、vector2.1.1、vector与array2.1.2、vector与函数对象2.1.3、vector与迭代器2.1.4、vector与算法 1、C标准库 C C C标准库指的是标准程序库( S t a n d a r d Standard Standard L i b a r a y Libaray Libaray)&#xff0c;它定义了十个大类…

编码,解码

一.标准ASCll字符集 标准ASCll 字符集使用一个字节存储一个字符&#xff0c;首尾是0 二.GBK字符集 GBK中一个中文字符编码成两个字节的形式存储&#xff0c;一个英文字母编码成一个字节的形式存储 对于 汉字中夹英文的&#xff0c;GBK规定&#xff1a;汉字的第一个字节的第一位…

MySQL安装多个实例——批处理脚本一键配置MySQL服务

1.下载mysql的免安装压缩包 官网&#xff1a;https://downloads.mysql.com/archives/community/ 2.解压并新增批处理脚本 echo off chcp 65001 setlocal enabledelayedexpansionecho MySQL版本为8.0.34REM 使用set /p命令获取用户输入的端口号 set /p "port请输入端口号…

C++标准模板(STL)- 类型支持 (类型特性,is_pointer,is_lvalue_reference,is_rvalue_reference)

类型特性 类型特性定义一个编译时基于模板的结构&#xff0c;以查询或修改类型的属性。 试图特化定义于 <type_traits> 头文件的模板导致未定义行为&#xff0c;除了 std::common_type 可依照其所描述特化。 定义于<type_traits>头文件的模板可以用不完整类型实…

【git】git使用教程

1、版本管理工具 如果有一个软件能记录我们对文档的所有修改&#xff0c;所有版本&#xff0c;这类软件我们一般叫做版本控制工具。 特性“ 能够记录历史版本&#xff0c;回退历史版本团队开发&#xff0c;方便代码合并 2、版本管理工具介绍 svn、git svn是集中式版本控制…

mac版本 Adobe总是弹窗提示验证问题如何解决

来自&#xff1a; mac软件下载macsc站 mac电脑使用过程中总是弹出Adobe 的弹窗提示&#xff0c;尤其是打开Adobe的软件&#xff0c;更是频繁的弹出提示&#xff1a; Your Adobe app is not genuine. Adobe reserves the right to disable this software after a 0 grace period…

Ubuntu 22.04 开机闪logo后卡在/dev/sda3: clean

环境 Vmware 17.0.0&#xff0c;CPU 2&#xff0c;内存4G&#xff0c;硬盘50G Ubuntu 22.04 问题描述 开机 --> 显示两行代码 --> 显示ubuntu logo --> 左上显示两个代码卡住不动 原因分析 1、网上大多说显卡驱动&#xff0c;最近没安装相关软件&#xff0c;也没…

ARM汇编指令之数据操作指令

数据搬移指令&#xff1a;立即数&#xff1a;在待判断的32位数&#xff08;以十六进制展开&#xff09;中&#xff0c;寻找一个0~255&#xff08;即0x00~0xff&#xff09;之间的数值&#xff0c;然后将这个数值循环右移偶数个位置&#xff0c;可以得到待判断的数&#xff0c;即…

Vue $nextTick

我们用一个例子来说明$nextTick的作用&#xff1a; 我们用一个变量showIpt来控制input框的显示和隐藏&#xff0c;默认是隐藏。 我们点击一个按钮后显示这个输入框的同时&#xff0c;input还要自动获取焦点。 但是我们点击按钮过后并没有生效。 为什么&#xff1f;this.show…

C++标准模板(STL)- 类型支持 (类型特性,is_union,is_class,is_function)

类型特性 类型特性定义一个编译时基于模板的结构&#xff0c;以查询或修改类型的属性。 试图特化定义于 <type_traits> 头文件的模板导致未定义行为&#xff0c;除了 std::common_type 可依照其所描述特化。 定义于<type_traits>头文件的模板可以用不完整类型实例…

Ubuntu中查看电脑有多少个核——lscpu

1. 使用lscpu命令: 打开终端并输入以下命令: lscpu你会看到与CPU相关的详细信息。查找"CPU(s)"这一行来看总的核心数。另外&#xff0c;“Core(s) per socket”表示每个插槽或每个物理CPU的核数&#xff0c;“Socket(s)”表示物理CPU的数量。将这两个值相乘即得到总…

MyBatis开启二级缓存

MyBatis开启二级缓存 前言 MyBatis-Plus&#xff08;简称MP&#xff09;是一个基于MyBatis的增强工具&#xff0c;提供了更便捷的CRUD操作和其他功能。与MyBatis相比&#xff0c;MyBatis-Plus并没有引入自己的缓存机制&#xff0c;而是直接使用了MyBatis的缓存机制。 在MyBati…

【Linux】第五站:Linux权限

文章目录 一、shell命令以及运行原理二、Linux下用户的分类1.root用户和普通用户的切换2.对一条指令的提权 三、什么叫做权限1.权限2.文件的属性3.文件类型4.权限属性 四、更改权限1. chmod 更改文件的属性2. chown 更改拥有者3. chgrp更改所属组4.chown一次性更改拥有者和所属…