使用attr高效调试驱动
2013-08-10 10:52
225 查看
//XXX.h文件中
struct kobject *XXX_kobj;
#define XXX_attr(_name) \
static struct kobj_attribute _name##_attr = { \
.attr = { \
.name = __stringify(_name), \
.mode = 0644, \
}, \
.show = _name##_show, \
.store = _name##_store, \
}
//XXX.c文件中
//state_show是驱动调试的读函数
//buf是调试的数据交互口当执行:cat state 时buf中的数据就会补读出来,
static ssize_t state_show(struct kobject *kobj, struct kobj_attribute *attr,
char *buf)
{
char *s = buf;
#ifdef CONFIG_SUSPEND
int i;
for (i = 0; i < PM_SUSPEND_MAX; i++) {
if (pm_states[i] && valid_state(i))
s += sprintf(s,"%s ", pm_states[i]);
}
#endif
#ifdef CONFIG_HIBERNATION
s += sprintf(s, "%s\n", "disk");
#else
if (s != buf)
/* convert the last space to a newline */
*(s-1) = '\n';
#endif
return (s - buf);
}
//state_store是驱动调试的写函数
//buf是调试的数据交互口当执行:echo mm > state 时buf中的数据就是mm,然后驱动就可以对buf中的数据进行使用
static ssize_t state_store(struct kobject *kobj, struct kobj_attribute *attr,
const char *buf, size_t n)
{
suspend_state_t state;
int error;
error = pm_autosleep_lock();
if (error)
return error;
if (pm_autosleep_state() > PM_SUSPEND_ON) {
error = -EBUSY;
goto out;
}
state = decode_state(buf, n);
if (state < PM_SUSPEND_MAX)
error = pm_suspend(state);
else if (state == PM_SUSPEND_MAX)
error = hibernate();
else
error = -EINVAL;
out:
pm_autosleep_unlock();
return error ? error : n;
}
XXX_attr(state);
static struct attribute * g[] = {
&state_attr.attr,
NULL,
};
static struct attribute_group attr_group = {
.attrs = g,
};
static int __init XXX_init(void)//驱动init函数
{
.
.
.
//创建arrt过程
XXX_kobj = kobject_create_and_add("XXXX", NULL);
if (!XXX_kobj)
return -ENOMEM;
error = sysfs_create_group(power_kobj, &attr_group);
if (error)
return error;
//end
........
}
struct kobject *XXX_kobj;
#define XXX_attr(_name) \
static struct kobj_attribute _name##_attr = { \
.attr = { \
.name = __stringify(_name), \
.mode = 0644, \
}, \
.show = _name##_show, \
.store = _name##_store, \
}
//XXX.c文件中
//state_show是驱动调试的读函数
//buf是调试的数据交互口当执行:cat state 时buf中的数据就会补读出来,
static ssize_t state_show(struct kobject *kobj, struct kobj_attribute *attr,
char *buf)
{
char *s = buf;
#ifdef CONFIG_SUSPEND
int i;
for (i = 0; i < PM_SUSPEND_MAX; i++) {
if (pm_states[i] && valid_state(i))
s += sprintf(s,"%s ", pm_states[i]);
}
#endif
#ifdef CONFIG_HIBERNATION
s += sprintf(s, "%s\n", "disk");
#else
if (s != buf)
/* convert the last space to a newline */
*(s-1) = '\n';
#endif
return (s - buf);
}
//state_store是驱动调试的写函数
//buf是调试的数据交互口当执行:echo mm > state 时buf中的数据就是mm,然后驱动就可以对buf中的数据进行使用
static ssize_t state_store(struct kobject *kobj, struct kobj_attribute *attr,
const char *buf, size_t n)
{
suspend_state_t state;
int error;
error = pm_autosleep_lock();
if (error)
return error;
if (pm_autosleep_state() > PM_SUSPEND_ON) {
error = -EBUSY;
goto out;
}
state = decode_state(buf, n);
if (state < PM_SUSPEND_MAX)
error = pm_suspend(state);
else if (state == PM_SUSPEND_MAX)
error = hibernate();
else
error = -EINVAL;
out:
pm_autosleep_unlock();
return error ? error : n;
}
XXX_attr(state);
static struct attribute * g[] = {
&state_attr.attr,
NULL,
};
static struct attribute_group attr_group = {
.attrs = g,
};
static int __init XXX_init(void)//驱动init函数
{
.
.
.
//创建arrt过程
XXX_kobj = kobject_create_and_add("XXXX", NULL);
if (!XXX_kobj)
return -ENOMEM;
error = sysfs_create_group(power_kobj, &attr_group);
if (error)
return error;
//end
........
}
相关文章推荐
- Linux驱动调试的Debugfs的使用简介
- Linux驱动调试中的Debugfs的使用简介
- SylixOS 驱动调试软件使用说明
- 扬长避短使用Windbg和Visual Studio高效调试调试你的代码
- JLINK 驱动安装和配置ADS使用,ADX调试
- linux debug fs (2)----Linux驱动调试的Debugfs的使用简介
- Windows Mobile中使用WinCE驱动调试助手的小技巧
- android底层驱动学习之调试驱动DEVICE_ATTR的原理及用法
- 使用objdump调试驱动
- 使用cli(命令行)方式执行php程序进行高效的程序调试
- Android/Linux驱动开发之使用dev_dbg调试设备驱动
- 使用VS2005搭建典型高效的SharePoint开发环境,提高生产效率,包含远程调试,自动部署
- Android/Linux驱动开发之使用dev_dbg调试设备驱动
- 【驱动调试】SoftICE 使用说明
- Linux驱动调试中的Debugfs的使用简介
- 扬长避短使用Windbg和Visual Studio高效调试调试你的代码
- SylixOS 驱动调试软件使用说明
- 使用objdump调试驱动
- Linux驱动开发之使用dev_dbg调试设备驱动
- 使用OkHttp高效开发调试