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