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