onewire_subr.c revision 1.3.20.1 1 1.3.20.1 yamt /* $NetBSD: onewire_subr.c,v 1.3.20.1 2006/10/22 06:06:15 yamt 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.1 riz #include <sys/param.h>
25 1.1 riz #include <sys/systm.h>
26 1.1 riz #include <sys/device.h>
27 1.1 riz
28 1.1 riz #include <dev/onewire/onewiredevs.h>
29 1.1 riz #include <dev/onewire/onewirereg.h>
30 1.1 riz #include <dev/onewire/onewirevar.h>
31 1.1 riz
32 1.1 riz #ifdef ONEWIREVERBOSE
33 1.1 riz struct onewire_family {
34 1.1 riz int of_type;
35 1.1 riz const char * of_name;
36 1.1 riz };
37 1.1 riz #include <dev/onewire/onewiredevs_data.h>
38 1.1 riz #endif
39 1.1 riz
40 1.1 riz static const u_int8_t crctable[] = {
41 1.1 riz 0x00, 0x5e, 0xbc, 0xe2, 0x61, 0x3f, 0xdd, 0x83,
42 1.1 riz 0xc2, 0x9c, 0x7e, 0x20, 0xa3, 0xfd, 0x1f, 0x41,
43 1.1 riz 0x9d, 0xc3, 0x21, 0x7f, 0xfc, 0xa2, 0x40, 0x1e,
44 1.1 riz 0x5f, 0x01, 0xe3, 0xbd, 0x3e, 0x60, 0x82, 0xdc,
45 1.1 riz 0x23, 0x7d, 0x9f, 0xc1, 0x42, 0x1c, 0xfe, 0xa0,
46 1.1 riz 0xe1, 0xbf, 0x5d, 0x03, 0x80, 0xde, 0x3c, 0x62,
47 1.1 riz 0xbe, 0xe0, 0x02, 0x5c, 0xdf, 0x81, 0x63, 0x3d,
48 1.1 riz 0x7c, 0x22, 0xc0, 0x9e, 0x1d, 0x43, 0xa1, 0xff,
49 1.1 riz 0x46, 0x18, 0xfa, 0xa4, 0x27, 0x79, 0x9b, 0xc5,
50 1.1 riz 0x84, 0xda, 0x38, 0x66, 0xe5, 0xbb, 0x59, 0x07,
51 1.1 riz 0xdb, 0x85, 0x67, 0x39, 0xba, 0xe4, 0x06, 0x58,
52 1.1 riz 0x19, 0x47, 0xa5, 0xfb, 0x78, 0x26, 0xc4, 0x9a,
53 1.1 riz 0x65, 0x3b, 0xd9, 0x87, 0x04, 0x5a, 0xb8, 0xe6,
54 1.1 riz 0xa7, 0xf9, 0x1b, 0x45, 0xc6, 0x98, 0x7a, 0x24,
55 1.1 riz 0xf8, 0xa6, 0x44, 0x1a, 0x99, 0xc7, 0x25, 0x7b,
56 1.1 riz 0x3a, 0x64, 0x86, 0xd8, 0x5b, 0x05, 0xe7, 0xb9,
57 1.1 riz 0x8c, 0xd2, 0x30, 0x6e, 0xed, 0xb3, 0x51, 0x0f,
58 1.1 riz 0x4e, 0x10, 0xf2, 0xac, 0x2f, 0x71, 0x93, 0xcd,
59 1.1 riz 0x11, 0x4f, 0xad, 0xf3, 0x70, 0x2e, 0xcc, 0x92,
60 1.1 riz 0xd3, 0x8d, 0x6f, 0x31, 0xb2, 0xec, 0x0e, 0x50,
61 1.1 riz 0xaf, 0xf1, 0x13, 0x4d, 0xce, 0x90, 0x72, 0x2c,
62 1.1 riz 0x6d, 0x33, 0xd1, 0x8f, 0x0c, 0x52, 0xb0, 0xee,
63 1.1 riz 0x32, 0x6c, 0x8e, 0xd0, 0x53, 0x0d, 0xef, 0xb1,
64 1.1 riz 0xf0, 0xae, 0x4c, 0x12, 0x91, 0xcf, 0x2d, 0x73,
65 1.1 riz 0xca, 0x94, 0x76, 0x28, 0xab, 0xf5, 0x17, 0x49,
66 1.1 riz 0x08, 0x56, 0xb4, 0xea, 0x69, 0x37, 0xd5, 0x8b,
67 1.1 riz 0x57, 0x09, 0xeb, 0xb5, 0x36, 0x68, 0x8a, 0xd4,
68 1.1 riz 0x95, 0xcb, 0x29, 0x77, 0xf4, 0xaa, 0x48, 0x16,
69 1.1 riz 0xe9, 0xb7, 0x55, 0x0b, 0x88, 0xd6, 0x34, 0x6a,
70 1.1 riz 0x2b, 0x75, 0x97, 0xc9, 0x4a, 0x14, 0xf6, 0xa8,
71 1.1 riz 0x74, 0x2a, 0xc8, 0x96, 0x15, 0x4b, 0xa9, 0xf7,
72 1.1 riz 0xb6, 0xe8, 0x0a, 0x54, 0xd7, 0x89, 0x6b, 0x35
73 1.1 riz };
74 1.1 riz
75 1.1 riz int
76 1.1 riz onewire_crc(const void *buf, int len)
77 1.1 riz {
78 1.1 riz const u_int8_t *p = buf;
79 1.1 riz u_int8_t crc = 0;
80 1.1 riz
81 1.1 riz while (len--)
82 1.1 riz crc = crctable[crc ^ *p++];
83 1.1 riz
84 1.1 riz return (crc);
85 1.1 riz }
86 1.1 riz
87 1.1 riz const char *
88 1.3.20.1 yamt onewire_famname(int type __unused)
89 1.1 riz {
90 1.1 riz #ifdef ONEWIREVERBOSE
91 1.1 riz const struct onewire_family *of;
92 1.1 riz
93 1.1 riz for (of = onewire_famtab; of->of_name != NULL; of++)
94 1.1 riz if (of->of_type == type)
95 1.1 riz return (of->of_name);
96 1.1 riz #endif
97 1.1 riz
98 1.1 riz return (NULL);
99 1.1 riz }
100 1.1 riz
101 1.1 riz int
102 1.1 riz onewire_matchbyfam(struct onewire_attach_args *oa,
103 1.1 riz const struct onewire_matchfam *fams, int nent)
104 1.1 riz {
105 1.1 riz const struct onewire_matchfam *om;
106 1.1 riz int i;
107 1.1 riz
108 1.1 riz for (i = 0, om = fams; i < nent; i++, om++)
109 1.1 riz if (ONEWIRE_ROM_FAMILY_TYPE(oa->oa_rom) == om->om_type)
110 1.1 riz return (1);
111 1.1 riz
112 1.1 riz return (0);
113 1.1 riz }
114