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