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