Home | History | Annotate | Line # | Download | only in usb
t_hid.c revision 1.7
      1  1.7  jakllsch /*	$NetBSD: t_hid.c,v 1.7 2016/05/05 16:55:56 jakllsch Exp $	*/
      2  1.1  jakllsch 
      3  1.1  jakllsch /*
      4  1.1  jakllsch  * Copyright (c) 2016 Jonathan A. Kollasch
      5  1.1  jakllsch  * All rights reserved.
      6  1.1  jakllsch  *
      7  1.1  jakllsch  * Redistribution and use in source and binary forms, with or without
      8  1.1  jakllsch  * modification, are permitted provided that the following conditions
      9  1.1  jakllsch  * are met:
     10  1.1  jakllsch  * 1. Redistributions of source code must retain the above copyright
     11  1.1  jakllsch  *    notice, this list of conditions and the following disclaimer.
     12  1.1  jakllsch  * 2. Redistributions in binary form must reproduce the above copyright
     13  1.1  jakllsch  *    notice, this list of conditions and the following disclaimer in the
     14  1.1  jakllsch  *    documentation and/or other materials provided with the distribution.
     15  1.1  jakllsch  *
     16  1.1  jakllsch  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     17  1.1  jakllsch  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     18  1.1  jakllsch  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     19  1.1  jakllsch  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
     20  1.1  jakllsch  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     21  1.1  jakllsch  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     22  1.1  jakllsch  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
     23  1.1  jakllsch  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
     24  1.1  jakllsch  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
     25  1.1  jakllsch  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
     26  1.1  jakllsch  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     27  1.1  jakllsch  */
     28  1.1  jakllsch 
     29  1.1  jakllsch #include <sys/cdefs.h>
     30  1.7  jakllsch __RCSID("$NetBSD: t_hid.c,v 1.7 2016/05/05 16:55:56 jakllsch Exp $");
     31  1.1  jakllsch 
     32  1.1  jakllsch #include <machine/types.h>
     33  1.1  jakllsch #include <stdlib.h>
     34  1.1  jakllsch #include <string.h>
     35  1.1  jakllsch #include <stdio.h>
     36  1.1  jakllsch #include <atf-c.h>
     37  1.6  jakllsch 
     38  1.6  jakllsch #include <rump/rump.h>
     39  1.6  jakllsch 
     40  1.1  jakllsch #define hid_start_parse rumpns_hid_start_parse
     41  1.1  jakllsch #define hid_end_parse rumpns_hid_end_parse
     42  1.1  jakllsch #define hid_get_item rumpns_hid_get_item
     43  1.1  jakllsch #define hid_locate rumpns_hid_locate
     44  1.1  jakllsch #define hid_report_size rumpns_hid_report_size
     45  1.1  jakllsch #define hid_get_data rumpns_hid_get_data
     46  1.1  jakllsch #define hid_get_udata rumpns_hid_get_udata
     47  1.1  jakllsch #define uhidevdebug rumpns_uhidevdebug
     48  1.4  jakllsch #include <usb.h>
     49  1.4  jakllsch #include <usbhid.h>
     50  1.1  jakllsch #include <hid.h>
     51  1.1  jakllsch 
     52  1.1  jakllsch #include "../../lib/libusbhid/hid_test_data.c"
     53  1.1  jakllsch 
     54  1.1  jakllsch #define MYd_ATF_CHECK_EQ(d, v) \
     55  1.1  jakllsch 	ATF_CHECK_EQ_MSG(d, v, "== %d", (d))
     56  1.1  jakllsch 
     57  1.1  jakllsch #define MYld_ATF_CHECK_EQ(d, v) \
     58  1.1  jakllsch 	ATF_CHECK_EQ_MSG(d, v, "== %ld", (d))
     59  1.1  jakllsch 
     60  1.1  jakllsch #define MYu_ATF_CHECK_EQ(d, v) \
     61  1.1  jakllsch 	ATF_CHECK_EQ_MSG(d, v, "== %u", (d))
     62  1.1  jakllsch 
     63  1.1  jakllsch #define MYlu_ATF_CHECK_EQ(d, v) \
     64  1.1  jakllsch 	ATF_CHECK_EQ_MSG(d, v, "== %lu", (d))
     65  1.1  jakllsch 
     66  1.1  jakllsch #define MYx_ATF_CHECK_EQ(d, v) \
     67  1.1  jakllsch 	ATF_CHECK_EQ_MSG(d, v, "== 0x%x", (d))
     68  1.1  jakllsch 
     69  1.1  jakllsch #define MYlx_ATF_CHECK_EQ(d, v) \
     70  1.1  jakllsch 	ATF_CHECK_EQ_MSG(d, v, "== 0x%lx", (d))
     71  1.1  jakllsch 
     72  1.1  jakllsch int uhidevdebug;
     73  1.1  jakllsch 
     74  1.1  jakllsch ATF_TC(khid);
     75  1.1  jakllsch 
     76  1.1  jakllsch ATF_TC_HEAD(khid, tc)
     77  1.1  jakllsch {
     78  1.1  jakllsch 
     79  1.1  jakllsch         atf_tc_set_md_var(tc, "descr", "check kernel hid.c");
     80  1.1  jakllsch }
     81  1.1  jakllsch 
     82  1.4  jakllsch static int
     83  1.4  jakllsch locate_item(const void *desc, int size, u_int32_t u, u_int8_t id,
     84  1.5  jakllsch     enum hid_kind k, struct hid_item *hip)
     85  1.4  jakllsch {
     86  1.4  jakllsch 	struct hid_data *d;
     87  1.4  jakllsch 	struct hid_item h;
     88  1.4  jakllsch 
     89  1.4  jakllsch 	h.report_ID = 0;
     90  1.4  jakllsch 	for (d = hid_start_parse(desc, size, k); hid_get_item(d, &h); ) {
     91  1.4  jakllsch 		if (h.kind == k && !(h.flags & HIO_CONST) &&
     92  1.4  jakllsch 		    (/*XXX*/uint32_t)h.usage == u && h.report_ID == id) {
     93  1.4  jakllsch 			if (hip != NULL)
     94  1.4  jakllsch 				*hip = h;
     95  1.4  jakllsch 			hid_end_parse(d);
     96  1.4  jakllsch 			return (1);
     97  1.4  jakllsch 		}
     98  1.4  jakllsch 	}
     99  1.4  jakllsch 	hid_end_parse(d);
    100  1.4  jakllsch 	return (0);
    101  1.4  jakllsch }
    102  1.4  jakllsch 
    103  1.1  jakllsch ATF_TC_BODY(khid, tc)
    104  1.1  jakllsch {
    105  1.1  jakllsch 	int ret;
    106  1.1  jakllsch 	struct hid_item hi;
    107  1.1  jakllsch 
    108  1.7  jakllsch 	atf_tc_expect_fail("test case does not use rump correctly");
    109  1.7  jakllsch 
    110  1.1  jakllsch 	uhidevdebug = 0;
    111  1.1  jakllsch 
    112  1.6  jakllsch 	rump_init();
    113  1.6  jakllsch 
    114  1.4  jakllsch 	ret = locate_item(range_test_report_descriptor,
    115  1.1  jakllsch 	    sizeof(range_test_report_descriptor), 0xff000003, 0, hid_input,
    116  1.5  jakllsch 	    &hi);
    117  1.1  jakllsch 	ATF_REQUIRE(ret > 0);
    118  1.1  jakllsch 	MYu_ATF_CHECK_EQ(hi.loc.size, 32);
    119  1.1  jakllsch 	MYu_ATF_CHECK_EQ(hi.loc.count, 1);
    120  1.1  jakllsch 	MYu_ATF_CHECK_EQ(hi.loc.pos, 0);
    121  1.5  jakllsch 	MYx_ATF_CHECK_EQ(hi.flags, 0);
    122  1.1  jakllsch 	MYd_ATF_CHECK_EQ(hi.logical_minimum, -2147483648);
    123  1.1  jakllsch 	MYd_ATF_CHECK_EQ(hi.logical_maximum, 2147483647);
    124  1.1  jakllsch 	MYd_ATF_CHECK_EQ(hi.physical_minimum, -2147483648);
    125  1.1  jakllsch 	MYd_ATF_CHECK_EQ(hi.physical_maximum, 2147483647);
    126  1.1  jakllsch 	MYld_ATF_CHECK_EQ(hid_get_data(range_test_minimum_report,
    127  1.1  jakllsch 	    &hi.loc), -2147483648);
    128  1.1  jakllsch 	MYld_ATF_CHECK_EQ(hid_get_data(range_test_negative_one_report,
    129  1.1  jakllsch 	    &hi.loc), -1);
    130  1.1  jakllsch 	MYld_ATF_CHECK_EQ(hid_get_data(range_test_positive_one_report,
    131  1.1  jakllsch 	    &hi.loc), 1);
    132  1.1  jakllsch 	MYld_ATF_CHECK_EQ(hid_get_data(range_test_maximum_report,
    133  1.1  jakllsch 	    &hi.loc), 2147483647);
    134  1.1  jakllsch 
    135  1.4  jakllsch 	ret = locate_item(range_test_report_descriptor,
    136  1.1  jakllsch 	    sizeof(range_test_report_descriptor), 0xff000002, 0, hid_input,
    137  1.5  jakllsch 	    &hi);
    138  1.1  jakllsch 	ATF_REQUIRE(ret > 0);
    139  1.1  jakllsch 	MYu_ATF_CHECK_EQ(hi.loc.size, 16);
    140  1.1  jakllsch 	MYu_ATF_CHECK_EQ(hi.loc.count, 1);
    141  1.1  jakllsch 	MYu_ATF_CHECK_EQ(hi.loc.pos, 32);
    142  1.5  jakllsch 	MYx_ATF_CHECK_EQ(hi.flags, 0);
    143  1.1  jakllsch 	MYd_ATF_CHECK_EQ(hi.logical_minimum, -32768);
    144  1.1  jakllsch 	MYd_ATF_CHECK_EQ(hi.logical_maximum, 32767);
    145  1.1  jakllsch 	MYd_ATF_CHECK_EQ(hi.physical_minimum, -32768);
    146  1.1  jakllsch 	MYd_ATF_CHECK_EQ(hi.physical_maximum, 32767);
    147  1.1  jakllsch 	MYld_ATF_CHECK_EQ(hid_get_data(range_test_minimum_report,
    148  1.1  jakllsch 	    &hi.loc), -32768);
    149  1.1  jakllsch 	MYld_ATF_CHECK_EQ(hid_get_data(range_test_negative_one_report,
    150  1.1  jakllsch 	    &hi.loc), -1);
    151  1.1  jakllsch 	MYld_ATF_CHECK_EQ(hid_get_data(range_test_positive_one_report,
    152  1.1  jakllsch 	    &hi.loc), 1);
    153  1.1  jakllsch 	MYld_ATF_CHECK_EQ(hid_get_data(range_test_maximum_report,
    154  1.1  jakllsch 	    &hi.loc), 32767);
    155  1.1  jakllsch 
    156  1.4  jakllsch 	ret = locate_item(range_test_report_descriptor,
    157  1.1  jakllsch 	    sizeof(range_test_report_descriptor), 0xff000001, 0, hid_input,
    158  1.5  jakllsch 	    &hi);
    159  1.1  jakllsch 	ATF_REQUIRE(ret > 0);
    160  1.1  jakllsch 	MYu_ATF_CHECK_EQ(hi.loc.size, 8);
    161  1.1  jakllsch 	MYu_ATF_CHECK_EQ(hi.loc.count, 1);
    162  1.1  jakllsch 	MYu_ATF_CHECK_EQ(hi.loc.pos, 48);
    163  1.5  jakllsch 	MYx_ATF_CHECK_EQ(hi.flags, 0);
    164  1.1  jakllsch 	MYd_ATF_CHECK_EQ(hi.logical_minimum, -128);
    165  1.1  jakllsch 	MYd_ATF_CHECK_EQ(hi.logical_maximum, 127);
    166  1.1  jakllsch 	MYd_ATF_CHECK_EQ(hi.physical_minimum, -128);
    167  1.1  jakllsch 	MYd_ATF_CHECK_EQ(hi.physical_maximum, 127);
    168  1.1  jakllsch 	MYld_ATF_CHECK_EQ(hid_get_data(range_test_minimum_report,
    169  1.1  jakllsch 	    &hi.loc), -128);
    170  1.1  jakllsch 	MYld_ATF_CHECK_EQ(hid_get_data(range_test_negative_one_report,
    171  1.1  jakllsch 	    &hi.loc), -1);
    172  1.1  jakllsch 	MYld_ATF_CHECK_EQ(hid_get_data(range_test_positive_one_report,
    173  1.1  jakllsch 	    &hi.loc), 1);
    174  1.1  jakllsch 	MYld_ATF_CHECK_EQ(hid_get_data(range_test_maximum_report,
    175  1.1  jakllsch 	    &hi.loc), 127);
    176  1.1  jakllsch 
    177  1.1  jakllsch 
    178  1.4  jakllsch 	ret = locate_item(unsigned_range_test_report_descriptor,
    179  1.1  jakllsch 	    sizeof(unsigned_range_test_report_descriptor), 0xff000013, 0,
    180  1.5  jakllsch 	    hid_input, &hi);
    181  1.1  jakllsch 	ATF_REQUIRE(ret > 0);
    182  1.1  jakllsch 	MYu_ATF_CHECK_EQ(hi.loc.size, 32);
    183  1.1  jakllsch 	MYu_ATF_CHECK_EQ(hi.loc.count, 1);
    184  1.1  jakllsch 	MYu_ATF_CHECK_EQ(hi.loc.pos, 0);
    185  1.5  jakllsch 	MYx_ATF_CHECK_EQ(hi.flags, 0);
    186  1.1  jakllsch 	MYlx_ATF_CHECK_EQ(hid_get_udata(unsigned_range_test_minimum_report,
    187  1.1  jakllsch 	    &hi.loc), 0x0);
    188  1.1  jakllsch 	MYlx_ATF_CHECK_EQ(hid_get_udata(unsigned_range_test_positive_one_report,
    189  1.1  jakllsch 	    &hi.loc), 0x1);
    190  1.1  jakllsch 	MYlx_ATF_CHECK_EQ(hid_get_udata(unsigned_range_test_negative_one_report,
    191  1.1  jakllsch 	    &hi.loc), 0xfffffffe);
    192  1.1  jakllsch 	MYlx_ATF_CHECK_EQ(hid_get_udata(unsigned_range_test_maximum_report,
    193  1.1  jakllsch 	    &hi.loc), 0xffffffff);
    194  1.1  jakllsch 
    195  1.4  jakllsch 	ret = locate_item(unsigned_range_test_report_descriptor,
    196  1.1  jakllsch 	    sizeof(unsigned_range_test_report_descriptor), 0xff000012, 0,
    197  1.5  jakllsch 	    hid_input, &hi);
    198  1.1  jakllsch 	ATF_REQUIRE(ret > 0);
    199  1.1  jakllsch 	MYu_ATF_CHECK_EQ(hi.loc.size, 16);
    200  1.1  jakllsch 	MYu_ATF_CHECK_EQ(hi.loc.count, 1);
    201  1.1  jakllsch 	MYu_ATF_CHECK_EQ(hi.loc.pos, 32);
    202  1.5  jakllsch 	MYx_ATF_CHECK_EQ(hi.flags, 0);
    203  1.1  jakllsch 	MYlx_ATF_CHECK_EQ(hid_get_udata(unsigned_range_test_minimum_report,
    204  1.1  jakllsch 	    &hi.loc), 0x0);
    205  1.1  jakllsch 	MYlx_ATF_CHECK_EQ(hid_get_udata(unsigned_range_test_positive_one_report,
    206  1.1  jakllsch 	    &hi.loc), 0x1);
    207  1.1  jakllsch 	MYlx_ATF_CHECK_EQ(hid_get_udata(unsigned_range_test_negative_one_report,
    208  1.1  jakllsch 	    &hi.loc), 0xfffe);
    209  1.1  jakllsch 	MYlx_ATF_CHECK_EQ(hid_get_udata(unsigned_range_test_maximum_report,
    210  1.1  jakllsch 	    &hi.loc), 0xffff);
    211  1.1  jakllsch 
    212  1.4  jakllsch 	ret = locate_item(unsigned_range_test_report_descriptor,
    213  1.1  jakllsch 	    sizeof(unsigned_range_test_report_descriptor), 0xff000011, 0,
    214  1.5  jakllsch 	    hid_input, &hi);
    215  1.1  jakllsch 	ATF_REQUIRE(ret > 0);
    216  1.1  jakllsch 	MYu_ATF_CHECK_EQ(hi.loc.size, 8);
    217  1.1  jakllsch 	MYu_ATF_CHECK_EQ(hi.loc.count, 1);
    218  1.1  jakllsch 	MYu_ATF_CHECK_EQ(hi.loc.pos, 48);
    219  1.5  jakllsch 	MYx_ATF_CHECK_EQ(hi.flags, 0);
    220  1.1  jakllsch 	MYlx_ATF_CHECK_EQ(hid_get_udata(unsigned_range_test_minimum_report,
    221  1.1  jakllsch 	    &hi.loc), 0x0);
    222  1.1  jakllsch 	MYlx_ATF_CHECK_EQ(hid_get_udata(unsigned_range_test_positive_one_report,
    223  1.1  jakllsch 	    &hi.loc), 0x1);
    224  1.1  jakllsch 	MYlx_ATF_CHECK_EQ(hid_get_udata(unsigned_range_test_negative_one_report,
    225  1.1  jakllsch 	    &hi.loc), 0xfe);
    226  1.1  jakllsch 	MYlx_ATF_CHECK_EQ(hid_get_udata(unsigned_range_test_maximum_report,
    227  1.1  jakllsch 	    &hi.loc), 0xff);
    228  1.1  jakllsch }
    229  1.1  jakllsch 
    230  1.2  jakllsch ATF_TC(khid_parse_just_pop);
    231  1.2  jakllsch 
    232  1.2  jakllsch ATF_TC_HEAD(khid_parse_just_pop, tc)
    233  1.2  jakllsch {
    234  1.2  jakllsch 
    235  1.2  jakllsch         atf_tc_set_md_var(tc, "descr", "check kernel hid.c for "
    236  1.2  jakllsch 	    "Pop on empty stack bug");
    237  1.2  jakllsch }
    238  1.2  jakllsch 
    239  1.2  jakllsch ATF_TC_BODY(khid_parse_just_pop, tc)
    240  1.2  jakllsch {
    241  1.2  jakllsch 	struct hid_data *hdp;
    242  1.2  jakllsch 	struct hid_item hi;
    243  1.2  jakllsch 
    244  1.7  jakllsch 	atf_tc_expect_fail("test case does not use rump correctly");
    245  1.7  jakllsch 
    246  1.6  jakllsch 	rump_init();
    247  1.6  jakllsch 
    248  1.2  jakllsch 	hdp = hid_start_parse(just_pop_report_descriptor,
    249  1.2  jakllsch 	    sizeof just_pop_report_descriptor, hid_none);
    250  1.2  jakllsch 	while (hid_get_item(hdp, &hi) > 0) {
    251  1.2  jakllsch 	}
    252  1.2  jakllsch 	hid_end_parse(hdp);
    253  1.2  jakllsch }
    254  1.2  jakllsch 
    255  1.1  jakllsch ATF_TP_ADD_TCS(tp)
    256  1.1  jakllsch {
    257  1.1  jakllsch 
    258  1.1  jakllsch         ATF_TP_ADD_TC(tp, khid);
    259  1.2  jakllsch         ATF_TP_ADD_TC(tp, khid_parse_just_pop);
    260  1.1  jakllsch 
    261  1.1  jakllsch 	return atf_no_error();
    262  1.1  jakllsch }
    263  1.1  jakllsch 
    264