在Linux设备驱动程序中,创建sysfs属性probe
过于活泼 - 特别是,它遇到了与用户空间的竞争条件.建议的解决方法是将属性添加到各种默认属性组,以便在探测之前自动创建它们.对于设备驱动程序,struct device_driver
包含const struct attribute_group **groups
此目的.
但是,在Linux 3.11中struct attribute_group
只有二进制属性的字段.对于较旧的内核(特别是3.4),设备驱动程序如何在探测之前创建sysfs二进制属性?
我正在学习如何在我的Linux模块中使用sysfs,但我最难找到有关这些主题的当前文档.我一直在使用的Linux设备驱动程序第3版书似乎在这个领域相当过时(例如,class_device
在当前的Linux版本中,结构似乎完全消失了).
我只是试图在我的模块的相应sysfs类下获得一个属性,这将允许我从内核空间读取模块变量的值.
在我的代码中,我创建了一个类,允许udev在/ dev/foo为我的模块创建一个设备节点:
dev_t foo_dev;
alloc_chrdev_region(&foo_dev, 0, 1, "bar");
struct class *bar = class_create(THIS_MODULE, "bar");
device_create(bar, NULL, foo_dev, NULL, "foo");
struct cdev foo_dev_file;
cdev_init(&foo_dev_file, &fops); /* fops defined earlier */
cdev_add(&foo_dev_file, foo_dev, 1);
Run Code Online (Sandbox Code Playgroud)
当我插入模块时,我得到了一个sysfs类目录,并在/ sys/class/bar/foo /中填充了一些默认属性.如何创建显示在此新目录下的属性?
我相信我的概念非常好 - 创建属性结构,定义sysfs_ops
函数等 - 我的问题是我不知道使用哪个特定的内核结构(class_attribute
?),也不知道如何使这些属性出现在右边sysfs目录.
有人会指点我的教程或文章详细介绍当前Linux内核的过程吗?
我正在编写一个驱动程序来控制一些自定义硬件.
在过去(即15年前),我正在这样做ioctls
,但现在正在挖掘sysfs
作为一种可能的选择.
mutex
驱动程序进行" 保护",以便一次只能有一个应用程序写入.(我确实有一些只读'信息'条目,我希望所有人都可以随时访问这些条目).鉴于上述情况,最好的方法是什么 - ioctl或sysfs?
如果是sysfs,那我该如何实现独占访问?
如果sysfs,那么如果驱动程序没有读/写/ ioctl fops,它是否需要打开/释放?!
(这是一个'私人'司机,所以我不在乎大规模;)但是如果新的方式更适用,那么我可能会抓住它们!)
谢谢.
在Linux中,有没有办法找出插入哪个PCI插槽的PCI卡?
/ sys/bus/pci/devices /包含许多非卡的设备(网桥,CPU通道等),我无法在设备目录中找到有关插槽卡映射的任何信息.
我正在开发一个信息Android应用程序,我想在设备充电时读取以毫安为单位的充电速率.我见过其他可以做到这一点的应用,比如Ampere.
我相信信息应该在目录/sys/class/power_supply/battery
中,这些文件中的哪一个与实现这一点有关,我怎样才能从中计算出mA的充电率?
如何在Android设备中检测电池充电速度?我可以使用以下代码检测电池状态.但不是充电速度.
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_BATTERY_CHANGED);
BatteryChangeReceiver receiver = new BatteryChangeReceiver(subscriber);
registerReceiver(receiver, filter);
public class BatteryChangeReceiver extends BroadcastReceiver {
@Override public void onReceive(Context context, Intent intent) {
// here I get all battery status.
}
}
Run Code Online (Sandbox Code Playgroud)
有一个应用程序(安培)显示充电速度.
我怎样才能做到这一点?
提前致谢.
我有一个我正在使用的嵌入式系统,它目前使用sysfs来控制某些功能.
但是,如果可能的话,我们希望加快功能.
我发现这个子系统也支持和ioctl接口,但在重写代码之前,我决定通过搜索来查看哪个是更快的接口(在ucLinux上):sysfs或ioctl.
有没有人能够很好地理解这两种实现方式,让我粗略地了解每种实现的开销差异?我正在寻找通用信息,例如"ioctl更快,因为你已经从函数调用中删除了文件层".或者"它们大致相同,因为sysfs具有非常简单的界面".
2013年10月24日更新:
我目前正在做的具体情况如下:
int fd = open("/sys/power/state",O_WRONLY);
write( fd, "standby", 7 );
close( fd );
Run Code Online (Sandbox Code Playgroud)
在kernel/power/main.c中,处理此写操作的代码如下所示:
static ssize_t state_store(struct kobject *kobj, struct kobj_attribute *attr,
const char *buf, size_t n)
{
#ifdef CONFIG_SUSPEND
suspend_state_t state = PM_SUSPEND_STANDBY;
const char * const *s;
#endif
char *p;
int len;
int error = -EINVAL;
p = memchr(buf, '\n', n);
len = p ? p - buf : n;
/* First, check if we are requested to hibernate */
if (len == …
Run Code Online (Sandbox Code Playgroud) 我正在制作一个小内核模块,以提供用户空间访问ARMv7芯片的某些内核模式功能(特别是缓存控制).我正在阅读Corbet,Rubini和Hartman的Linux设备驱动程序.在其中,他们描述了如何制作完整的驱动程序+设备+总线.我根本不想创建一个总线驱动程序.事实上,我正在制作的"驱动程序"根本不需要与设备定义匹配 - 它与平台的CPU隐式匹配.任何人都可以向我解释:
/sysfs/modules/mymodule
吗?/sys/devices/platform
似乎也很有希望,也是如此/sys/devices/system/cpu
.kobject
/属性的现有位置,我该如何将其插入?我如何获得必要的kset
?我见过的所有例子都创建了一个kset
然后从它链接到kobject
- 我还没有看到用于请求现有命名的API kset
?很抱歉,如果这显然是不可能的,或者某些地方有一些非常直接且易于发现的例子,我还没有因某些原因而发现.任何人都可以对此有所了解吗?
刚刚开始,我想说明我已经了解Python和其他用于在Raspberry PI上操作GPIO的高级实现.我也一直在使用WiringPI C API并且在Raspbian Jessie上遇到问题,即使我没有更改过一行代码,我还没有使用Raspbian Wheezy.此外,WiringPI C API开发人员表示,他没有立即支持Raspbian Jessie的计划,所以我没有划桨就行了.
出于这个原因,我一直在阅读以下关于使用sysfs访问Raspberry PI GPIO的教程(其中包括),因为这似乎是在不使用WiringPI而不编写我自己的GPIO库的情况下解决GPIO的一种方法:
http://www.hertaville.com/introduction-to-accessing-the-raspberry-pis-gpio-in-c.html
根据本教程,要将GPIO17设置为输入,请将字符串'in'写入文件句柄:
/ SYS /类/ GPIO/GPIO/17 /方向
...然后我可以从以下位置读取GPIO输入值:
/ SYS /类/ GPIO/gpio17 /值
这一切都很好,但我没有选择在我的生产板上装配上拉电阻.是否可以使用sysfs设置Raspberry PI的内置上拉和下拉电阻?
此外,如果通过sysfs设置上拉和下拉电阻是不可能的,我是否正确假设即使在最新的Raspbian Jessie中,唯一的另一种方法是直接写入GPIO寄存器?即使在Raspbian Jessie中也没有用于GPIO编程的官方C API?
我为我们开发的外围设备编写了一个平台驱动程序,并希望向sysfs公开一些配置选项.我已设法使用属性结构(见下文)和sysfs_create_file
探测函数创建适当的文件,但我无法弄清楚如何将show/store函数附加到平台驱动程序中的结构.
我在网上找到的大多数资源使用了一个device_attribute
结构或类似的东西来创建他们的文件,这也适合吗?还有另一种方法可以为平台驱动程序执行此操作吗?
我的属性struct看起来像这样:
struct attribute subkey_attr = {
.name = "subkeys",
.mode = S_IWUGO | S_IRUGO,
};
Run Code Online (Sandbox Code Playgroud)
我使用此调用注册该文件:
riddler_kobject = &pdev->dev.kobj;
ret_val = sysfs_create_file(riddler_kobject, &subkey_attr);
Run Code Online (Sandbox Code Playgroud)