Table of Contents
sysfs interface creation " >sysfs interface creation
完整例子 " >完整例子
Home Operation and Maintenance Linux Operation and Maintenance Linux driver | Create sysfs interface in driver

Linux driver | Create sysfs interface in driver

Aug 01, 2023 pm 03:28 PM
linux

Preface

In some Linux development boards, you can often see the echo method. Directly control the hardware or modify the driver, for example:

//灯灭
echo 0 >/sys/class/leds/firefly:blue:power/brightness 
//灯亮
echo 1 >/sys/class/leds/firefly:blue:power/brightness

How to do this?

Actually, this is because the sysfs interface is provided in the driver for users to use, so that users can use the cat or echo command to View and modify the values ​​of certain variables in the driver.

The following describes how to create a sysfs interface in the driver.

sysfs interface creation

Basic steps:

1. UseDEVICE_ATTRDeclare a sys node

static DEVICE_ATTR(led_status, 0600, led_status_show, led_status_store);

led_status: The node name displayed in the sys interface

0600:表示操作这个led_status节点的权限

led_status_show:使用cat命令查看sys接口时调用的函数

led_status_store:使用echo命令往sys接口写入内容时调用的函数

2、完成sys节点的读写函数

static unsigned int led = 0;
/*
*  sys节点的读函数
*  执行 cat /sys/devices/platform/leds/led_status时会调用
*/
static ssize_t led_status_show(struct device *dev, struct device_attribute *attr, char *buf)
{
  //buf是通过cat命令显示到终端的内容,这里显示led变量
 return sprintf(buf, "%s:%d.\n", "led", led);
}

/**
*  sys节点的写函数
*  用echo命令往sys节点写入内容时,会调用该函数
*/
static ssize_t led_status_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
{
  //写入的内容会存放到buf中,这里将buf内容赋值给led变量
 sscanf(buf, "%d", &led);

 return count;
}

示例中,led_status_show()函数和led_status_store()函数的作用分为打印led变量的值修改led变量的值.

3、定义struct attributestruct attribute_group数组

static struct attribute *led_attributes[]={
 
  /*上述使用了DEVICE_ATTR声明节点名字为led_status,
  * 则struct attribute名字应为:
  *  dev_attr_ + (节点名) + .attr
  * 所以名字为dev_attr_led_status.attr
  */
  &dev_attr_led_status.attr,
 NULL,
};


static const struct attribute_group led_attrs={
 .attrs = led_attributes,//引用上述struct attribute数组
};

上述使用了DEVICE_ATTR声明节点名字为led_status, 则struct attribute名字应为:dev_attr_ + (节点名) + .attr。所以名字为dev_attr_led_status.attr

4、在probe函数中调用sysfs_create_group()函数注册sysfs接口

完整例子

设备树:

 leds:leds{
  compatible = "xx,xx-led";
 };

驱动:

static unsigned int led = 0;

static ssize_t led_status_show(struct device *dev, struct device_attribute *attr, char *buf)
{
 return sprintf(buf, "%s:%d.\n", "led", led);
}

static ssize_t led_status_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
{
 sscanf(buf, "%d", &led);

 return count;
}

static DEVICE_ATTR(led_status, 0600, led_status_show, led_status_store);

static struct attribute *led_attributes[]={
 &dev_attr_led_status.attr,
 NULL,
};


static const struct attribute_group led_attrs={
 .attrs = led_attributes,
};

static int xx_led_probe(struct platform_device *pdev)
{
 sysfs_create_group(&pdev->dev.kobj, &led_attrs);
 return 0;
}

static int xx_led_remove(struct platform_device *pdev)
{
 sysfs_remove_group(&pdev->dev.kobj, &led_attrs);
 return 0;
}

static const struct of_device_id xx_led_of_match[] = {
 {.compatible = "xx,xx-led"},
};


static struct platform_driver xx_led_driver = {
 .probe = xx_led_probe,
 .remove = xx_led_remove,
 .driver = {
  .name = "xx-led",
  .owner = THIS_MODULE,
  .of_match_table = xx_led_of_match,
 },
};

static int __init xx_led_init(void)
{
 return platform_driver_register(&xx_led_driver );
}

static void __exit xx_led_exit(void)
{
 platform_driver_unregister(&xx_led_driver);
}

module_init(xx_led_init);
module_exit(xx_led_exit);

MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("xx led driver");
MODULE_AUTHOR("Vincent");
MODULE_VERSION("V1.0.00");

驱动加载后,就可以在linux终端中,使用catecho命令来查看和修改驱动中led变量的值。例如:

//查看led变量的值
cat /sys/devices/platform/leds/led_status
led:0.

//修改led变量的值为9
echo 9 > /sys/devices/platform/leds/led_status
//查看
cat /sys/devices/platform/leds/led_status
led:9.

The above is the detailed content of Linux driver | Create sysfs interface in driver. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undress AI Tool

Undress AI Tool

Undress images for free

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

How to install software on Linux using the terminal? How to install software on Linux using the terminal? Aug 02, 2025 pm 12:58 PM

There are three main ways to install software on Linux: 1. Use a package manager, such as apt, dnf or pacman, and then execute the install command after updating the source, such as sudoaptininstallcurl; 2. For .deb or .rpm files, use dpkg or rpm commands to install, and repair dependencies when needed; 3. Use snap or flatpak to install applications across platforms, such as sudosnapinstall software name, which is suitable for users who are pursuing version updates. It is recommended to use the system's own package manager for better compatibility and performance.

The Ultimate Guide to High-Performance Gaming on Linux The Ultimate Guide to High-Performance Gaming on Linux Aug 03, 2025 am 05:51 AM

ChoosePop!_OS,Ubuntu,NobaraLinux,orArchLinuxforoptimalgamingperformancewithminimaloverhead.2.InstallofficialNVIDIAproprietarydriversforNVIDIAGPUs,ensureup-to-dateMesaandkernelversionsforAMDandIntelGPUs.3.EnabletheperformanceCPUgovernor,usealow-latenc

What are the main pros and cons of Linux vs. Windows? What are the main pros and cons of Linux vs. Windows? Aug 03, 2025 am 02:56 AM

Linux is suitable for old hardware, has high security and is customizable, but has weak software compatibility; Windows software is rich and easy to use, but has high resource utilization. 1. In terms of performance, Linux is lightweight and efficient, suitable for old devices; Windows has high hardware requirements. 2. In terms of software, Windows has wider compatibility, especially professional tools and games; Linux needs to use tools to run some software. 3. In terms of security, Linux permission management is stricter and updates are convenient; although Windows is protected, it is still vulnerable to attacks. 4. In terms of difficulty of use, the Linux learning curve is steep; Windows operation is intuitive. Choose according to requirements: choose Linux with performance and security, and choose Windows with compatibility and ease of use.

Understanding RAID Configurations on a Linux Server Understanding RAID Configurations on a Linux Server Aug 05, 2025 am 11:50 AM

RAIDimprovesstorageperformanceandreliabilityonLinuxserversthroughvariousconfigurations;RAID0offersspeedbutnoredundancy;RAID1providesmirroringforcriticaldatawith50�pacityloss;RAID5supportssingle-drivefailuretoleranceusingparityandrequiresatleastthre

Linux how to enable and disable services at boot Linux how to enable and disable services at boot Aug 08, 2025 am 10:23 AM

To manage the startup of Linux services, use the systemctl command. 1. Check the service status: systemctlstatus can check whether the service is running, enabled or disabled. 2. Enable the service startup: sudosystemctlenable, such as sudosystemctlenablenginx. If it is started at the same time, use sudosystemctlenable--nownginx. 3. Disable the service startup: sudosystemctldisable, such as sudosystemctldisablecups. If it is stopped at the same time, use sudosystemctldisabl

Linux how to list all running processes Linux how to list all running processes Aug 08, 2025 am 06:42 AM

Usepsauxforacompletesnapshotofallrunningprocesses,showingdetailedinformationlikeUSER,PID,CPU,andmemoryusage.2.Usetoporhtopforreal-timemonitoringofprocesseswithdynamicupdates,wherehtopoffersamoreintuitiveinterface.3.UsepgreporpidoftoquicklyfindthePIDs

How to clean up your Linux system How to clean up your Linux system Aug 22, 2025 am 07:42 AM

Removeunusedpackagesanddependencieswithsudoaptautoremove,cleanpackagecacheusingsudoaptcleanorautoclean,andremoveoldkernelsviasudoaptautoremove--purge.2.Clearsystemlogswithsudojournalctl--vacuum-time=7d,deletearchivedlogsin/var/log,andempty/tmpand/var

Linux how to view the contents of a file Linux how to view the contents of a file Aug 19, 2025 pm 06:44 PM

ToviewfilecontentsinLinux,usedifferentcommandsbasedonyourneeds:1.Forsmallfiles,usecattodisplaytheentirecontentatonce,withcat-ntoshowlinenumbers.2.Forlargefiles,uselesstoscrollpagebypageorlinebyline,searchwith/search_term,andquitwithq.3.Usemoreforbasi

See all articles