sysfs_create_group 註冊 attribute
參考kx122.c 中 sysfs 註冊 device_attribute
kx122_sysfs_set_enable 實作成 _store()
static struct device_attribute dev_attr_accel_enable = __ATTR(enable,
S_IRUGO | S_IWUSR,
kx122_sysfs_get_enable,
kx122_sysfs_set_enable);
static struct device_attribute dev_attr_accel_delay = __ATTR(delay,
S_IRUGO | S_IWUSR,
kx122_sysfs_get_delay,
kx122_sysfs_set_delay);
static struct device_attribute dev_attr_reg_read = __ATTR(reg_read,
S_IWUSR,
NULL,
kx122_sysfs_reg_read);
static struct device_attribute dev_attr_reg_write = __ATTR(reg_write,
S_IWUSR,
NULL,
kx122_sysfs_reg_write);
static struct attribute *kx122_sysfs_attrs[] = {
&dev_attr_accel_enable.attr,
&dev_attr_accel_delay.attr,
&dev_attr_reg_read.attr,
&dev_attr_reg_write.attr,
NULL
};
static struct attribute_group kx122_accel_attribute_group = {
.attrs = kx122_sysfs_attrs
};
static int kx122_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
struct kx122_data *sdata;
...
err = sysfs_create_group(&sdata->accel_input_dev->dev.kobj,&kx122_accel_attribute_group);
...
}
- - - -
其中 &sdata->accel_input_dev->dev.kobj
sdata 是 struct kx122_data
struct kx122_data {
struct kx122_data {
...
/* accelerometer */
struct input_dev *accel_input_dev;
/* accelerometer */
struct input_dev *accel_input_dev;
...
}
struct input_dev 定義在input.h中
struct input_dev {
const char *name;
const char *phys;
const char *uniq;
struct input_id id;
unsigned long propbit[BITS_TO_LONGS(INPUT_PROP_CNT)];
unsigned long evbit[BITS_TO_LONGS(EV_CNT)];
unsigned long keybit[BITS_TO_LONGS(KEY_CNT)];
unsigned long relbit[BITS_TO_LONGS(REL_CNT)];
unsigned long absbit[BITS_TO_LONGS(ABS_CNT)];
unsigned long mscbit[BITS_TO_LONGS(MSC_CNT)];
unsigned long ledbit[BITS_TO_LONGS(LED_CNT)];
unsigned long sndbit[BITS_TO_LONGS(SND_CNT)];
unsigned long ffbit[BITS_TO_LONGS(FF_CNT)];
unsigned long swbit[BITS_TO_LONGS(SW_CNT)];
unsigned int hint_events_per_packet;
unsigned int keycodemax;
unsigned int keycodesize;
void *keycode;
int (*setkeycode)(struct input_dev *dev,
const struct input_keymap_entry *ke,
unsigned int *old_keycode);
int (*getkeycode)(struct input_dev *dev,
struct input_keymap_entry *ke);
struct ff_device *ff;
unsigned int repeat_key;
struct timer_list timer;
int rep[REP_CNT];
struct input_mt *mt;
struct input_absinfo *absinfo;
unsigned long key[BITS_TO_LONGS(KEY_CNT)];
unsigned long led[BITS_TO_LONGS(LED_CNT)];
unsigned long snd[BITS_TO_LONGS(SND_CNT)];
unsigned long sw[BITS_TO_LONGS(SW_CNT)];
int (*open)(struct input_dev *dev);
void (*close)(struct input_dev *dev);
int (*flush)(struct input_dev *dev, struct file *file);
int (*event)(struct input_dev *dev, unsigned int type, unsigned int code, int value);
struct input_handle __rcu *grab;
spinlock_t event_lock;
struct mutex mutex;
unsigned int users;
bool going_away;
struct device dev;
struct list_head h_list;
struct list_head node;
unsigned int num_vals;
unsigned int max_vals;
struct input_value *vals;
bool devres_managed;
};
留言
張貼留言