日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

前言

在一些linux開發板中,經常可以看到通過echo的方式來直接控制硬件或者修改驅動,例如:

//燈滅
echo 0 >/sys/class/leds/firefly:blue:power/brightness 
//燈亮
echo 1 >/sys/class/leds/firefly:blue:power/brightness

登錄后復制

這是怎么做到呢?

實際上,這是因為在驅動中提供了sysfs接口給用戶使用,使得用戶可以通過cat或者echo命令來查看和修改驅動中某些變量的值。

下面介紹驅動中創建sysfs接口的方法。

sysfs接口創建

基本步驟:

1、使用DEVICE_ATTR聲明一個sys節點

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

登錄后復制

led_status:在sys接口中顯示的節點名字

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.

登錄后復制

以上就是Linux驅動 | 在驅動中創建sysfs接口的詳細內容,更多請關注www.92cms.cn其它相關文章!

分享到:
標簽:Linux sysfs 創建 接口 驅動
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定