Home | History | Annotate | Line # | Download | only in onewire
      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