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