android switch (linux3.0.0)

来源:互联网 发布:人口数据 昆明 编辑:程序博客网 时间:2024/03/29 20:59

1 路径:

   drivers/switch/switch_class.c

   drivers/switch/switch_gpio.c

   include/linux/switch.h


2 代码分析:

113 int switch_dev_register(struct switch_dev *sdev)
114 {
115         int ret;
116 
117         if (!switch_class) {
118                 ret = create_switch_class();
119                 if (ret < 0)
120                         return ret;
121         }
122 
123         sdev->index = atomic_inc_return(&device_count);
124         sdev->dev = device_create(switch_class, NULL,
125                 MKDEV(0, sdev->index), NULL, sdev->name);
126         if (IS_ERR(sdev->dev))
127                 return PTR_ERR(sdev->dev);
128 
129         ret = device_create_file(sdev->dev, &dev_attr_state);
130         if (ret < 0)
131                 goto err_create_file_1;
132         ret = device_create_file(sdev->dev, &dev_attr_name);
133         if (ret < 0)
134                 goto err_create_file_2;
135 
136         dev_set_drvdata(sdev->dev, sdev);
137         sdev->state = 0;
138         return 0;
139 
140 err_create_file_2:
141         device_remove_file(sdev->dev, &dev_attr_state);
142 err_create_file_1:
143         device_destroy(switch_class, MKDEV(0, sdev->index));
144         printk(KERN_ERR "switch: Failed to register driver %s\n", sdev->name);
145 
146         return ret;
147 }

 

具体流程如下:

首先,判断是否已经创建switch_class,如果没有,则创建switch_class,
其次,取得要创建的设备的索引,然后通过device_create创建设备;
最后,通过device_create_file函数在sysfs中分别创建两个entry,如果创建失败,则分别删除已经创建的文件或switch_class,
一个用于输出设备状态,另一个用于输出设备名称name.


其中:dev_attr_state的定义如下:

          57 static DEVICE_ATTR(state, S_IRUGO | S_IWUSR, state_show, NULL);
          58 static DEVICE_ATTR(name, S_IRUGO | S_IWUSR, name_show, NULL);


432 #define DEVICE_ATTR(_name, _mode, _show, _store) \
433 struct device_attribute dev_attr_##_name = __ATTR(_name, _mode, _show, _store)


3  察看设备的名字和状态:

    cat /sys/class/switch/hdmi/name

    cat /sys/class/switch/hdmi/state



原创粉丝点击