sysfs_create_group 註冊 attribute


參考kx122.c 中 sysfs 註冊 device_attribute 

kx122_sysfs_get_enable 實作成 _show()
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 {
...
    /* 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;
};








留言

這個網誌中的熱門文章

vim 基礎操作

20220411 台南砲校教召