Linux class 接口的使用

来源:互联网 发布:win7网络打印机找不到 编辑:程序博客网 时间:2024/05/29 16:18
//Linux class 类接口必要的头文件:#include <linux/device.h>static ssize_t dvb_widgets_antpower_show(struct class *class, struct class_attribute *attr, char *buf){    int ret;    ret = sprintf(buf, "%s\n", "poweron");    return ret; //show函数需要返回拷贝到用户空间的size,如果为0则用户空间读不到拷贝到buf的内容。}static ssize_t dvb_widgets_antpower_store(struct class *class, struct class_attribute * attr, const char * buf, size_t size){    return size; //store函数不可返回0或负数,否则会一直调用stroe函数   }static ssize_t dvb_widgets_loops_show(struct class *class, struct class_attribute *attr, char *buf){    int ret;    ret = sprintf(buf, "%s\n", "loops");    return ret; //show函数需要返回拷贝到用户空间的size,如果为0则用户空间读不到拷贝到buf的内容。}static ssize_t dvb_widgets_loops_store(struct class *class, struct class_attribute *attr, const char *buf, size_t size){    return size; //store函数不可返回0或负数,否则会一直调用stroe函数   }//定义并赋值class_attributestatic struct class_attribute dvb_widgets_class_attrs[] = {    __ATTR(antpower, S_IRUGO | S_IWUSR,dvb_widgets_antpower_show, dvb_widgets_antpower_store ),    __ATTR(loops, S_IRUGO | S_IWUSR, dvb_widgets_loops_show, dvb_widgets_loops_store),    __ATTR_NULL //一定要以__ATTR_NULL结束class_attribute的赋值,否则在class_register时会报null pointer;};//定义classstatic struct class dvb_widgets_class = {    .name = "dvb-widget", //class注册成功后会生成接点“/sys/class/dvb-widget”    .class_attrs= dvb_widgets_class_attrs, //class的属性组};//一般在设置驱动的probe函数里注册classif(class_register(&dvb_widgets_class )<0) { //注册class.  pr_error("register class error\n");}//一般在remove函数里注销classclass_unregister(&dvb_widgets_class ); //注销class//本例class注册成功会生成如下两个节点//  /sys/class/dvb-widget/antpower//  /sys/class/dvb-widget/loops// echo xx > /sys/class/dvb-widget/antpower 会调用dvb_widgets_antpower_store// cat /sys/class/dvb-widget/antpower 会调用dvb_widgets_antpower_show
原创粉丝点击