1*456279dfSlukem /* $NetBSD: onewire_subr.c,v 1.6 2007/12/11 12:36:02 lukem Exp $ */
2637bfc29Sriz /* $OpenBSD: onewire_subr.c,v 1.1 2006/03/04 16:27:03 grange Exp $ */
3637bfc29Sriz
4637bfc29Sriz /*
5637bfc29Sriz * Copyright (c) 2006 Alexander Yurchenko <grange@openbsd.org>
6637bfc29Sriz *
7637bfc29Sriz * Permission to use, copy, modify, and distribute this software for any
8637bfc29Sriz * purpose with or without fee is hereby granted, provided that the above
9637bfc29Sriz * copyright notice and this permission notice appear in all copies.
10637bfc29Sriz *
11637bfc29Sriz * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12637bfc29Sriz * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13637bfc29Sriz * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14637bfc29Sriz * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15637bfc29Sriz * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16637bfc29Sriz * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17637bfc29Sriz * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18637bfc29Sriz */
19637bfc29Sriz
20637bfc29Sriz /*
21637bfc29Sriz * 1-Wire bus miscellaneous routines.
22637bfc29Sriz */
23637bfc29Sriz
24*456279dfSlukem #include <sys/cdefs.h>
25*456279dfSlukem __KERNEL_RCSID(0, "$NetBSD: onewire_subr.c,v 1.6 2007/12/11 12:36:02 lukem Exp $");
26*456279dfSlukem
27637bfc29Sriz #include <sys/param.h>
28637bfc29Sriz #include <sys/systm.h>
29637bfc29Sriz #include <sys/device.h>
30637bfc29Sriz
31637bfc29Sriz #include <dev/onewire/onewiredevs.h>
32637bfc29Sriz #include <dev/onewire/onewirereg.h>
33637bfc29Sriz #include <dev/onewire/onewirevar.h>
34637bfc29Sriz
35637bfc29Sriz #ifdef ONEWIREVERBOSE
36637bfc29Sriz struct onewire_family {
37637bfc29Sriz int of_type;
38637bfc29Sriz const char * of_name;
39637bfc29Sriz };
40637bfc29Sriz #include <dev/onewire/onewiredevs_data.h>
41637bfc29Sriz #endif
42637bfc29Sriz
43637bfc29Sriz static const u_int8_t crctable[] = {
44637bfc29Sriz 0x00, 0x5e, 0xbc, 0xe2, 0x61, 0x3f, 0xdd, 0x83,
45637bfc29Sriz 0xc2, 0x9c, 0x7e, 0x20, 0xa3, 0xfd, 0x1f, 0x41,
46637bfc29Sriz 0x9d, 0xc3, 0x21, 0x7f, 0xfc, 0xa2, 0x40, 0x1e,
47637bfc29Sriz 0x5f, 0x01, 0xe3, 0xbd, 0x3e, 0x60, 0x82, 0xdc,
48637bfc29Sriz 0x23, 0x7d, 0x9f, 0xc1, 0x42, 0x1c, 0xfe, 0xa0,
49637bfc29Sriz 0xe1, 0xbf, 0x5d, 0x03, 0x80, 0xde, 0x3c, 0x62,
50637bfc29Sriz 0xbe, 0xe0, 0x02, 0x5c, 0xdf, 0x81, 0x63, 0x3d,
51637bfc29Sriz 0x7c, 0x22, 0xc0, 0x9e, 0x1d, 0x43, 0xa1, 0xff,
52637bfc29Sriz 0x46, 0x18, 0xfa, 0xa4, 0x27, 0x79, 0x9b, 0xc5,
53637bfc29Sriz 0x84, 0xda, 0x38, 0x66, 0xe5, 0xbb, 0x59, 0x07,
54637bfc29Sriz 0xdb, 0x85, 0x67, 0x39, 0xba, 0xe4, 0x06, 0x58,
55637bfc29Sriz 0x19, 0x47, 0xa5, 0xfb, 0x78, 0x26, 0xc4, 0x9a,
56637bfc29Sriz 0x65, 0x3b, 0xd9, 0x87, 0x04, 0x5a, 0xb8, 0xe6,
57637bfc29Sriz 0xa7, 0xf9, 0x1b, 0x45, 0xc6, 0x98, 0x7a, 0x24,
58637bfc29Sriz 0xf8, 0xa6, 0x44, 0x1a, 0x99, 0xc7, 0x25, 0x7b,
59637bfc29Sriz 0x3a, 0x64, 0x86, 0xd8, 0x5b, 0x05, 0xe7, 0xb9,
60637bfc29Sriz 0x8c, 0xd2, 0x30, 0x6e, 0xed, 0xb3, 0x51, 0x0f,
61637bfc29Sriz 0x4e, 0x10, 0xf2, 0xac, 0x2f, 0x71, 0x93, 0xcd,
62637bfc29Sriz 0x11, 0x4f, 0xad, 0xf3, 0x70, 0x2e, 0xcc, 0x92,
63637bfc29Sriz 0xd3, 0x8d, 0x6f, 0x31, 0xb2, 0xec, 0x0e, 0x50,
64637bfc29Sriz 0xaf, 0xf1, 0x13, 0x4d, 0xce, 0x90, 0x72, 0x2c,
65637bfc29Sriz 0x6d, 0x33, 0xd1, 0x8f, 0x0c, 0x52, 0xb0, 0xee,
66637bfc29Sriz 0x32, 0x6c, 0x8e, 0xd0, 0x53, 0x0d, 0xef, 0xb1,
67637bfc29Sriz 0xf0, 0xae, 0x4c, 0x12, 0x91, 0xcf, 0x2d, 0x73,
68637bfc29Sriz 0xca, 0x94, 0x76, 0x28, 0xab, 0xf5, 0x17, 0x49,
69637bfc29Sriz 0x08, 0x56, 0xb4, 0xea, 0x69, 0x37, 0xd5, 0x8b,
70637bfc29Sriz 0x57, 0x09, 0xeb, 0xb5, 0x36, 0x68, 0x8a, 0xd4,
71637bfc29Sriz 0x95, 0xcb, 0x29, 0x77, 0xf4, 0xaa, 0x48, 0x16,
72637bfc29Sriz 0xe9, 0xb7, 0x55, 0x0b, 0x88, 0xd6, 0x34, 0x6a,
73637bfc29Sriz 0x2b, 0x75, 0x97, 0xc9, 0x4a, 0x14, 0xf6, 0xa8,
74637bfc29Sriz 0x74, 0x2a, 0xc8, 0x96, 0x15, 0x4b, 0xa9, 0xf7,
75637bfc29Sriz 0xb6, 0xe8, 0x0a, 0x54, 0xd7, 0x89, 0x6b, 0x35
76637bfc29Sriz };
77637bfc29Sriz
78637bfc29Sriz int
onewire_crc(const void * buf,int len)79637bfc29Sriz onewire_crc(const void *buf, int len)
80637bfc29Sriz {
81637bfc29Sriz const u_int8_t *p = buf;
82637bfc29Sriz u_int8_t crc = 0;
83637bfc29Sriz
84637bfc29Sriz while (len--)
85637bfc29Sriz crc = crctable[crc ^ *p++];
86637bfc29Sriz
87637bfc29Sriz return (crc);
88637bfc29Sriz }
89637bfc29Sriz
90637bfc29Sriz const char *
onewire_famname(int type)91168cd830Schristos onewire_famname(int type)
92637bfc29Sriz {
93637bfc29Sriz #ifdef ONEWIREVERBOSE
94637bfc29Sriz const struct onewire_family *of;
95637bfc29Sriz
96637bfc29Sriz for (of = onewire_famtab; of->of_name != NULL; of++)
97637bfc29Sriz if (of->of_type == type)
98637bfc29Sriz return (of->of_name);
99637bfc29Sriz #endif
100637bfc29Sriz
101637bfc29Sriz return (NULL);
102637bfc29Sriz }
103637bfc29Sriz
104637bfc29Sriz int
onewire_matchbyfam(struct onewire_attach_args * oa,const struct onewire_matchfam * fams,int nent)105637bfc29Sriz onewire_matchbyfam(struct onewire_attach_args *oa,
106637bfc29Sriz const struct onewire_matchfam *fams, int nent)
107637bfc29Sriz {
108637bfc29Sriz const struct onewire_matchfam *om;
109637bfc29Sriz int i;
110637bfc29Sriz
111637bfc29Sriz for (i = 0, om = fams; i < nent; i++, om++)
112637bfc29Sriz if (ONEWIRE_ROM_FAMILY_TYPE(oa->oa_rom) == om->om_type)
113637bfc29Sriz return (1);
114637bfc29Sriz
115637bfc29Sriz return (0);
116637bfc29Sriz }
117