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


    一.常见的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文件系统的主要作用,是对系统上的设备与总线进行组织与管理,以形成分级的文件。用户空间可以访问或配置这些文件,进而得知系统状态或者控制系统。

    1. root@ubuntu:/sys# tree -L 1
    2. .
    3. ├── block
    4. ├── bus
    5. ├── class
    6. ├── dev
    7. ├── devices
    8. ├── firmware
    9. ├── fs
    10. ├── hypervisor
    11. ├── kernel
    12. ├── module
    13. └── power

    1.class目录

    将设备按照功能分类。

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

     2、block目录

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

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

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

    1. root@ubuntu:/sys/block# ls
    2. loop0 loop3 loop6 ram1 ram12 ram15 ram4 ram7 sda
    3. loop1 loop4 loop7 ram10 ram13 ram2 ram5 ram8 sr0
    4. loop2 loop5 ram0 ram11 ram14 ram3 ram6 ram9 sr1
    5. root@ubuntu:/sys/block# cd sr0
    6. root@ubuntu:/sys/block/sr0# ls
    7. alignment_offset discard_alignment holders removable subsystem
    8. bdi events inflight ro trace
    9. capability events_async power size uevent
    10. dev events_poll_msecs queue slaves
    11. device ext_range range stat
    12. root@ubuntu:/sys/block/sr0# cat size
    13. 2097151
    14. root@ubuntu:/sys/block/sr0# cd ..
    15. root@ubuntu:/sys/block# ls -l sda
    16. 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
    17. root@ubuntu:/sys/block# ls -l sr0
    18. 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
    19. root@ubuntu:/sys/block# ls -l sr1
    20. 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
    21. root@ubuntu:/sys/block# ls -l ram1
    22. lrwxrwxrwx 1 root root 0 Aug 2 00:03 ram1 -> ../devices/virtual/block/ram1
    23. root@ubuntu:/sys/block# ls -l loop1
    24. lrwxrwxrwx 1 root root 0 Aug 2 00:03 loop1 -> ../devices/virtual/block/loop1
    25. root@ubuntu:/sys/block#

    3、bus目录

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

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

     4、devices目录

    包含系统的所有设备。

    1. root@ubuntu:/sys/devices# ls
    2. breakpoint isa pci0000:00 pnp0 rapidio system virtual
    3. 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的节点。

    1. #include <linux/miscdevice.h>
    2. #include <linux/cdev.h>
    3. #include <linux/device.h>
    4. #include <linux/fs.h>
    5. #include <linux/i2c-dev.h>
    6. #include <linux/i2c.h>
    7. #include <linux/init.h>
    8. #include <linux/kernel.h>
    9. #include <linux/module.h>
    10. #include <linux/notifier.h>
    11. #include <linux/slab.h>
    12. #include <linux/uaccess.h>
    13. #include <linux/compat.h>
    14. #include <linux/printk.h>
    15. #include <linux/kobject.h>
    16. #include <linux/version.h>
    17. #include <linux/kthread.h>
    18. #include <linux/gpio.h>
    19. #include <linux/of_gpio.h>
    20. #include <linux/of.h>
    21. #include <linux/of_device.h>
    22. #include <linux/platform_device.h>
    23. struct ch423_dev {
    24. struct device *dev;
    25. struct device sys_dev;
    26. struct gpio_desc *ch423_clk;
    27. struct gpio_desc *ch423_dat;
    28. };
    29. struct ch423_dev *g_ch423;
    30. struct ch423_dev *ch423;
    31. static ssize_t ch423_gpio_oc_l_read(struct device *dev,
    32. struct device_attribute *attr, char *buf)
    33. {
    34. return sprintf(buf, "%lx\n",CH423_OC_L_STATUS);
    35. }
    36. static ssize_t ch423_gpio_oc_l_write(struct device *dev,
    37. struct device_attribute *attr,
    38. const char *buf, size_t count)
    39. {
    40. return count;
    41. }
    42. static DEVICE_ATTR(ch423_gpio_oc_l, 0644,
    43. ch423_gpio_oc_l_read, ch423_gpio_oc_l_write);
    44. static const struct file_operations ch423_fops = {
    45. .owner = THIS_MODULE,
    46. .read = ch423_read,
    47. .write = ch423_write,
    48. .unlocked_ioctl = ch423_ioctl,
    49. };
    50. struct miscdevice ch423_miscdev = {
    51. .minor = MISC_DYNAMIC_MINOR,
    52. .name = "ch423_dev",
    53. .fops = &ch423_fops,
    54. };
    55. static int ch423_probe(struct platform_device *pdev)
    56. {
    57. struct ch423_dev *ch423;
    58. int ret = 0;
    59. ch423 = devm_kzalloc(&pdev->dev, sizeof(*ch423), GFP_KERNEL);
    60. if (!ch423)
    61. return -ENOMEM;
    62. ch423->dev = &pdev->dev;
    63. ch423->ch423_clk = devm_gpiod_get_optional(ch423->dev,
    64. "ch423-clk", GPIOD_OUT_HIGH);
    65. if (IS_ERR(ch423->ch423_clk)) {
    66. dev_warn(ch423->dev, "Could not get ch423-clk!\n");
    67. ch423->ch423_clk = NULL;
    68. }
    69. ch423->ch423_dat = devm_gpiod_get_optional(ch423->dev,
    70. "ch423-dat", GPIOD_OUT_HIGH);
    71. if (IS_ERR(ch423->ch423_dat)) {
    72. dev_warn(ch423->dev, "Could not get ch423-clk!\n");
    73. ch423->ch423_dat = NULL;
    74. }
    75. g_ch423 = ch423;
    76. ret = misc_register(&ch423_miscdev);
    77. if (ret) {
    78. ERR("ch423_miscdev ERROR: could not register ch423_miscdev device\n");
    79. return ret;
    80. }
    81. ret = device_create_file(ch423_miscdev.this_device,
    82. &dev_attr_ch423_gpio_oc_l);
    83. if (ret) {
    84. dev_err(ch423->dev, "failed to create attr ch423_gpio_oc_l!\n");
    85. return ret;
    86. }
    87. return 0;
    88. }
    89. static int ch423_remove(struct platform_device *client)
    90. {
    91. kfree(ch423);
    92. return 0;
    93. }
    94. static const struct of_device_id ch423_of_match[] = {
    95. { .compatible = "ch423" },
    96. {}
    97. };
    98. MODULE_DEVICE_TABLE(of, ch423_of_match);
    99. static struct platform_driver ch423_driver = {
    100. .probe = ch423_probe,
    101. .remove = ch423_remove,
    102. .driver = {
    103. .owner = THIS_MODULE,
    104. .name = DRIVER_NAME,
    105. .of_match_table = of_match_ptr(ch423_of_match),
    106. },
    107. };
    108. module_platform_driver(ch423_driver);
    109. MODULE_DESCRIPTION("CH423 GPIO Switch");
    110. MODULE_AUTHOR("Zewei Ye ");
    111. MODULE_LICENSE("GPL v2");

  • 相关阅读:
    10.10c++作业
    OpenTelemetry 深度定制:跨服务追踪的实战技巧
    vue3导出表格excel(支持多sheet页),并自定义导出样式
    微信每日早安推送 Windows版
    Linux中Locate命令查找不全
    6.2、Flink数据写入到Kafka
    gdb调试时怎样进入C/C++标准库
    YOLOv8/5不显示FLPOs
    【C++】C / C++ 内存管理
    java计算机毕业设计青岛地区常见昆虫图鉴与论坛源码+数据库+系统+lw文档+mybatis+运行部署
  • 原文地址:https://blog.csdn.net/weixin_49303682/article/details/131198472