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