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