xref: /linux/Documentation/w1/w1-netlink.rst (revision a23e1966932464e1c5226cb9ac4ce1d5fc10ba22)
1e9bb6275SMauro Carvalho Chehab===============================================
2e9bb6275SMauro Carvalho ChehabUserspace communication protocol over connector
3e9bb6275SMauro Carvalho Chehab===============================================
412003375SEvgeniy Polyakov
5e9bb6275SMauro Carvalho ChehabMessage types
612003375SEvgeniy Polyakov=============
712003375SEvgeniy Polyakov
812003375SEvgeniy PolyakovThere are three types of messages between w1 core and userspace:
9e9bb6275SMauro Carvalho Chehab
10b3be177aSDavid Fries1. Events. They are generated each time a new master or slave device
11b3be177aSDavid Fries   is found either due to automatic or requested search.
12e4e056aaSEvgeniy Polyakov2. Userspace commands.
1312003375SEvgeniy Polyakov3. Replies to userspace commands.
1412003375SEvgeniy Polyakov
1512003375SEvgeniy Polyakov
16e9bb6275SMauro Carvalho ChehabProtocol
1712003375SEvgeniy Polyakov========
1812003375SEvgeniy Polyakov
19e9bb6275SMauro Carvalho Chehab::
20e9bb6275SMauro Carvalho Chehab
21e4e056aaSEvgeniy Polyakov  [struct cn_msg] - connector header.
22e4e056aaSEvgeniy Polyakov	Its length field is equal to size of the attached data
2312003375SEvgeniy Polyakov  [struct w1_netlink_msg] - w1 netlink header.
2412003375SEvgeniy Polyakov	__u8 type 	- message type.
25e4e056aaSEvgeniy Polyakov			W1_LIST_MASTERS
26e4e056aaSEvgeniy Polyakov				list current bus masters
27e4e056aaSEvgeniy Polyakov			W1_SLAVE_ADD/W1_SLAVE_REMOVE
28e4e056aaSEvgeniy Polyakov				slave add/remove events
29e4e056aaSEvgeniy Polyakov			W1_MASTER_ADD/W1_MASTER_REMOVE
30e4e056aaSEvgeniy Polyakov				master add/remove events
31e4e056aaSEvgeniy Polyakov			W1_MASTER_CMD
32e4e056aaSEvgeniy Polyakov				userspace command for bus master
33e4e056aaSEvgeniy Polyakov				device (search/alarm search)
34e4e056aaSEvgeniy Polyakov			W1_SLAVE_CMD
35e4e056aaSEvgeniy Polyakov				userspace command for slave device
36e4e056aaSEvgeniy Polyakov				(read/write/touch)
378a0427d1SDavid Fries	__u8 status	- error indication from kernel
38e4e056aaSEvgeniy Polyakov	__u16 len	- size of data attached to this header data
3912003375SEvgeniy Polyakov	union {
40e4e056aaSEvgeniy Polyakov		__u8 id[8];			 - slave unique device id
4112003375SEvgeniy Polyakov		struct w1_mst {
42e4e056aaSEvgeniy Polyakov			__u32		id;	 - master's id
4312003375SEvgeniy Polyakov			__u32		res;	 - reserved
4412003375SEvgeniy Polyakov		} mst;
4512003375SEvgeniy Polyakov	} id;
4612003375SEvgeniy Polyakov
47e4e056aaSEvgeniy Polyakov  [struct w1_netlink_cmd] - command for given master or slave device.
4812003375SEvgeniy Polyakov	__u8 cmd	- command opcode.
49e4e056aaSEvgeniy Polyakov			W1_CMD_READ 	- read command
50e4e056aaSEvgeniy Polyakov			W1_CMD_WRITE	- write command
51e4e056aaSEvgeniy Polyakov			W1_CMD_SEARCH	- search command
52e4e056aaSEvgeniy Polyakov			W1_CMD_ALARM_SEARCH - alarm search command
538a0427d1SDavid Fries			W1_CMD_TOUCH	- touch command
548a0427d1SDavid Fries				(write and sample data back to userspace)
558a0427d1SDavid Fries			W1_CMD_RESET	- send bus reset
568a0427d1SDavid Fries			W1_CMD_SLAVE_ADD	- add slave to kernel list
578a0427d1SDavid Fries			W1_CMD_SLAVE_REMOVE	- remove slave from kernel list
588a0427d1SDavid Fries			W1_CMD_LIST_SLAVES	- get slaves list from kernel
5912003375SEvgeniy Polyakov	__u8 res	- reserved
60e4e056aaSEvgeniy Polyakov	__u16 len	- length of data for this command
61e4e056aaSEvgeniy Polyakov		For read command data must be allocated like for write command
62e4e056aaSEvgeniy Polyakov	__u8 data[0]	- data for this command
6312003375SEvgeniy Polyakov
6412003375SEvgeniy Polyakov
65e4e056aaSEvgeniy PolyakovEach connector message can include one or more w1_netlink_msg with
66e4e056aaSEvgeniy Polyakovzero or more attached w1_netlink_cmd messages.
6712003375SEvgeniy Polyakov
68e4e056aaSEvgeniy PolyakovFor event messages there are no w1_netlink_cmd embedded structures,
69d56b699dSBjorn Helgaasonly connector header and w1_netlink_msg structure with "len" field
70e4e056aaSEvgeniy Polyakovbeing zero and filled type (one of event types) and id:
71e4e056aaSEvgeniy Polyakoveither 8 bytes of slave unique id in host order,
72e4e056aaSEvgeniy Polyakovor master's id, which is assigned to bus master device
73e4e056aaSEvgeniy Polyakovwhen it is added to w1 core.
7412003375SEvgeniy Polyakov
75e4e056aaSEvgeniy PolyakovCurrently replies to userspace commands are only generated for read
76e4e056aaSEvgeniy Polyakovcommand request. One reply is generated exactly for one w1_netlink_cmd
77e4e056aaSEvgeniy Polyakovread request. Replies are not combined when sent - i.e. typical reply
78e9bb6275SMauro Carvalho Chehabmessages looks like the following::
79e4e056aaSEvgeniy Polyakov
8012003375SEvgeniy Polyakov  [cn_msg][w1_netlink_msg][w1_netlink_cmd]
81e4e056aaSEvgeniy Polyakov  cn_msg.len = sizeof(struct w1_netlink_msg) +
82e4e056aaSEvgeniy Polyakov	     sizeof(struct w1_netlink_cmd) +
83e4e056aaSEvgeniy Polyakov	     cmd->len;
8412003375SEvgeniy Polyakov  w1_netlink_msg.len = sizeof(struct w1_netlink_cmd) + cmd->len;
8512003375SEvgeniy Polyakov  w1_netlink_cmd.len = cmd->len;
8612003375SEvgeniy Polyakov
87e4e056aaSEvgeniy PolyakovReplies to W1_LIST_MASTERS should send a message back to the userspace
88e4e056aaSEvgeniy Polyakovwhich will contain list of all registered master ids in the following
89e9bb6275SMauro Carvalho Chehabformat::
90e4e056aaSEvgeniy Polyakov
91e4e056aaSEvgeniy Polyakov	cn_msg (CN_W1_IDX.CN_W1_VAL as id, len is equal to sizeof(struct
9225985edcSLucas De Marchi	w1_netlink_msg) plus number of masters multiplied by 4)
93e4e056aaSEvgeniy Polyakov	w1_netlink_msg (type: W1_LIST_MASTERS, len is equal to
94e4e056aaSEvgeniy Polyakov		number of masters multiplied by 4 (u32 size))
95e4e056aaSEvgeniy Polyakov	id0 ... idN
96e4e056aaSEvgeniy Polyakov
97e4e056aaSEvgeniy PolyakovEach message is at most 4k in size, so if number of master devices
988a0427d1SDavid Friesexceeds this, it will be split into several messages.
99e4e056aaSEvgeniy Polyakov
100e4e056aaSEvgeniy PolyakovW1 search and alarm search commands.
101e9bb6275SMauro Carvalho Chehab
102e9bb6275SMauro Carvalho Chehabrequest::
103e9bb6275SMauro Carvalho Chehab
104e4e056aaSEvgeniy Polyakov  [cn_msg]
105e4e056aaSEvgeniy Polyakov    [w1_netlink_msg type = W1_MASTER_CMD
106e4e056aaSEvgeniy Polyakov	id is equal to the bus master id to use for searching]
107e4e056aaSEvgeniy Polyakov    [w1_netlink_cmd cmd = W1_CMD_SEARCH or W1_CMD_ALARM_SEARCH]
108e4e056aaSEvgeniy Polyakov
109e9bb6275SMauro Carvalho Chehabreply::
110e9bb6275SMauro Carvalho Chehab
111e4e056aaSEvgeniy Polyakov  [cn_msg, ack = 1 and increasing, 0 means the last message,
112e4e056aaSEvgeniy Polyakov	seq is equal to the request seq]
113e4e056aaSEvgeniy Polyakov  [w1_netlink_msg type = W1_MASTER_CMD]
114e4e056aaSEvgeniy Polyakov  [w1_netlink_cmd cmd = W1_CMD_SEARCH or W1_CMD_ALARM_SEARCH
115e4e056aaSEvgeniy Polyakov	len is equal to number of IDs multiplied by 8]
116e4e056aaSEvgeniy Polyakov  [64bit-id0 ... 64bit-idN]
117e9bb6275SMauro Carvalho Chehab
118e4e056aaSEvgeniy PolyakovLength in each header corresponds to the size of the data behind it, so
119e4e056aaSEvgeniy Polyakovw1_netlink_cmd->len = N * 8; where N is number of IDs in this message.
120e4e056aaSEvgeniy PolyakovCan be zero.
121e9bb6275SMauro Carvalho Chehab
122e9bb6275SMauro Carvalho Chehab::
123e9bb6275SMauro Carvalho Chehab
124e4e056aaSEvgeniy Polyakov  w1_netlink_msg->len = sizeof(struct w1_netlink_cmd) + N * 8;
125e4e056aaSEvgeniy Polyakov  cn_msg->len = sizeof(struct w1_netlink_msg) +
126e4e056aaSEvgeniy Polyakov	      sizeof(struct w1_netlink_cmd) +
127e4e056aaSEvgeniy Polyakov	      N*8;
12812003375SEvgeniy Polyakov
129e9bb6275SMauro Carvalho ChehabW1 reset command::
130e9bb6275SMauro Carvalho Chehab
131f89735c4SEvgeniy Polyakov  [cn_msg]
132f89735c4SEvgeniy Polyakov    [w1_netlink_msg type = W1_MASTER_CMD
133f89735c4SEvgeniy Polyakov	id is equal to the bus master id to use for searching]
134f89735c4SEvgeniy Polyakov    [w1_netlink_cmd cmd = W1_CMD_RESET]
135f89735c4SEvgeniy Polyakov
1364037014eSEvgeniy Polyakov
137e9bb6275SMauro Carvalho ChehabCommand status replies
1384037014eSEvgeniy Polyakov======================
1394037014eSEvgeniy Polyakov
1404037014eSEvgeniy PolyakovEach command (either root, master or slave with or without w1_netlink_cmd
1414037014eSEvgeniy Polyakovstructure) will be 'acked' by the w1 core. Format of the reply is the same
1424037014eSEvgeniy Polyakovas request message except that length parameters do not account for data
1434037014eSEvgeniy Polyakovrequested by the user, i.e. read/write/touch IO requests will not contain
1444037014eSEvgeniy Polyakovdata, so w1_netlink_cmd.len will be 0, w1_netlink_msg.len will be size
1454037014eSEvgeniy Polyakovof the w1_netlink_cmd structure and cn_msg.len will be equal to the sum
1464037014eSEvgeniy Polyakovof the sizeof(struct w1_netlink_msg) and sizeof(struct w1_netlink_cmd).
1474037014eSEvgeniy PolyakovIf reply is generated for master or root command (which do not have
1484037014eSEvgeniy Polyakovw1_netlink_cmd attached), reply will contain only cn_msg and w1_netlink_msg
149b3be177aSDavid Friesstructures.
1504037014eSEvgeniy Polyakov
1514037014eSEvgeniy Polyakovw1_netlink_msg.status field will carry positive error value
1524037014eSEvgeniy Polyakov(EINVAL for example) or zero in case of success.
1534037014eSEvgeniy Polyakov
1544037014eSEvgeniy PolyakovAll other fields in every structure will mirror the same parameters in the
1554037014eSEvgeniy Polyakovrequest message (except lengths as described above).
1564037014eSEvgeniy Polyakov
1574037014eSEvgeniy PolyakovStatus reply is generated for every w1_netlink_cmd embedded in the
1584037014eSEvgeniy Polyakovw1_netlink_msg, if there are no w1_netlink_cmd structures,
1594037014eSEvgeniy Polyakovreply will be generated for the w1_netlink_msg.
1604037014eSEvgeniy Polyakov
1614037014eSEvgeniy PolyakovAll w1_netlink_cmd command structures are handled in every w1_netlink_msg,
1624037014eSEvgeniy Polyakoveven if there were errors, only length mismatch interrupts message processing.
1634037014eSEvgeniy Polyakov
1644037014eSEvgeniy Polyakov
165e9bb6275SMauro Carvalho ChehabOperation steps in w1 core when new command is received
16612003375SEvgeniy Polyakov=======================================================
16712003375SEvgeniy Polyakov
168e4e056aaSEvgeniy PolyakovWhen new message (w1_netlink_msg) is received w1 core detects if it is
169e4e056aaSEvgeniy Polyakovmaster or slave request, according to w1_netlink_msg.type field.
17012003375SEvgeniy PolyakovThen master or slave device is searched for.
171e4e056aaSEvgeniy PolyakovWhen found, master device (requested or those one on where slave device
172e4e056aaSEvgeniy Polyakovis found) is locked. If slave command is requested, then reset/select
173e4e056aaSEvgeniy Polyakovprocedure is started to select given device.
17412003375SEvgeniy Polyakov
17512003375SEvgeniy PolyakovThen all requested in w1_netlink_msg operations are performed one by one.
17612003375SEvgeniy PolyakovIf command requires reply (like read command) it is sent on command completion.
17712003375SEvgeniy Polyakov
178b3be177aSDavid FriesWhen all commands (w1_netlink_cmd) are processed master device is unlocked
17912003375SEvgeniy Polyakovand next w1_netlink_msg header processing started.
18012003375SEvgeniy Polyakov
18112003375SEvgeniy Polyakov
182e9bb6275SMauro Carvalho ChehabConnector [1] specific documentation
18312003375SEvgeniy Polyakov====================================
18412003375SEvgeniy Polyakov
18512003375SEvgeniy PolyakovEach connector message includes two u32 fields as "address".
18612003375SEvgeniy Polyakovw1 uses CN_W1_IDX and CN_W1_VAL defined in include/linux/connector.h header.
18712003375SEvgeniy PolyakovEach message also includes sequence and acknowledge numbers.
188e4e056aaSEvgeniy PolyakovSequence number for event messages is appropriate bus master sequence number
189e4e056aaSEvgeniy Polyakovincreased with each event message sent "through" this master.
19012003375SEvgeniy PolyakovSequence number for userspace requests is set by userspace application.
19112003375SEvgeniy PolyakovSequence number for reply is the same as was in request, and
19212003375SEvgeniy Polyakovacknowledge number is set to seq+1.
19312003375SEvgeniy Polyakov
19412003375SEvgeniy Polyakov
195e9bb6275SMauro Carvalho ChehabAdditional documentation, source code examples
196e9bb6275SMauro Carvalho Chehab==============================================
19712003375SEvgeniy Polyakov
198baa293e9SMauro Carvalho Chehab1. Documentation/driver-api/connector.rst
199e4e056aaSEvgeniy Polyakov2. http://www.ioremap.net/archive/w1
200e9bb6275SMauro Carvalho Chehab
201e4e056aaSEvgeniy Polyakov   This archive includes userspace application w1d.c which uses
202e4e056aaSEvgeniy Polyakov   read/write/search commands for all master/slave devices found on the bus.
203