hid.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:10k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. #ifndef __HID_H
  2. #define __HID_H
  3. /*
  4.  * $Id: hid.h,v 1.10 2001/05/10 15:56:07 vojtech Exp $
  5.  *
  6.  *  Copyright (c) 1999 Andreas Gal
  7.  *  Copyright (c) 2000-2001 Vojtech Pavlik
  8.  *
  9.  *  Sponsored by SuSE
  10.  */
  11. /*
  12.  * This program is free software; you can redistribute it and/or modify
  13.  * it under the terms of the GNU General Public License as published by
  14.  * the Free Software Foundation; either version 2 of the License, or
  15.  * (at your option) any later version.
  16.  *
  17.  * This program is distributed in the hope that it will be useful,
  18.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  19.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  20.  * GNU General Public License for more details.
  21.  *
  22.  * You should have received a copy of the GNU General Public License
  23.  * along with this program; if not, write to the Free Software
  24.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  25.  *
  26.  * Should you need to contact me, the author, you can do so either by
  27.  * e-mail - mail your message to <vojtech@suse.cz>, or by paper mail:
  28.  * Vojtech Pavlik, Ucitelska 1576, Prague 8, 182 00 Czech Republic
  29.  */
  30. #include <linux/types.h>
  31. #include <linux/slab.h>
  32. #include <linux/list.h>
  33. /*
  34.  * USB HID (Human Interface Device) interface class code
  35.  */
  36. #define USB_INTERFACE_CLASS_HID 3
  37. /*
  38.  * We parse each description item into this structure. Short items data
  39.  * values are expanded to 32-bit signed int, long items contain a pointer
  40.  * into the data area.
  41.  */
  42. struct hid_item {
  43. unsigned  format;
  44. __u8      size;
  45. __u8      type;
  46. __u8      tag;
  47. union {
  48.     __u8   u8;
  49.     __s8   s8;
  50.     __u16  u16;
  51.     __s16  s16;
  52.     __u32  u32;
  53.     __s32  s32;
  54.     __u8  *longdata;
  55. } data;
  56. };
  57. /*
  58.  * HID report item format
  59.  */
  60. #define HID_ITEM_FORMAT_SHORT 0
  61. #define HID_ITEM_FORMAT_LONG 1
  62. /*
  63.  * Special tag indicating long items
  64.  */
  65. #define HID_ITEM_TAG_LONG 15
  66. /*
  67.  * HID report descriptor item type (prefix bit 2,3)
  68.  */
  69. #define HID_ITEM_TYPE_MAIN 0
  70. #define HID_ITEM_TYPE_GLOBAL 1
  71. #define HID_ITEM_TYPE_LOCAL 2
  72. #define HID_ITEM_TYPE_RESERVED 3
  73. /*
  74.  * HID report descriptor main item tags
  75.  */
  76. #define HID_MAIN_ITEM_TAG_INPUT 8
  77. #define HID_MAIN_ITEM_TAG_OUTPUT 9
  78. #define HID_MAIN_ITEM_TAG_FEATURE 11
  79. #define HID_MAIN_ITEM_TAG_BEGIN_COLLECTION 10
  80. #define HID_MAIN_ITEM_TAG_END_COLLECTION 12
  81. /*
  82.  * HID report descriptor main item contents
  83.  */
  84. #define HID_MAIN_ITEM_CONSTANT 0x001
  85. #define HID_MAIN_ITEM_VARIABLE 0x002
  86. #define HID_MAIN_ITEM_RELATIVE 0x004
  87. #define HID_MAIN_ITEM_WRAP 0x008
  88. #define HID_MAIN_ITEM_NONLINEAR 0x010
  89. #define HID_MAIN_ITEM_NO_PREFERRED 0x020
  90. #define HID_MAIN_ITEM_NULL_STATE 0x040
  91. #define HID_MAIN_ITEM_VOLATILE 0x080
  92. #define HID_MAIN_ITEM_BUFFERED_BYTE 0x100
  93. /*
  94.  * HID report descriptor collection item types
  95.  */
  96. #define HID_COLLECTION_PHYSICAL 0
  97. #define HID_COLLECTION_APPLICATION 1
  98. #define HID_COLLECTION_LOGICAL 2
  99. /*
  100.  * HID report descriptor global item tags
  101.  */
  102. #define HID_GLOBAL_ITEM_TAG_USAGE_PAGE 0
  103. #define HID_GLOBAL_ITEM_TAG_LOGICAL_MINIMUM 1
  104. #define HID_GLOBAL_ITEM_TAG_LOGICAL_MAXIMUM 2
  105. #define HID_GLOBAL_ITEM_TAG_PHYSICAL_MINIMUM 3
  106. #define HID_GLOBAL_ITEM_TAG_PHYSICAL_MAXIMUM 4
  107. #define HID_GLOBAL_ITEM_TAG_UNIT_EXPONENT 5
  108. #define HID_GLOBAL_ITEM_TAG_UNIT 6
  109. #define HID_GLOBAL_ITEM_TAG_REPORT_SIZE 7
  110. #define HID_GLOBAL_ITEM_TAG_REPORT_ID 8
  111. #define HID_GLOBAL_ITEM_TAG_REPORT_COUNT 9
  112. #define HID_GLOBAL_ITEM_TAG_PUSH 10
  113. #define HID_GLOBAL_ITEM_TAG_POP 11
  114. /*
  115.  * HID report descriptor local item tags
  116.  */
  117. #define HID_LOCAL_ITEM_TAG_USAGE 0
  118. #define HID_LOCAL_ITEM_TAG_USAGE_MINIMUM 1
  119. #define HID_LOCAL_ITEM_TAG_USAGE_MAXIMUM 2
  120. #define HID_LOCAL_ITEM_TAG_DESIGNATOR_INDEX 3
  121. #define HID_LOCAL_ITEM_TAG_DESIGNATOR_MINIMUM 4
  122. #define HID_LOCAL_ITEM_TAG_DESIGNATOR_MAXIMUM 5
  123. #define HID_LOCAL_ITEM_TAG_STRING_INDEX 7
  124. #define HID_LOCAL_ITEM_TAG_STRING_MINIMUM 8
  125. #define HID_LOCAL_ITEM_TAG_STRING_MAXIMUM 9
  126. #define HID_LOCAL_ITEM_TAG_DELIMITER 10
  127. /*
  128.  * HID usage tables
  129.  */
  130. #define HID_USAGE_PAGE 0xffff0000
  131. #define HID_UP_GENDESK  0x00010000
  132. #define HID_UP_KEYBOARD  0x00070000
  133. #define HID_UP_LED  0x00080000
  134. #define HID_UP_BUTTON  0x00090000
  135. #define HID_UP_CONSUMER 0x000c0000
  136. #define HID_UP_DIGITIZER  0x000d0000
  137. #define HID_UP_PID  0x000f0000
  138. #define HID_USAGE 0x0000ffff
  139. #define HID_GD_POINTER 0x00010001
  140. #define HID_GD_MOUSE 0x00010002
  141. #define HID_GD_JOYSTICK 0x00010004
  142. #define HID_GD_GAMEPAD 0x00010005
  143. #define HID_GD_HATSWITCH 0x00010039
  144. /*
  145.  * HID report types --- Ouch! HID spec says 1 2 3!
  146.  */
  147. #define HID_INPUT_REPORT 0
  148. #define HID_OUTPUT_REPORT 1
  149. #define HID_FEATURE_REPORT 2
  150. /*
  151.  * HID device quirks.
  152.  */
  153. #define HID_QUIRK_INVERT 0x01
  154. #define HID_QUIRK_NOTOUCH 0x02
  155. #define HID_QUIRK_IGNORE 0x04
  156. #define HID_QUIRK_NOGET 0x08
  157. /*
  158.  * This is the global enviroment of the parser. This information is
  159.  * persistent for main-items. The global enviroment can be saved and
  160.  * restored with PUSH/POP statements.
  161.  */
  162. struct hid_global {
  163. unsigned usage_page;
  164. __s32    logical_minimum;
  165. __s32    logical_maximum;
  166. __s32    physical_minimum;
  167. __s32    physical_maximum;
  168. unsigned unit_exponent;
  169. unsigned unit;
  170. unsigned report_id;
  171. unsigned report_size;
  172. unsigned report_count;
  173. };
  174. /*
  175.  * This is the local enviroment. It is resistent up the next main-item.
  176.  */
  177. #define HID_MAX_DESCRIPTOR_SIZE 4096
  178. #define HID_MAX_USAGES 1024
  179. #define HID_MAX_APPLICATIONS 16
  180. struct hid_local {
  181. unsigned usage[HID_MAX_USAGES]; /* usage array */
  182. unsigned usage_index;
  183. unsigned usage_minimum;
  184. unsigned delimiter_depth;
  185. unsigned delimiter_branch;
  186. };
  187. /*
  188.  * This is the collection stack. We climb up the stack to determine
  189.  * application and function of each field.
  190.  */
  191. struct hid_collection {
  192. unsigned type;
  193. unsigned usage;
  194. };
  195. struct hid_usage {
  196. unsigned  hid; /* hid usage code */
  197. __u16     code; /* input driver code */
  198. __u8      type; /* input driver type */
  199. __s8   hat_min; /* hat switch fun */
  200. __s8   hat_max; /* ditto */
  201. };
  202. struct hid_field {
  203. unsigned  physical; /* physical usage for this field */
  204. unsigned  logical; /* logical usage for this field */
  205. unsigned  application; /* application usage for this field */
  206. struct hid_usage *usage; /* usage table for this function */
  207. unsigned  maxusage; /* maximum usage index */
  208. unsigned  flags; /* main-item flags (i.e. volatile,array,constant) */
  209. unsigned  report_offset; /* bit offset in the report */
  210. unsigned  report_size; /* size of this field in the report */
  211. unsigned  report_count; /* number of this field in the report */
  212. unsigned  report_type; /* (input,output,feature) */
  213. __s32    *value; /* last known value(s) */
  214. __s32     logical_minimum;
  215. __s32     logical_maximum;
  216. __s32     physical_minimum;
  217. __s32     physical_maximum;
  218. unsigned  unit_exponent;
  219. unsigned  unit;
  220. struct hid_report *report; /* associated report */
  221. };
  222. #define HID_MAX_FIELDS 64
  223. struct hid_report {
  224. struct list_head list;
  225. unsigned id; /* id of this report */
  226. unsigned type; /* report type */
  227. struct hid_field *field[HID_MAX_FIELDS]; /* fields of the report */
  228. unsigned maxfield; /* maximum valid field index */
  229. unsigned size; /* size of the report (bits) */
  230. unsigned idx; /* where we're in data */
  231. unsigned char *data; /* data for multi-packet reports */
  232. struct hid_device *device; /* associated device */
  233. };
  234. struct hid_report_enum {
  235. unsigned numbered;
  236. struct list_head report_list;
  237. struct hid_report *report_id_hash[256];
  238. };
  239. #define HID_REPORT_TYPES 3
  240. #define HID_BUFFER_SIZE 32
  241. #define HID_CONTROL_FIFO_SIZE 8
  242. struct hid_control_fifo {
  243. struct usb_ctrlrequest dr;
  244. char buffer[HID_BUFFER_SIZE];
  245. };
  246. #define HID_CLAIMED_INPUT 1
  247. #define HID_CLAIMED_HIDDEV 2
  248. struct hid_device { /* device report descriptor */
  249.  __u8 *rdesc;
  250. unsigned rsize;
  251. unsigned application[HID_MAX_APPLICATIONS]; /* List of HID applications */
  252. unsigned maxapplication; /* Number of applications */
  253. unsigned version; /* HID version */
  254. unsigned country; /* HID country */
  255. struct hid_report_enum report_enum[HID_REPORT_TYPES];
  256. struct usb_device *dev; /* USB device */
  257. int ifnum; /* USB interface number */
  258. struct urb urb; /* USB URB structure */
  259. char buffer[HID_BUFFER_SIZE]; /* Rx buffer */
  260. struct urb urbout; /* Output URB */
  261. struct hid_control_fifo out[HID_CONTROL_FIFO_SIZE]; /* Transmit buffer */
  262. unsigned char outhead, outtail; /* Tx buffer head & tail */
  263. unsigned claimed; /* Claimed by hidinput, hiddev? */
  264. unsigned quirks; /* Various quirks the device can pull on us */
  265. struct input_dev input; /* The input structure */
  266. void *hiddev; /* The hiddev structure */
  267. int minor; /* Hiddev minor number */
  268. int open; /* is the device open by anyone? */
  269. char name[128]; /* Device name */
  270. };
  271. #define HID_GLOBAL_STACK_SIZE 4
  272. #define HID_COLLECTION_STACK_SIZE 4
  273. struct hid_parser {
  274. struct hid_global     global;
  275. struct hid_global     global_stack[HID_GLOBAL_STACK_SIZE];
  276. unsigned              global_stack_ptr;
  277. struct hid_local      local;
  278. struct hid_collection collection_stack[HID_COLLECTION_STACK_SIZE];
  279. unsigned              collection_stack_ptr;
  280. struct hid_device    *device;
  281. };
  282. struct hid_class_descriptor {
  283. __u8  bDescriptorType;
  284. __u16 wDescriptorLength;
  285. } __attribute__ ((packed));
  286. struct hid_descriptor {
  287. __u8  bLength;
  288. __u8  bDescriptorType;
  289. __u16 bcdHID;
  290. __u8  bCountryCode;
  291. __u8  bNumDescriptors;
  292. struct hid_class_descriptor desc[1];
  293. } __attribute__ ((packed));
  294. #ifdef DEBUG
  295. #include "hid-debug.h"
  296. #else
  297. #define hid_dump_input(a,b) do { } while (0)
  298. #define hid_dump_device(c) do { } while (0)
  299. #endif
  300. #endif
  301. #ifdef CONFIG_USB_HIDINPUT
  302. #define IS_INPUT_APPLICATION(a) (((a >= 0x00010000) && (a <= 0x00010008)) || (a == 0x00010080) || ( a == 0x000c0001))
  303. extern void hidinput_hid_event(struct hid_device *, struct hid_field *, struct hid_usage *, __s32);
  304. extern int hidinput_connect(struct hid_device *);
  305. extern void hidinput_disconnect(struct hid_device *);
  306. #else
  307. #define IS_INPUT_APPLICATION(a) (0)
  308. static inline void hidinput_hid_event(struct hid_device *hid, struct hid_field *field, struct hid_usage *usage, __s32 value) { }
  309. static inline int hidinput_connect(struct hid_device *hid) { return -ENODEV; }
  310. static inline void hidinput_disconnect(struct hid_device *hid) { }
  311. #endif
  312. int hid_open(struct hid_device *);
  313. void hid_close(struct hid_device *);
  314. int hid_find_field(struct hid_device *, unsigned int, unsigned int, struct hid_field **);
  315. int hid_set_field(struct hid_field *, unsigned, __s32);
  316. void hid_write_report(struct hid_device *, struct hid_report *);
  317. void hid_read_report(struct hid_device *, struct hid_report *);
  318. void hid_init_reports(struct hid_device *hid);