欢迎来到虫虫下载站 | 资源下载 资源专辑 关于我们
虫虫下载站

input.h

linux 内核源代码
H
第 1 页 / 共 3 页
字号:
/* * Force feedback periodic effect types */#define FF_SQUARE	0x58#define FF_TRIANGLE	0x59#define FF_SINE		0x5a#define FF_SAW_UP	0x5b#define FF_SAW_DOWN	0x5c#define FF_CUSTOM	0x5d#define FF_WAVEFORM_MIN	FF_SQUARE#define FF_WAVEFORM_MAX	FF_CUSTOM/* * Set ff device properties */#define FF_GAIN		0x60#define FF_AUTOCENTER	0x61#define FF_MAX		0x7f#define FF_CNT		(FF_MAX+1)#ifdef __KERNEL__/* * In-kernel definitions. */#include <linux/device.h>#include <linux/fs.h>#include <linux/timer.h>#include <linux/mod_devicetable.h>/** * struct input_dev - represents an input device * @name: name of the device * @phys: physical path to the device in the system hierarchy * @uniq: unique identification code for the device (if device has it) * @id: id of the device (struct input_id) * @evbit: bitmap of types of events supported by the device (EV_KEY, *	EV_REL, etc.) * @keybit: bitmap of keys/buttons this device has * @relbit: bitmap of relative axes for the device * @absbit: bitmap of absolute axes for the device * @mscbit: bitmap of miscellaneous events supported by the device * @ledbit: bitmap of leds present on the device * @sndbit: bitmap of sound effects supported by the device * @ffbit: bitmap of force feedback effects supported by the device * @swbit: bitmap of switches present on the device * @keycodemax: size of keycode table * @keycodesize: size of elements in keycode table * @keycode: map of scancodes to keycodes for this device * @setkeycode: optional method to alter current keymap, used to implement *	sparse keymaps. If not supplied default mechanism will be used * @getkeycode: optional method to retrieve current keymap. If not supplied *	default mechanism will be used * @ff: force feedback structure associated with the device if device *	supports force feedback effects * @repeat_key: stores key code of the last key pressed; used to implement *	software autorepeat * @timer: timer for software autorepeat * @sync: set to 1 when there were no new events since last EV_SYNC * @abs: current values for reports from absolute axes * @rep: current values for autorepeat parameters (delay, rate) * @key: reflects current state of device's keys/buttons * @led: reflects current state of device's LEDs * @snd: reflects current state of sound effects * @sw: reflects current state of device's switches * @absmax: maximum values for events coming from absolute axes * @absmin: minimum values for events coming from absolute axes * @absfuzz: describes noisiness for axes * @absflat: size of the center flat position (used by joydev) * @open: this method is called when the very first user calls *	input_open_device(). The driver must prepare the device *	to start generating events (start polling thread, *	request an IRQ, submit URB, etc.) * @close: this method is called when the very last user calls *	input_close_device(). * @flush: purges the device. Most commonly used to get rid of force *	feedback effects loaded into the device when disconnecting *	from it * @event: event handler for events sent _to_ the device, like EV_LED *	or EV_SND. The device is expected to carry out the requested *	action (turn on a LED, play sound, etc.) The call is protected *	by @event_lock and must not sleep * @grab: input handle that currently has the device grabbed (via *	EVIOCGRAB ioctl). When a handle grabs a device it becomes sole *	recipient for all input events coming from the device * @event_lock: this spinlock is is taken when input core receives *	and processes a new event for the device (in input_event()). *	Code that accesses and/or modifies parameters of a device *	(such as keymap or absmin, absmax, absfuzz, etc.) after device *	has been registered with input core must take this lock. * @mutex: serializes calls to open(), close() and flush() methods * @users: stores number of users (input handlers) that opened this *	device. It is used by input_open_device() and input_close_device() *	to make sure that dev->open() is only called when the first *	user opens device and dev->close() is called when the very *	last user closes the device * @going_away: marks devices that are in a middle of unregistering and *	causes input_open_device*() fail with -ENODEV. * @dev: driver model's view of this device * @cdev: union for struct device pointer * @h_list: list of input handles associated with the device. When *	accessing the list dev->mutex must be held * @node: used to place the device onto input_dev_list */struct input_dev {	/* private: */	void *private;	/* do not use */	/* public: */	const char *name;	const char *phys;	const char *uniq;	struct input_id id;	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 keycodemax;	unsigned int keycodesize;	void *keycode;	int (*setkeycode)(struct input_dev *dev, int scancode, int keycode);	int (*getkeycode)(struct input_dev *dev, int scancode, int *keycode);	struct ff_device *ff;	unsigned int repeat_key;	struct timer_list timer;	int sync;	int abs[ABS_MAX + 1];	int rep[REP_MAX + 1];	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 absmax[ABS_MAX + 1];	int absmin[ABS_MAX + 1];	int absfuzz[ABS_MAX + 1];	int absflat[ABS_MAX + 1];	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 *grab;	spinlock_t event_lock;	struct mutex mutex;	unsigned int users;	int going_away;	struct device dev;	union {			/* temporarily so while we switching to struct device */		struct device *dev;	} cdev;	struct list_head	h_list;	struct list_head	node;};#define to_input_dev(d) container_of(d, struct input_dev, dev)/* * Verify that we are in sync with input_device_id mod_devicetable.h #defines */#if EV_MAX != INPUT_DEVICE_ID_EV_MAX#error "EV_MAX and INPUT_DEVICE_ID_EV_MAX do not match"#endif#if KEY_MIN_INTERESTING != INPUT_DEVICE_ID_KEY_MIN_INTERESTING#error "KEY_MIN_INTERESTING and INPUT_DEVICE_ID_KEY_MIN_INTERESTING do not match"#endif#if KEY_MAX != INPUT_DEVICE_ID_KEY_MAX#error "KEY_MAX and INPUT_DEVICE_ID_KEY_MAX do not match"#endif#if REL_MAX != INPUT_DEVICE_ID_REL_MAX#error "REL_MAX and INPUT_DEVICE_ID_REL_MAX do not match"#endif#if ABS_MAX != INPUT_DEVICE_ID_ABS_MAX#error "ABS_MAX and INPUT_DEVICE_ID_ABS_MAX do not match"#endif#if MSC_MAX != INPUT_DEVICE_ID_MSC_MAX#error "MSC_MAX and INPUT_DEVICE_ID_MSC_MAX do not match"#endif#if LED_MAX != INPUT_DEVICE_ID_LED_MAX#error "LED_MAX and INPUT_DEVICE_ID_LED_MAX do not match"#endif#if SND_MAX != INPUT_DEVICE_ID_SND_MAX#error "SND_MAX and INPUT_DEVICE_ID_SND_MAX do not match"#endif#if FF_MAX != INPUT_DEVICE_ID_FF_MAX#error "FF_MAX and INPUT_DEVICE_ID_FF_MAX do not match"#endif#if SW_MAX != INPUT_DEVICE_ID_SW_MAX#error "SW_MAX and INPUT_DEVICE_ID_SW_MAX do not match"#endif#define INPUT_DEVICE_ID_MATCH_DEVICE \	(INPUT_DEVICE_ID_MATCH_BUS | INPUT_DEVICE_ID_MATCH_VENDOR | INPUT_DEVICE_ID_MATCH_PRODUCT)#define INPUT_DEVICE_ID_MATCH_DEVICE_AND_VERSION \	(INPUT_DEVICE_ID_MATCH_DEVICE | INPUT_DEVICE_ID_MATCH_VERSION)struct input_handle;/** * struct input_handler - implements one of interfaces for input devices * @private: driver-specific data * @event: event handler. This method is being called by input core with *	interrupts disabled and dev->event_lock spinlock held and so *	it may not sleep * @connect: called when attaching a handler to an input device * @disconnect: disconnects a handler from input device * @start: starts handler for given handle. This function is called by *	input core right after connect() method and also when a process *	that "grabbed" a device releases it * @fops: file operations this driver implements * @minor: beginning of range of 32 minors for devices this driver *	can provide * @name: name of the handler, to be shown in /proc/bus/input/handlers * @id_table: pointer to a table of input_device_ids this driver can *	handle * @blacklist: pointer to a table of input_device_ids this driver should *	ignore even if they match @id_table * @h_list: list of input handles associated with the handler * @node: for placing the driver onto input_handler_list * * Input handlers attach to input devices and create input handles. There * are likely several handlers attached to any given input device at the * same time. All of them will get their copy of input event generated by * the device. * * Note that input core serializes calls to connect() and disconnect() * methods. */struct input_handler {	void *private;	void (*event)(struct input_handle *handle, unsigned int type, unsigned int code, int value);	int (*connect)(struct input_handler *handler, struct input_dev *dev, const struct input_device_id *id);	void (*disconnect)(struct input_handle *handle);	void (*start)(struct input_handle *handle);	const struct file_operations *fops;	int minor;	const char *name;	const struct input_device_id *id_table;	const struct input_device_id *blacklist;	struct list_head	h_list;	struct list_head	node;};/** * struct input_handle - links input device with an input handler * @private: handler-specific data * @open: counter showing whether the handle is 'open', i.e. should deliver *	events from its device * @name: name given to the handle by handler that created it * @dev: input device the handle is attached to * @handler: handler that works with the device through this handle * @d_node: used to put the handle on device's list of attached handles * @h_node: used to put the handle on handler's list of handles from which *	it gets events */struct input_handle {	void *private;	int open;	const char *name;	struct input_dev *dev;	struct input_handler *handler;	struct list_head	d_node;	struct list_head	h_node;};#define to_dev(n) container_of(n, struct input_dev, node)#define to_handler(n) container_of(n, struct input_handler, node)#define to_handle(n) container_of(n, struct input_handle, d_node)#define to_handle_h(n) container_of(n, struct input_handle, h_node)struct input_dev *input_allocate_device(void);void input_free_device(struct input_dev *dev);static inline struct input_dev *input_get_device(struct input_dev *dev){	return to_input_dev(get_device(&dev->dev));}static inline void input_put_device(struct input_dev *dev){	put_device(&dev->dev);}static inline void *input_get_drvdata(struct input_dev *dev){	return dev->private;}static inline void input_set_drvdata(struct input_dev *dev, void *data){	dev->private = data;}int __must_check input_register_device(struct input_dev *);void input_unregister_device(struct input_dev *);int __must_check input_register_handler(struct input_handler *);void input_unregister_handler(struct input_handler *);int input_register_handle(struct input_handle *);void input_unregister_handle(struct input_handle *);int input_grab_device(struct input_handle *);void input_release_device(struct input_handle *);int input_open_device(struct input_handle *);void input_close_device(struct input_handle *);int input_flush_device(struct input_handle* handle, struct file* file);void input_event(struct input_dev *dev, unsigned int type, unsigned int code, int value);void input_inject_event(struct input_handle *handle, unsigned int type, unsigned int code, int value);static inline void input_report_key(struct input_dev *dev, unsigned int code, int value){	input_event(dev, EV_KEY, code, !!value);}static inline void input_report_rel(struct input_dev *dev, unsigned int code, int value){	input_event(dev, EV_REL, code, value);}static inline void input_report_abs(struct input_dev *dev, unsigned int code, int value){	input_event(dev, EV_ABS, code, value);}static inline void input_report_ff_status(struct input_dev *dev, unsigned int code, int value){	input_event(dev, EV_FF_STATUS, code, value);}static inline void input_report_switch(struct input_dev *dev, unsigned int code, int value){	input_event(dev, EV_SW, code, !!value);}static inline void input_sync(struct input_dev *dev){	input_event(dev, EV_SYN, SYN_REPORT, 0);}void input_set_capability(struct input_dev *dev, unsigned int type, unsigned int code);static inline void input_set_abs_params(struct input_dev *dev, int axis, int min, int max, int fuzz, int flat){	dev->absmin[axis] = min;	dev->absmax[axis] = max;	dev->absfuzz[axis] = fuzz;	dev->absflat[axis] = flat;	dev->absbit[BIT_WORD(axis)] |= BIT_MASK(axis);}extern struct class input_class;/** * struct ff_device - force-feedback part of an input device * @upload: Called to upload an new effect into device * @erase: Called to erase an effect from device * @playback: Called to request device to start playing specified effect * @set_gain: Called to set specified gain * @set_autocenter: Called to auto-center device * @destroy: called by input core when parent input device is being *	destroyed * @private: driver-specific data, will be freed automatically * @ffbit: bitmap of force feedback capabilities truly supported by *	device (not emulated like ones in input_dev->ffbit) * @mutex: mutex for serializing access to the device * @max_effects: maximum number of effects supported by device * @effects: pointer to an array of effects currently loaded into device * @effect_owners: array of effect owners; when file handle owning *	an effect gets closed the effect is automatically erased * * Every force-feedback device must implement upload() and playback() * methods; erase() is optional. set_gain() and set_autocenter() need * only be implemented if driver sets up FF_GAIN and FF_AUTOCENTER * bits. */struct ff_device {	int (*upload)(struct input_dev *dev, struct ff_effect *effect,		      struct ff_effect *old);	int (*erase)(struct input_dev *dev, int effect_id);	int (*playback)(struct input_dev *dev, int effect_id, int value);	void (*set_gain)(struct input_dev *dev, u16 gain);	void (*set_autocenter)(struct input_dev *dev, u16 magnitude);	void (*destroy)(struct ff_device *);	void *private;	unsigned long ffbit[BITS_TO_LONGS(FF_CNT)];	struct mutex mutex;	int max_effects;	struct ff_effect *effects;	struct file *effect_owners[];};int input_ff_create(struct input_dev *dev, int max_effects);void input_ff_destroy(struct input_dev *dev);int input_ff_event(struct input_dev *dev, unsigned int type, unsigned int code, int value);int input_ff_upload(struct input_dev *dev, struct ff_effect *effect, struct file *file);int input_ff_erase(struct input_dev *dev, int effect_id, struct file *file);int input_ff_create_memless(struct input_dev *dev, void *data,		int (*play_effect)(struct input_dev *, void *, struct ff_effect *));#endif#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -