# # Copyright (C) 2006-2013 OpenWrt.org # # This is free software, licensed under the GNU General Public License v2. # See /LICENSE for more information. # INPUT_MODULES_MENU:=Input modules define KernelPackage/hid SUBMENU:=$(INPUT_MODULES_MENU) TITLE:=HID Devices DEPENDS:=+kmod-input-core +kmod-input-evdev KCONFIG:=CONFIG_HID CONFIG_HIDRAW=y CONFIG_HID_BATTERY_STRENGTH=y FILES:=$(LINUX_DIR)/drivers/hid/hid.ko AUTOLOAD:=$(call AutoLoad,61,hid) endef define KernelPackage/hid/description Kernel modules for HID devices endef $(eval $(call KernelPackage,hid)) define KernelPackage/hid-generic SUBMENU:=$(INPUT_MODULES_MENU) TITLE:=Generic HID device support DEPENDS:=+kmod-hid KCONFIG:=CONFIG_HID_GENERIC FILES:=$(LINUX_DIR)/drivers/hid/hid-generic.ko AUTOLOAD:=$(call AutoProbe,hid-generic) endef define KernelPackage/hid/description Kernel modules for generic HID device (e.g. keyboards and mice) support endef $(eval $(call KernelPackage,hid-generic)) define KernelPackage/input-core SUBMENU:=$(INPUT_MODULES_MENU) TITLE:=Input device core KCONFIG:=CONFIG_INPUT FILES:=$(LINUX_DIR)/drivers/input/input-core.ko endef define KernelPackage/input-core/description Kernel modules for support of input device endef $(eval $(call KernelPackage,input-core)) define KernelPackage/input-evdev SUBMENU:=$(INPUT_MODULES_MENU) TITLE:=Input event device DEPENDS:=+kmod-input-core KCONFIG:=CONFIG_INPUT_EVDEV FILES:=$(LINUX_DIR)/drivers/input/evdev.ko AUTOLOAD:=$(call AutoLoad,60,evdev) endef define KernelPackage/input-evdev/description Kernel modules for support of input device events endef $(eval $(call KernelPackage,input-evdev)) define KernelPackage/input-gpio-keys SUBMENU:=$(INPUT_MODULES_MENU) TITLE:=GPIO key support DEPENDS:= @GPIO_SUPPORT +kmod-input-core KCONFIG:= \ CONFIG_KEYBOARD_GPIO \ CONFIG_INPUT_KEYBOARD=y FILES:=$(LINUX_DIR)/drivers/input/keyboard/gpio_keys.ko AUTOLOAD:=$(call AutoProbe,gpio_keys,1) endef define KernelPackage/input-gpio-keys/description This driver implements support for buttons connected to GPIO pins of various CPUs (and some other chips). See also gpio-button-hotplug which is an alternative, lower overhead implementation that generates uevents instead of kernel input events. endef $(eval $(call KernelPackage,input-gpio-keys)) define KernelPackage/input-gpio-keys-polled SUBMENU:=$(INPUT_MODULES_MENU) TITLE:=Polled GPIO key support DEPENDS:=@GPIO_SUPPORT +kmod-input-polldev KCONFIG:= \ CONFIG_KEYBOARD_GPIO_POLLED \ CONFIG_INPUT_KEYBOARD=y FILES:=$(LINUX_DIR)/drivers/input/keyboard/gpio_keys_polled.ko AUTOLOAD:=$(call AutoProbe,gpio_keys_polled,1) endef define KernelPackage/input-gpio-keys-polled/description Kernel module for support polled GPIO keys input device See also gpio-button-hotplug which is an alternative, lower overhead implementation that generates uevents instead of kernel input events. endef $(eval $(call KernelPackage,input-gpio-keys-polled)) define KernelPackage/input-gpio-encoder SUBMENU:=$(INPUT_MODULES_MENU) TITLE:=GPIO rotary encoder DEPENDS:=@GPIO_SUPPORT +kmod-input-core KCONFIG:=CONFIG_INPUT_GPIO_ROTARY_ENCODER FILES:=$(LINUX_DIR)/drivers/input/misc/rotary_encoder.ko AUTOLOAD:=$(call AutoProbe,rotary_encoder) endef define KernelPackage/gpio-encoder/description Kernel module to use rotary encoders connected to GPIO pins endef $(eval $(call KernelPackage,input-gpio-encoder)) define KernelPackage/input-joydev SUBMENU:=$(INPUT_MODULES_MENU) TITLE:=Joystick device support DEPENDS:=+kmod-input-core KCONFIG:=CONFIG_INPUT_JOYDEV FILES:=$(LINUX_DIR)/drivers/input/joydev.ko AUTOLOAD:=$(call AutoProbe,joydev) endef define KernelPackage/input-joydev/description Kernel module for joystick support endef $(eval $(call KernelPackage,input-joydev)) define KernelPackage/input-polldev SUBMENU:=$(INPUT_MODULES_MENU) TITLE:=Polled Input device support DEPENDS:=+kmod-input-core KCONFIG:=CONFIG_INPUT_POLLDEV FILES:=$(LINUX_DIR)/drivers/input/input-polldev.ko endef define KernelPackage/input-polldev/description Kernel module for support of polled input devices endef $(eval $(call KernelPackage,input-polldev)) define KernelPackage/input-matrixkmap SUBMENU:=$(INPUT_MODULES_MENU) TITLE:=Input matrix devices support DEPENDS:=+kmod-input-core KCONFIG:=CONFIG_INPUT_MATRIXKMAP FILES:=$(LINUX_DIR)/drivers/input/matrix-keymap.ko AUTOLOAD:=$(call AutoProbe,matrix-keymap) endef define KernelPackage/input-matrix/description Kernel module support for input matrix devices endef $(eval $(call KernelPackage,input-matrixkmap)) define KernelPackage/keyboard-imx SUBMENU:=$(INPUT_MODULES_MENU) TITLE:=IMX keypad support DEPENDS:=@(TARGET_mxs||TARGET_imx6) +kmod-input-matrixkmap KCONFIG:= \ CONFIG_KEYBOARD_IMX \ CONFIG_INPUT_KEYBOARD=y FILES:=$(LINUX_DIR)/drivers/input/keyboard/imx_keypad.ko AUTOLOAD:=$(call AutoProbe,imx_keypad) endef define KernelPackage/keyboard-imx/description Enable support for IMX keypad port. endef $(eval $(call KernelPackage,keyboard-imx)) define KernelPackage/input-uinput SUBMENU:=$(INPUT_MODULES_MENU) TITLE:=user input module DEPENDS:=+kmod-input-core KCONFIG:= \ CONFIG_INPUT_MISC=y \ CONFIG_INPUT_UINPUT FILES:=$(LINUX_DIR)/drivers/input/misc/uinput.ko AUTOLOAD:=$(call AutoProbe,uinput) endef define KernelPackage/input-uinput/description user input modules needed for bluez endef $(eval $(call KernelPackage,input-uinput)) 5 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221
/*
 * netlink/socket.h		Netlink Socket
 *
 *	This library is free software; you can redistribute it and/or
 *	modify it under the terms of the GNU Lesser General Public
 *	License as published by the Free Software Foundation version 2.1
 *	of the License.
 *
 * Copyright (c) 2003-2008 Thomas Graf <tgraf@suug.ch>
 */

#ifndef NETLINK_SOCKET_H_
#define NETLINK_SOCKET_H_

#include <netlink/types.h>
#include <netlink/handlers.h>

#ifdef __cplusplus
extern "C" {
#endif

#define NL_SOCK_BUFSIZE_SET	(1<<0)
#define NL_SOCK_PASSCRED	(1<<1)
#define NL_OWN_PORT		(1<<2)
#define NL_MSG_PEEK		(1<<3)
#define NL_NO_AUTO_ACK		(1<<4)

struct nl_cb;
struct nl_sock
{
	struct sockaddr_nl	s_local;
	struct sockaddr_nl	s_peer;
	int			s_fd;
	int			s_proto;
	unsigned int		s_seq_next;
	unsigned int		s_seq_expect;
	int			s_flags;
	struct nl_cb *		s_cb;
};


extern struct nl_sock *	nl_socket_alloc(void);
extern struct nl_sock *	nl_socket_alloc_cb(struct nl_cb *);
extern void		nl_socket_free(struct nl_sock *);

extern void		nl_socket_set_local_port(struct nl_sock *, uint32_t);

extern int		nl_socket_add_memberships(struct nl_sock *, int, ...);
extern int		nl_socket_drop_memberships(struct nl_sock *, int, ...);

extern int		nl_socket_set_buffer_size(struct nl_sock *, int, int);
extern int		nl_socket_set_passcred(struct nl_sock *, int);
extern int		nl_socket_recv_pktinfo(struct nl_sock *, int);

extern void		nl_socket_disable_seq_check(struct nl_sock *);

extern int		nl_socket_set_nonblocking(struct nl_sock *);

/**
 * Use next sequence number
 * @arg sk		Netlink socket.
 *
 * Uses the next available sequence number and increases the counter
 * by one for subsequent calls.
 *
 * @return Unique serial sequence number
 */
static inline unsigned int nl_socket_use_seq(struct nl_sock *sk)
{
	return sk->s_seq_next++;
}

/**
 * Disable automatic request for ACK
 * @arg sk		Netlink socket.
 *
 * The default behaviour of a socket is to request an ACK for
 * each message sent to allow for the caller to synchronize to
 * the completion of the netlink operation. This function
 * disables this behaviour and will result in requests being
 * sent which will not have the NLM_F_ACK flag set automatically.
 * However, it is still possible for the caller to set the
 * NLM_F_ACK flag explicitely.
 */
static inline void nl_socket_disable_auto_ack(struct nl_sock *sk)
{
	sk->s_flags |= NL_NO_AUTO_ACK;
}

/**
 * Enable automatic request for ACK (default)
 * @arg sk		Netlink socket.
 * @see nl_socket_disable_auto_ack
 */
static inline void nl_socket_enable_auto_ack(struct nl_sock *sk)
{
	sk->s_flags &= ~NL_NO_AUTO_ACK;
}

/**
 * @name Source Idenficiation
 * @{
 */

static inline uint32_t nl_socket_get_local_port(struct nl_sock *sk)
{
	return sk->s_local.nl_pid;
}

/**
 * Join multicast groups (deprecated)
 * @arg sk		Netlink socket.
 * @arg groups		Bitmask of groups to join.
 *
 * This function defines the old way of joining multicast group which
 * has to be done prior to calling nl_connect(). It works on any kernel
 * version but is very limited as only 32 groups can be joined.
 */
static inline void nl_join_groups(struct nl_sock *sk, int groups)
{
	sk->s_local.nl_groups |= groups;
}

/**
 * @name Peer Identfication
 * @{
 */

static inline uint32_t nl_socket_get_peer_port(struct nl_sock *sk)
{
	return sk->s_peer.nl_pid;
}

static inline void nl_socket_set_peer_port(struct nl_sock *sk, uint32_t port)
{
	sk->s_peer.nl_pid = port;
}

/** @} */

/**
 * @name File Descriptor
 * @{
 */

static inline int nl_socket_get_fd(struct nl_sock *sk)
{
	return sk->s_fd;
}

/**
 * Enable use of MSG_PEEK when reading from socket
 * @arg sk		Netlink socket.
 */
static inline void nl_socket_enable_msg_peek(struct nl_sock *sk)
{
	sk->s_flags |= NL_MSG_PEEK;
}

/**
 * Disable use of MSG_PEEK when reading from socket
 * @arg sk		Netlink socket.
 */
static inline void nl_socket_disable_msg_peek(struct nl_sock *sk)
{
	sk->s_flags &= ~NL_MSG_PEEK;
}

/**
 * @name Callback Handler
 * @{
 */

static inline struct nl_cb *nl_socket_get_cb(struct nl_sock *sk)
{
	return nl_cb_get(sk->s_cb);
}

static inline void nl_socket_set_cb(struct nl_sock *sk, struct nl_cb *cb)
{
	nl_cb_put(sk->s_cb);
	sk->s_cb = nl_cb_get(cb);
}

/**
 * Modify the callback handler associated to the socket
 * @arg sk		Netlink socket.
 * @arg type		which type callback to set
 * @arg kind		kind of callback
 * @arg func		callback function
 * @arg arg		argument to be passwd to callback function
 *
 * @see nl_cb_set
 */
static inline int nl_socket_modify_cb(struct nl_sock *sk, enum nl_cb_type type,
			enum nl_cb_kind kind, nl_recvmsg_msg_cb_t func,
			void *arg)
{
	return nl_cb_set(sk->s_cb, type, kind, func, arg);
}

/** @} */

static inline int nl_socket_add_membership(struct nl_sock *sk, int group)
{
	return nl_socket_add_memberships(sk, group, 0);
}


static inline int nl_socket_drop_membership(struct nl_sock *sk, int group)
{
	return nl_socket_drop_memberships(sk, group, 0);
}



#ifdef __cplusplus
}
#endif

#endif