Commit c3098356 authored by Dmitry Khromov's avatar Dmitry Khromov Committed by Greg Kroah-Hartman

w1: introduce an ability to specify microseconds bus scanning intervals

Some of 1-Wire devices commonly associated with physical access control
systems are attached/generate presence for as short as 100 ms - hence
the tens-to-hundreds milliseconds scan intervals are required.
Signed-off-by: default avatarDmitry Khromov <dk@icelogic.net>
Acked-by: default avatarEvgeniy Polyakov <zbr@ioremap.net>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 99b7e93c
What: /sys/bus/w1/devices/.../w1_master_timeout_us
Date: April 2015
Contact: Dmitry Khromov <dk@icelogic.net>
Description: Bus scanning interval, microseconds component.
Some of 1-Wire devices commonly associated with physical access
control systems are attached/generate presence for as short as
100 ms - hence the tens-to-hundreds milliseconds scan intervals
are required.
see Documentation/w1/w1.generic for detailed information.
Users: any user space application which wants to know bus scanning
interval
...@@ -76,21 +76,24 @@ See struct w1_bus_master definition in w1.h for details. ...@@ -76,21 +76,24 @@ See struct w1_bus_master definition in w1.h for details.
w1 master sysfs interface w1 master sysfs interface
------------------------------------------------------------------ ------------------------------------------------------------------
<xx-xxxxxxxxxxxxx> - a directory for a found device. The format is family-serial <xx-xxxxxxxxxxxxx> - A directory for a found device. The format is family-serial
bus - (standard) symlink to the w1 bus bus - (standard) symlink to the w1 bus
driver - (standard) symlink to the w1 driver driver - (standard) symlink to the w1 driver
w1_master_add - Manually register a slave device w1_master_add - (rw) manually register a slave device
w1_master_attempts - the number of times a search was attempted w1_master_attempts - (ro) the number of times a search was attempted
w1_master_max_slave_count w1_master_max_slave_count
- maximum number of slaves to search for at a time - (rw) maximum number of slaves to search for at a time
w1_master_name - the name of the device (w1_bus_masterX) w1_master_name - (ro) the name of the device (w1_bus_masterX)
w1_master_pullup - 5V strong pullup 0 enabled, 1 disabled w1_master_pullup - (rw) 5V strong pullup 0 enabled, 1 disabled
w1_master_remove - Manually remove a slave device w1_master_remove - (rw) manually remove a slave device
w1_master_search - the number of searches left to do, -1=continual (default) w1_master_search - (rw) the number of searches left to do,
-1=continual (default)
w1_master_slave_count w1_master_slave_count
- the number of slaves found - (ro) the number of slaves found
w1_master_slaves - the names of the slaves, one per line w1_master_slaves - (ro) the names of the slaves, one per line
w1_master_timeout - the delay in seconds between searches w1_master_timeout - (ro) the delay in seconds between searches
w1_master_timeout_us
- (ro) the delay in microseconds beetwen searches
If you have a w1 bus that never changes (you don't add or remove devices), If you have a w1 bus that never changes (you don't add or remove devices),
you can set the module parameter search_count to a small positive number you can set the module parameter search_count to a small positive number
...@@ -101,6 +104,11 @@ generally only make sense when searching is disabled, as a search will ...@@ -101,6 +104,11 @@ generally only make sense when searching is disabled, as a search will
redetect manually removed devices that are present and timeout manually redetect manually removed devices that are present and timeout manually
added devices that aren't on the bus. added devices that aren't on the bus.
Bus searches occur at an interval, specified as a summ of timeout and
timeout_us module parameters (either of which may be 0) for as long as
w1_master_search remains greater than 0 or is -1. Each search attempt
decrements w1_master_search by 1 (down to 0) and increments
w1_master_attempts by 1.
w1 slave sysfs interface w1 slave sysfs interface
------------------------------------------------------------------ ------------------------------------------------------------------
......
...@@ -46,11 +46,15 @@ MODULE_AUTHOR("Evgeniy Polyakov <zbr@ioremap.net>"); ...@@ -46,11 +46,15 @@ MODULE_AUTHOR("Evgeniy Polyakov <zbr@ioremap.net>");
MODULE_DESCRIPTION("Driver for 1-wire Dallas network protocol."); MODULE_DESCRIPTION("Driver for 1-wire Dallas network protocol.");
static int w1_timeout = 10; static int w1_timeout = 10;
static int w1_timeout_us = 0;
int w1_max_slave_count = 64; int w1_max_slave_count = 64;
int w1_max_slave_ttl = 10; int w1_max_slave_ttl = 10;
module_param_named(timeout, w1_timeout, int, 0); module_param_named(timeout, w1_timeout, int, 0);
MODULE_PARM_DESC(timeout, "time in seconds between automatic slave searches"); MODULE_PARM_DESC(timeout, "time in seconds between automatic slave searches");
module_param_named(timeout_us, w1_timeout_us, int, 0);
MODULE_PARM_DESC(timeout, "time in microseconds between automatic slave"
" searches");
/* A search stops when w1_max_slave_count devices have been found in that /* A search stops when w1_max_slave_count devices have been found in that
* search. The next search will start over and detect the same set of devices * search. The next search will start over and detect the same set of devices
* on a static 1-wire bus. Memory is not allocated based on this number, just * on a static 1-wire bus. Memory is not allocated based on this number, just
...@@ -317,6 +321,14 @@ static ssize_t w1_master_attribute_show_timeout(struct device *dev, struct devic ...@@ -317,6 +321,14 @@ static ssize_t w1_master_attribute_show_timeout(struct device *dev, struct devic
return count; return count;
} }
static ssize_t w1_master_attribute_show_timeout_us(struct device *dev,
struct device_attribute *attr, char *buf)
{
ssize_t count;
count = sprintf(buf, "%d\n", w1_timeout_us);
return count;
}
static ssize_t w1_master_attribute_store_max_slave_count(struct device *dev, static ssize_t w1_master_attribute_store_max_slave_count(struct device *dev,
struct device_attribute *attr, const char *buf, size_t count) struct device_attribute *attr, const char *buf, size_t count)
{ {
...@@ -543,6 +555,7 @@ static W1_MASTER_ATTR_RO(slave_count, S_IRUGO); ...@@ -543,6 +555,7 @@ static W1_MASTER_ATTR_RO(slave_count, S_IRUGO);
static W1_MASTER_ATTR_RW(max_slave_count, S_IRUGO | S_IWUSR | S_IWGRP); static W1_MASTER_ATTR_RW(max_slave_count, S_IRUGO | S_IWUSR | S_IWGRP);
static W1_MASTER_ATTR_RO(attempts, S_IRUGO); static W1_MASTER_ATTR_RO(attempts, S_IRUGO);
static W1_MASTER_ATTR_RO(timeout, S_IRUGO); static W1_MASTER_ATTR_RO(timeout, S_IRUGO);
static W1_MASTER_ATTR_RO(timeout_us, S_IRUGO);
static W1_MASTER_ATTR_RO(pointer, S_IRUGO); static W1_MASTER_ATTR_RO(pointer, S_IRUGO);
static W1_MASTER_ATTR_RW(search, S_IRUGO | S_IWUSR | S_IWGRP); static W1_MASTER_ATTR_RW(search, S_IRUGO | S_IWUSR | S_IWGRP);
static W1_MASTER_ATTR_RW(pullup, S_IRUGO | S_IWUSR | S_IWGRP); static W1_MASTER_ATTR_RW(pullup, S_IRUGO | S_IWUSR | S_IWGRP);
...@@ -556,6 +569,7 @@ static struct attribute *w1_master_default_attrs[] = { ...@@ -556,6 +569,7 @@ static struct attribute *w1_master_default_attrs[] = {
&w1_master_attribute_max_slave_count.attr, &w1_master_attribute_max_slave_count.attr,
&w1_master_attribute_attempts.attr, &w1_master_attribute_attempts.attr,
&w1_master_attribute_timeout.attr, &w1_master_attribute_timeout.attr,
&w1_master_attribute_timeout_us.attr,
&w1_master_attribute_pointer.attr, &w1_master_attribute_pointer.attr,
&w1_master_attribute_search.attr, &w1_master_attribute_search.attr,
&w1_master_attribute_pullup.attr, &w1_master_attribute_pullup.attr,
...@@ -1108,7 +1122,8 @@ int w1_process(void *data) ...@@ -1108,7 +1122,8 @@ int w1_process(void *data)
/* As long as w1_timeout is only set by a module parameter the sleep /* As long as w1_timeout is only set by a module parameter the sleep
* time can be calculated in jiffies once. * time can be calculated in jiffies once.
*/ */
const unsigned long jtime = msecs_to_jiffies(w1_timeout * 1000); const unsigned long jtime =
usecs_to_jiffies(w1_timeout * 1000000 + w1_timeout_us);
/* remainder if it woke up early */ /* remainder if it woke up early */
unsigned long jremain = 0; unsigned long jremain = 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment