您的位置:首页 > 其它

使用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

........

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: