1 /* $OpenBSD: onewire_bitbang.c,v 1.1 2006/03/04 16:27:03 grange Exp $ */ 2 3 /* 4 * Copyright (c) 2006 Alexander Yurchenko <grange@openbsd.org> 5 * 6 * Permission to use, copy, modify, and distribute this software for any 7 * purpose with or without fee is hereby granted, provided that the above 8 * copyright notice and this permission notice appear in all copies. 9 * 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17 */ 18 19 /* 20 * 1-Wire bus bit-banging routines. 21 */ 22 23 #include <sys/param.h> 24 #include <sys/systm.h> 25 #include <sys/device.h> 26 27 #include <dev/onewire/onewirevar.h> 28 29 int 30 onewire_bb_reset(const struct onewire_bbops *ops, void *arg) 31 { 32 int s, rv, i; 33 34 s = splhigh(); 35 ops->bb_tx(arg); 36 ops->bb_set(arg, 0); 37 DELAY(480); 38 ops->bb_set(arg, 1); 39 ops->bb_rx(arg); 40 DELAY(30); 41 for (i = 0; i < 6; i++) { 42 if ((rv = ops->bb_get(arg)) == 0) 43 break; 44 DELAY(20); 45 } 46 DELAY(450); 47 splx(s); 48 49 return (rv); 50 } 51 52 int 53 onewire_bb_bit(const struct onewire_bbops *ops, void *arg, int value) 54 { 55 int s, rv, i; 56 57 s = splhigh(); 58 ops->bb_tx(arg); 59 ops->bb_set(arg, 0); 60 DELAY(2); 61 if (value) { 62 ops->bb_set(arg, 1); 63 ops->bb_rx(arg); 64 for (i = 0; i < 15; i++) { 65 if ((rv = ops->bb_get(arg)) == 0) 66 break; 67 DELAY(2); 68 } 69 ops->bb_tx(arg); 70 } 71 DELAY(60); 72 ops->bb_set(arg, 1); 73 DELAY(5); 74 splx(s); 75 76 return (rv); 77 } 78