onewire_subr.c revision 1.3.2.2 1 1.3.2.2 elad /* $NetBSD: onewire_subr.c,v 1.3.2.2 2006/04/19 03:25:33 elad Exp $ */
2 1.3.2.2 elad /* $OpenBSD: onewire_subr.c,v 1.1 2006/03/04 16:27:03 grange Exp $ */
3 1.3.2.2 elad
4 1.3.2.2 elad /*
5 1.3.2.2 elad * Copyright (c) 2006 Alexander Yurchenko <grange (at) openbsd.org>
6 1.3.2.2 elad *
7 1.3.2.2 elad * Permission to use, copy, modify, and distribute this software for any
8 1.3.2.2 elad * purpose with or without fee is hereby granted, provided that the above
9 1.3.2.2 elad * copyright notice and this permission notice appear in all copies.
10 1.3.2.2 elad *
11 1.3.2.2 elad * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12 1.3.2.2 elad * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13 1.3.2.2 elad * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14 1.3.2.2 elad * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15 1.3.2.2 elad * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16 1.3.2.2 elad * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17 1.3.2.2 elad * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18 1.3.2.2 elad */
19 1.3.2.2 elad
20 1.3.2.2 elad /*
21 1.3.2.2 elad * 1-Wire bus miscellaneous routines.
22 1.3.2.2 elad */
23 1.3.2.2 elad
24 1.3.2.2 elad #include <sys/param.h>
25 1.3.2.2 elad #include <sys/systm.h>
26 1.3.2.2 elad #include <sys/device.h>
27 1.3.2.2 elad
28 1.3.2.2 elad #include <dev/onewire/onewiredevs.h>
29 1.3.2.2 elad #include <dev/onewire/onewirereg.h>
30 1.3.2.2 elad #include <dev/onewire/onewirevar.h>
31 1.3.2.2 elad
32 1.3.2.2 elad #ifdef ONEWIREVERBOSE
33 1.3.2.2 elad struct onewire_family {
34 1.3.2.2 elad int of_type;
35 1.3.2.2 elad const char * of_name;
36 1.3.2.2 elad };
37 1.3.2.2 elad #include <dev/onewire/onewiredevs_data.h>
38 1.3.2.2 elad #endif
39 1.3.2.2 elad
40 1.3.2.2 elad static const u_int8_t crctable[] = {
41 1.3.2.2 elad 0x00, 0x5e, 0xbc, 0xe2, 0x61, 0x3f, 0xdd, 0x83,
42 1.3.2.2 elad 0xc2, 0x9c, 0x7e, 0x20, 0xa3, 0xfd, 0x1f, 0x41,
43 1.3.2.2 elad 0x9d, 0xc3, 0x21, 0x7f, 0xfc, 0xa2, 0x40, 0x1e,
44 1.3.2.2 elad 0x5f, 0x01, 0xe3, 0xbd, 0x3e, 0x60, 0x82, 0xdc,
45 1.3.2.2 elad 0x23, 0x7d, 0x9f, 0xc1, 0x42, 0x1c, 0xfe, 0xa0,
46 1.3.2.2 elad 0xe1, 0xbf, 0x5d, 0x03, 0x80, 0xde, 0x3c, 0x62,
47 1.3.2.2 elad 0xbe, 0xe0, 0x02, 0x5c, 0xdf, 0x81, 0x63, 0x3d,
48 1.3.2.2 elad 0x7c, 0x22, 0xc0, 0x9e, 0x1d, 0x43, 0xa1, 0xff,
49 1.3.2.2 elad 0x46, 0x18, 0xfa, 0xa4, 0x27, 0x79, 0x9b, 0xc5,
50 1.3.2.2 elad 0x84, 0xda, 0x38, 0x66, 0xe5, 0xbb, 0x59, 0x07,
51 1.3.2.2 elad 0xdb, 0x85, 0x67, 0x39, 0xba, 0xe4, 0x06, 0x58,
52 1.3.2.2 elad 0x19, 0x47, 0xa5, 0xfb, 0x78, 0x26, 0xc4, 0x9a,
53 1.3.2.2 elad 0x65, 0x3b, 0xd9, 0x87, 0x04, 0x5a, 0xb8, 0xe6,
54 1.3.2.2 elad 0xa7, 0xf9, 0x1b, 0x45, 0xc6, 0x98, 0x7a, 0x24,
55 1.3.2.2 elad 0xf8, 0xa6, 0x44, 0x1a, 0x99, 0xc7, 0x25, 0x7b,
56 1.3.2.2 elad 0x3a, 0x64, 0x86, 0xd8, 0x5b, 0x05, 0xe7, 0xb9,
57 1.3.2.2 elad 0x8c, 0xd2, 0x30, 0x6e, 0xed, 0xb3, 0x51, 0x0f,
58 1.3.2.2 elad 0x4e, 0x10, 0xf2, 0xac, 0x2f, 0x71, 0x93, 0xcd,
59 1.3.2.2 elad 0x11, 0x4f, 0xad, 0xf3, 0x70, 0x2e, 0xcc, 0x92,
60 1.3.2.2 elad 0xd3, 0x8d, 0x6f, 0x31, 0xb2, 0xec, 0x0e, 0x50,
61 1.3.2.2 elad 0xaf, 0xf1, 0x13, 0x4d, 0xce, 0x90, 0x72, 0x2c,
62 1.3.2.2 elad 0x6d, 0x33, 0xd1, 0x8f, 0x0c, 0x52, 0xb0, 0xee,
63 1.3.2.2 elad 0x32, 0x6c, 0x8e, 0xd0, 0x53, 0x0d, 0xef, 0xb1,
64 1.3.2.2 elad 0xf0, 0xae, 0x4c, 0x12, 0x91, 0xcf, 0x2d, 0x73,
65 1.3.2.2 elad 0xca, 0x94, 0x76, 0x28, 0xab, 0xf5, 0x17, 0x49,
66 1.3.2.2 elad 0x08, 0x56, 0xb4, 0xea, 0x69, 0x37, 0xd5, 0x8b,
67 1.3.2.2 elad 0x57, 0x09, 0xeb, 0xb5, 0x36, 0x68, 0x8a, 0xd4,
68 1.3.2.2 elad 0x95, 0xcb, 0x29, 0x77, 0xf4, 0xaa, 0x48, 0x16,
69 1.3.2.2 elad 0xe9, 0xb7, 0x55, 0x0b, 0x88, 0xd6, 0x34, 0x6a,
70 1.3.2.2 elad 0x2b, 0x75, 0x97, 0xc9, 0x4a, 0x14, 0xf6, 0xa8,
71 1.3.2.2 elad 0x74, 0x2a, 0xc8, 0x96, 0x15, 0x4b, 0xa9, 0xf7,
72 1.3.2.2 elad 0xb6, 0xe8, 0x0a, 0x54, 0xd7, 0x89, 0x6b, 0x35
73 1.3.2.2 elad };
74 1.3.2.2 elad
75 1.3.2.2 elad int
76 1.3.2.2 elad onewire_crc(const void *buf, int len)
77 1.3.2.2 elad {
78 1.3.2.2 elad const u_int8_t *p = buf;
79 1.3.2.2 elad u_int8_t crc = 0;
80 1.3.2.2 elad
81 1.3.2.2 elad while (len--)
82 1.3.2.2 elad crc = crctable[crc ^ *p++];
83 1.3.2.2 elad
84 1.3.2.2 elad return (crc);
85 1.3.2.2 elad }
86 1.3.2.2 elad
87 1.3.2.2 elad const char *
88 1.3.2.2 elad onewire_famname(int type)
89 1.3.2.2 elad {
90 1.3.2.2 elad #ifdef ONEWIREVERBOSE
91 1.3.2.2 elad const struct onewire_family *of;
92 1.3.2.2 elad
93 1.3.2.2 elad for (of = onewire_famtab; of->of_name != NULL; of++)
94 1.3.2.2 elad if (of->of_type == type)
95 1.3.2.2 elad return (of->of_name);
96 1.3.2.2 elad #endif
97 1.3.2.2 elad
98 1.3.2.2 elad return (NULL);
99 1.3.2.2 elad }
100 1.3.2.2 elad
101 1.3.2.2 elad int
102 1.3.2.2 elad onewire_matchbyfam(struct onewire_attach_args *oa,
103 1.3.2.2 elad const struct onewire_matchfam *fams, int nent)
104 1.3.2.2 elad {
105 1.3.2.2 elad const struct onewire_matchfam *om;
106 1.3.2.2 elad int i;
107 1.3.2.2 elad
108 1.3.2.2 elad for (i = 0, om = fams; i < nent; i++, om++)
109 1.3.2.2 elad if (ONEWIRE_ROM_FAMILY_TYPE(oa->oa_rom) == om->om_type)
110 1.3.2.2 elad return (1);
111 1.3.2.2 elad
112 1.3.2.2 elad return (0);
113 1.3.2.2 elad }
114