DEVICE_ATTR demo简单使用(实用)

本文深入解析Linux内核中的DEVICE_ATTR宏,介绍其在sysfs文件系统中创建设备节点的作用,包括如何定义读写函数,并通过具体示例展示了如何在探针函数中使用device_create_file来创建sysfs节点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. DEVICE_ATTR 创建设备节点,可以write/read信息,操作gpio等,很实用.

参考官方文档:documentation/driver-model/Device.txt

先看看DEVICE_ATTR的原型:
DEVICE_ATTR(_name, _mode, _show, _store)
_name:名称,也就是将在sys fs中生成的文件名称。
_mode:上述文件的访问权限,与普通文件相同,UGO的格式。
_show:显示函数,cat该文件时,此函数被调用
_store:写函数,echo内容到该文件时,此函数被调用

2. DEVICE_ATTR函数原型(include/linux/device.h)

#define DEVICE_ATTR(_name, _mode, _show, _store) \
      struct device_attribute dev_attr_##_name = __ATTR(_name, _mode, _show, _store)
 /* interface for exporting device attributes */      
  struct device_attribute {                            
      struct attribute    attr;                        
      ssize_t (*show)(struct device *dev, struct device_attribute *attr,
              char *buf);                              
      ssize_t (*store)(struct device *dev, struct device_attribute *attr,                                                                                                                                        
               const char *buf, size_t count);         
  };     

3 . 主要修改show,store两个函数

static DEVICE_ATTR(camera1, S_IRUGO | S_IWUSR, my_show_camera1, my_store_camera1);

注意:  my_store_camera1:

return count,一般count大小就是一个PAGE_SIZE。 如果这个函数 return 0,这个store函数将被无限循环调用导致系统crash

static ssize_t my_store_camera1(struct device* cd, struct device_attribute *attr,
const char* buf, size_t len){
return len;
}

static ssize_t my_show_camera1(struct device* cd,struct device_attribute *attr, char* buf){
ssize_t ret = 0;
if (tc_camera_id1 == 1){
	sprintf(buf, "imx577\n");
} else{
	sprintf(buf, "find not camera\n");
}

ret = strlen(buf) + 1;

return ret;
}
static DEVICE_ATTR(camera1, S_IRUGO | S_IWUSR, my_show_camera1, my_store_camera1);

4.device_create_file

static int my_create_sysfs(struct platform_device *client){
struct device *dev = &(client->dev);

     int err = 0;

if ((err = device_create_file(dev, &dev_attr_camera1))){

goto err_out;
}

return 0;

err_out:

return err;

}

5. 在对应的probe里面加入device_create_file的调用即可

 static int cam_req_mgr_probe(struct platform_device *pdev){

....

    my_create_sysfs(pdev);

....

}

Linux下的背光控制驱动通常是一个内核模块,它允许操作系统管理计算机显示器的亮度。一个简单的示例驱动可能涉及以下几个步骤: 1. **结构声明**: 首先,创建一个数据结构来存储有关背光的信息,如当前亮度值和状态。 ```c struct backlight_device { struct device dev; int brightness; /* 当前亮度 */ u8 max_brightness; /* 最大亮度 */ struct mutex lock; /* 保护数据访问 */ }; ``` 2. **初始化函数**: 在`driver_init()`中注册设备,并初始化数据结构。 ```c static int __init backlight_driver_init(void) { struct backlight_device *backlight = ...; backlight->dev.parent = &platform_device.dev; backlight_create(&backlight->dev, "backlight", &platform_device); // 设置初始亮度等 return 0; } ``` 3. **操作函数**: 添加方法来设置亮度、读取亮度以及处理用户空间请求。 ```c static ssize_t backlight_set_brightness(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { int brightness; if (kstrtoint(buf, 10, &brightness)) return -EINVAL; mutex_lock(&backlight->lock); backlight->brightness = min(brightness, backlight->max_brightness); // 调整硬件实际亮度 mutex_unlock(&backlight->lock); return count; } static ssize_t backlight_show_brightness(struct device *dev, struct device_attribute *attr, char *buf) { return sprintf(buf, "%d\n", backlight->brightness); } ``` 4. **sysfs支持**: 创建sysfs目录以便用户空间可以动态调整亮度,添加文件描述符属性。 ```c static DEVICE_ATTR(backlight_brightness, S_IWUSR | S_IRUGO, backlight_show_brightness, backlight_set_brightness); ``` 5. **加载和卸载**: 编写`module_init()`和`module_exit()`函数,分别用于驱动加载和卸载时的行为。 ```c static void __exit backlight_driver_exit(void) { backlight_destroy(&backlight->dev); } late_initcall(backlight_driver_init); /* 在系统启动后期运行 */ module_exit(backlight_driver_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("Your Name"); MODULE_DESCRIPTION("Simple Linux Backlight Driver Demo"); ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值