1 /* Author: Domen Puncer <domen@cba.si>. License: WTFPL, see file LICENSE */
2 #include <drivers/bitbang_1w.h>
3 #include <drivers/1w.h>
11 * One wire over GPIO. Supports parasitic nodes.
12 * The only thing you need to do is put a 1k+ pull-up on 1-wire line.
16 static int bitbang_1w_reset(struct w1_master
*master
)
18 struct bitbang_1w_data
*chip
= master
->priv
;
22 gpio_init(pin
, GPIO_OUTPUT
, 0);
24 gpio_init(pin
, GPIO_INPUT
, 0);
26 /* 15-60 of delay, then 60-240us long presence slot */
28 present
= gpio_get(pin
);
30 present
|= gpio_get(pin
)<<1;
39 * here's how I did it:
40 * write 1/read: out 0, 2us, in (1), 10us, read, 50us (total of 62us)
41 * write 0: out 0, 60us, in (1), 2us (total of 62us)
43 static int bitbang_1w_single_bit(int pin
, int bit
)
47 gpio_init(pin
, GPIO_OUTPUT
, 0);
49 gpio_init(pin
, GPIO_INPUT
, 0);
55 gpio_init(pin
, GPIO_OUTPUT
, 0);
57 gpio_init(pin
, GPIO_INPUT
, 0);
64 static int bitbang_1w_write(struct w1_master
*master
, u8 data
)
66 struct bitbang_1w_data
*chip
= master
->priv
;
73 bitbang_1w_single_bit(pin
, data
&1);
81 static int bitbang_1w_read(struct w1_master
*master
)
83 struct bitbang_1w_data
*chip
= master
->priv
;
91 data
|= bitbang_1w_single_bit(pin
, 1) << i
;
98 /* dir - 0/1 direction to take in case of device conflict */
99 static int bitbang_1w_triplet(struct w1_master
*master
, int dir
)
101 struct bitbang_1w_data
*chip
= master
->priv
;
106 int bit1
= bitbang_1w_single_bit(pin
, 1);
107 int bit2
= bitbang_1w_single_bit(pin
, 1);
110 bitbang_1w_single_bit(pin
, bit1
);
112 bitbang_1w_single_bit(pin
, dir
);
120 /* error, no device pulled the bit low */
121 if (bit1
== 1 && bit2
== 1)
125 if (bit1
== 0 && bit2
== 0)
130 int bitbang_1w_register(struct w1_master
*master
)
132 struct bitbang_1w_data
*chip
= master
->priv
;
135 gpio_init(pin
, GPIO_INPUT
, 0);
137 master
->w1_reset
= bitbang_1w_reset
;
138 master
->w1_triplet
= bitbang_1w_triplet
;
139 master
->w1_write
= bitbang_1w_write
;
140 master
->w1_read
= bitbang_1w_read
;