2007-02-09 23:24:33 +09:00
/*
2005-04-16 15:20:36 -07:00
HIDP implementation for Linux Bluetooth stack ( BlueZ ) .
Copyright ( C ) 2003 - 2004 Marcel Holtmann < marcel @ holtmann . org >
This program is free software ; you can redistribute it and / or modify
it under the terms of the GNU General Public License version 2 as
published by the Free Software Foundation ;
THE SOFTWARE IS PROVIDED " AS IS " , WITHOUT WARRANTY OF ANY KIND , EXPRESS
OR IMPLIED , INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY ,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS .
IN NO EVENT SHALL THE COPYRIGHT HOLDER ( S ) AND AUTHOR ( S ) BE LIABLE FOR ANY
2007-02-09 23:24:33 +09:00
CLAIM , OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES , OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE , DATA OR PROFITS , WHETHER IN AN
ACTION OF CONTRACT , NEGLIGENCE OR OTHER TORTIOUS ACTION , ARISING OUT OF
2005-04-16 15:20:36 -07:00
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE .
2007-02-09 23:24:33 +09:00
ALL LIABILITY , INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS ,
COPYRIGHTS , TRADEMARKS OR OTHER RIGHTS , RELATING TO USE OF THIS
2005-04-16 15:20:36 -07:00
SOFTWARE IS DISCLAIMED .
*/
# ifndef __HIDP_H
# define __HIDP_H
# include <linux/types.h>
# include <net/bluetooth/bluetooth.h>
/* HIDP header masks */
# define HIDP_HEADER_TRANS_MASK 0xf0
# define HIDP_HEADER_PARAM_MASK 0x0f
/* HIDP transaction types */
# define HIDP_TRANS_HANDSHAKE 0x00
# define HIDP_TRANS_HID_CONTROL 0x10
# define HIDP_TRANS_GET_REPORT 0x40
# define HIDP_TRANS_SET_REPORT 0x50
# define HIDP_TRANS_GET_PROTOCOL 0x60
# define HIDP_TRANS_SET_PROTOCOL 0x70
# define HIDP_TRANS_GET_IDLE 0x80
# define HIDP_TRANS_SET_IDLE 0x90
# define HIDP_TRANS_DATA 0xa0
# define HIDP_TRANS_DATC 0xb0
/* HIDP handshake results */
# define HIDP_HSHK_SUCCESSFUL 0x00
# define HIDP_HSHK_NOT_READY 0x01
# define HIDP_HSHK_ERR_INVALID_REPORT_ID 0x02
# define HIDP_HSHK_ERR_UNSUPPORTED_REQUEST 0x03
# define HIDP_HSHK_ERR_INVALID_PARAMETER 0x04
# define HIDP_HSHK_ERR_UNKNOWN 0x0e
# define HIDP_HSHK_ERR_FATAL 0x0f
/* HIDP control operation parameters */
# define HIDP_CTRL_NOP 0x00
# define HIDP_CTRL_HARD_RESET 0x01
# define HIDP_CTRL_SOFT_RESET 0x02
# define HIDP_CTRL_SUSPEND 0x03
# define HIDP_CTRL_EXIT_SUSPEND 0x04
# define HIDP_CTRL_VIRTUAL_CABLE_UNPLUG 0x05
/* HIDP data transaction headers */
# define HIDP_DATA_RTYPE_MASK 0x03
# define HIDP_DATA_RSRVD_MASK 0x0c
# define HIDP_DATA_RTYPE_OTHER 0x00
# define HIDP_DATA_RTYPE_INPUT 0x01
# define HIDP_DATA_RTYPE_OUPUT 0x02
# define HIDP_DATA_RTYPE_FEATURE 0x03
/* HIDP protocol header parameters */
# define HIDP_PROTO_BOOT 0x00
# define HIDP_PROTO_REPORT 0x01
/* HIDP ioctl defines */
# define HIDPCONNADD _IOW('H', 200, int)
# define HIDPCONNDEL _IOW('H', 201, int)
# define HIDPGETCONNLIST _IOR('H', 210, int)
# define HIDPGETCONNINFO _IOR('H', 211, int)
# define HIDP_VIRTUAL_CABLE_UNPLUG 0
# define HIDP_BOOT_PROTOCOL_MODE 1
# define HIDP_BLUETOOTH_VENDOR_ID 9
2011-04-06 10:43:23 +02:00
# define HIDP_WAITING_FOR_RETURN 10
2011-01-18 03:04:38 -05:00
# define HIDP_WAITING_FOR_SEND_ACK 11
2005-04-16 15:20:36 -07:00
struct hidp_connadd_req {
2011-03-21 14:20:01 +01:00
int ctrl_sock ; /* Connected control socket */
int intr_sock ; /* Connected interrupt socket */
2005-04-16 15:20:36 -07:00
__u16 parser ;
__u16 rd_size ;
2007-02-09 16:38:00 +00:00
__u8 __user * rd_data ;
2005-04-16 15:20:36 -07:00
__u8 country ;
__u8 subclass ;
__u16 vendor ;
__u16 product ;
__u16 version ;
__u32 flags ;
__u32 idle_to ;
char name [ 128 ] ;
} ;
struct hidp_conndel_req {
bdaddr_t bdaddr ;
__u32 flags ;
} ;
struct hidp_conninfo {
bdaddr_t bdaddr ;
__u32 flags ;
__u16 state ;
__u16 vendor ;
__u16 product ;
__u16 version ;
char name [ 128 ] ;
} ;
struct hidp_connlist_req {
__u32 cnum ;
struct hidp_conninfo __user * ci ;
} ;
int hidp_add_connection ( struct hidp_connadd_req * req , struct socket * ctrl_sock , struct socket * intr_sock ) ;
int hidp_del_connection ( struct hidp_conndel_req * req ) ;
int hidp_get_connlist ( struct hidp_connlist_req * req ) ;
int hidp_get_conninfo ( struct hidp_conninfo * ci ) ;
/* HIDP session defines */
struct hidp_session {
struct list_head list ;
2009-08-22 14:22:15 -07:00
struct hci_conn * conn ;
2005-04-16 15:20:36 -07:00
struct socket * ctrl_sock ;
struct socket * intr_sock ;
bdaddr_t bdaddr ;
unsigned long flags ;
unsigned long idle_to ;
uint ctrl_mtu ;
uint intr_mtu ;
2011-06-30 13:53:53 -04:00
atomic_t terminate ;
2011-04-05 15:37:45 +02:00
struct task_struct * task ;
2005-04-16 15:20:36 -07:00
unsigned char keys [ 8 ] ;
unsigned char leds ;
struct input_dev * input ;
2007-02-17 23:58:49 +01:00
struct hid_device * hid ;
2005-04-16 15:20:36 -07:00
struct timer_list timer ;
struct sk_buff_head ctrl_transmit ;
struct sk_buff_head intr_transmit ;
2008-05-16 11:49:16 +02:00
2011-01-18 03:04:40 -05:00
/* Used in hidp_get_raw_report() */
int waiting_report_type ; /* HIDP_DATA_RTYPE_* */
int waiting_report_number ; /* -1 for not numbered */
struct mutex report_mutex ;
struct sk_buff * report_return ;
wait_queue_head_t report_queue ;
2011-01-18 03:04:38 -05:00
/* Used in hidp_output_raw_report() */
int output_report_success ; /* boolean */
2010-02-05 12:23:43 -05:00
/* Report descriptor */
__u8 * rd_data ;
uint rd_size ;
2011-01-18 03:04:37 -05:00
wait_queue_head_t startup_queue ;
int waiting_for_startup ;
2005-04-16 15:20:36 -07:00
} ;
/* HIDP init defines */
extern int __init hidp_init_sockets ( void ) ;
extern void __exit hidp_cleanup_sockets ( void ) ;
# endif /* __HIDP_H */