• 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");

  • 相关阅读:
    11.23 - 每日一题 - 408
    [计算机提升] Windows系统权限
    第五章-项目范围管理
    苹果使用3D打印技术制造Apple Watch Series 9手表外壳
    前端工程化之模块化基础
    opencv人与摄像头距离检测
    DBSCAN聚类算法实用案例
    机器学习笔记之支持向量机(一)模型构建思路
    【MATLAB】制作一幅钻石沿着圆周运动的动画
    Java架构师内功数据库
  • 原文地址:https://blog.csdn.net/weixin_49303682/article/details/131198472