Fixes generated by 'codespell' and manually reviewed. Signed-off-by: Lucas De Marchi <lucas.demarchi@profusion.mobi>
		
			
				
	
	
		
			186 lines
		
	
	
	
		
			6.8 KiB
			
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			186 lines
		
	
	
	
		
			6.8 KiB
			
		
	
	
	
		
			Text
		
	
	
	
	
	
Userspace communication protocol over connector [1].
 | 
						|
 | 
						|
 | 
						|
Message types.
 | 
						|
=============
 | 
						|
 | 
						|
There are three types of messages between w1 core and userspace:
 | 
						|
1. Events. They are generated each time new master or slave device
 | 
						|
	found either due to automatic or requested search.
 | 
						|
2. Userspace commands.
 | 
						|
3. Replies to userspace commands.
 | 
						|
 | 
						|
 | 
						|
Protocol.
 | 
						|
========
 | 
						|
 | 
						|
[struct cn_msg] - connector header.
 | 
						|
	Its length field is equal to size of the attached data
 | 
						|
[struct w1_netlink_msg] - w1 netlink header.
 | 
						|
	__u8 type 	- message type.
 | 
						|
			W1_LIST_MASTERS
 | 
						|
				list current bus masters
 | 
						|
			W1_SLAVE_ADD/W1_SLAVE_REMOVE
 | 
						|
				slave add/remove events
 | 
						|
			W1_MASTER_ADD/W1_MASTER_REMOVE
 | 
						|
				master add/remove events
 | 
						|
			W1_MASTER_CMD
 | 
						|
				userspace command for bus master
 | 
						|
				device (search/alarm search)
 | 
						|
			W1_SLAVE_CMD
 | 
						|
				userspace command for slave device
 | 
						|
				(read/write/touch)
 | 
						|
	__u8 res	- reserved
 | 
						|
	__u16 len	- size of data attached to this header data
 | 
						|
	union {
 | 
						|
		__u8 id[8];			 - slave unique device id
 | 
						|
		struct w1_mst {
 | 
						|
			__u32		id;	 - master's id
 | 
						|
			__u32		res;	 - reserved
 | 
						|
		} mst;
 | 
						|
	} id;
 | 
						|
 | 
						|
[struct w1_netlink_cmd] - command for given master or slave device.
 | 
						|
	__u8 cmd	- command opcode.
 | 
						|
			W1_CMD_READ 	- read command
 | 
						|
			W1_CMD_WRITE	- write command
 | 
						|
			W1_CMD_TOUCH	- touch command
 | 
						|
				(write and sample data back to userspace)
 | 
						|
			W1_CMD_SEARCH	- search command
 | 
						|
			W1_CMD_ALARM_SEARCH - alarm search command
 | 
						|
	__u8 res	- reserved
 | 
						|
	__u16 len	- length of data for this command
 | 
						|
		For read command data must be allocated like for write command
 | 
						|
	__u8 data[0]	- data for this command
 | 
						|
 | 
						|
 | 
						|
Each connector message can include one or more w1_netlink_msg with
 | 
						|
zero or more attached w1_netlink_cmd messages.
 | 
						|
 | 
						|
For event messages there are no w1_netlink_cmd embedded structures,
 | 
						|
only connector header and w1_netlink_msg strucutre with "len" field
 | 
						|
being zero and filled type (one of event types) and id:
 | 
						|
either 8 bytes of slave unique id in host order,
 | 
						|
or master's id, which is assigned to bus master device
 | 
						|
when it is added to w1 core.
 | 
						|
 | 
						|
Currently replies to userspace commands are only generated for read
 | 
						|
command request. One reply is generated exactly for one w1_netlink_cmd
 | 
						|
read request. Replies are not combined when sent - i.e. typical reply
 | 
						|
messages looks like the following:
 | 
						|
 | 
						|
[cn_msg][w1_netlink_msg][w1_netlink_cmd]
 | 
						|
cn_msg.len = sizeof(struct w1_netlink_msg) +
 | 
						|
	     sizeof(struct w1_netlink_cmd) +
 | 
						|
	     cmd->len;
 | 
						|
w1_netlink_msg.len = sizeof(struct w1_netlink_cmd) + cmd->len;
 | 
						|
w1_netlink_cmd.len = cmd->len;
 | 
						|
 | 
						|
Replies to W1_LIST_MASTERS should send a message back to the userspace
 | 
						|
which will contain list of all registered master ids in the following
 | 
						|
format:
 | 
						|
 | 
						|
	cn_msg (CN_W1_IDX.CN_W1_VAL as id, len is equal to sizeof(struct
 | 
						|
	w1_netlink_msg) plus number of masters multiplied by 4)
 | 
						|
	w1_netlink_msg (type: W1_LIST_MASTERS, len is equal to
 | 
						|
		number of masters multiplied by 4 (u32 size))
 | 
						|
	id0 ... idN
 | 
						|
 | 
						|
	Each message is at most 4k in size, so if number of master devices
 | 
						|
	exceeds this, it will be split into several messages,
 | 
						|
	cn.seq will be increased for each one.
 | 
						|
 | 
						|
W1 search and alarm search commands.
 | 
						|
request:
 | 
						|
[cn_msg]
 | 
						|
  [w1_netlink_msg type = W1_MASTER_CMD
 | 
						|
  	id is equal to the bus master id to use for searching]
 | 
						|
  [w1_netlink_cmd cmd = W1_CMD_SEARCH or W1_CMD_ALARM_SEARCH]
 | 
						|
 | 
						|
reply:
 | 
						|
  [cn_msg, ack = 1 and increasing, 0 means the last message,
 | 
						|
  	seq is equal to the request seq]
 | 
						|
  [w1_netlink_msg type = W1_MASTER_CMD]
 | 
						|
  [w1_netlink_cmd cmd = W1_CMD_SEARCH or W1_CMD_ALARM_SEARCH
 | 
						|
	len is equal to number of IDs multiplied by 8]
 | 
						|
  [64bit-id0 ... 64bit-idN]
 | 
						|
Length in each header corresponds to the size of the data behind it, so
 | 
						|
w1_netlink_cmd->len = N * 8; where N is number of IDs in this message.
 | 
						|
	Can be zero.
 | 
						|
w1_netlink_msg->len = sizeof(struct w1_netlink_cmd) + N * 8;
 | 
						|
cn_msg->len = sizeof(struct w1_netlink_msg) +
 | 
						|
	      sizeof(struct w1_netlink_cmd) +
 | 
						|
	      N*8;
 | 
						|
 | 
						|
W1 reset command.
 | 
						|
[cn_msg]
 | 
						|
  [w1_netlink_msg type = W1_MASTER_CMD
 | 
						|
  	id is equal to the bus master id to use for searching]
 | 
						|
  [w1_netlink_cmd cmd = W1_CMD_RESET]
 | 
						|
 | 
						|
 | 
						|
Command status replies.
 | 
						|
======================
 | 
						|
 | 
						|
Each command (either root, master or slave with or without w1_netlink_cmd
 | 
						|
structure) will be 'acked' by the w1 core. Format of the reply is the same
 | 
						|
as request message except that length parameters do not account for data
 | 
						|
requested by the user, i.e. read/write/touch IO requests will not contain
 | 
						|
data, so w1_netlink_cmd.len will be 0, w1_netlink_msg.len will be size
 | 
						|
of the w1_netlink_cmd structure and cn_msg.len will be equal to the sum
 | 
						|
of the sizeof(struct w1_netlink_msg) and sizeof(struct w1_netlink_cmd).
 | 
						|
If reply is generated for master or root command (which do not have
 | 
						|
w1_netlink_cmd attached), reply will contain only cn_msg and w1_netlink_msg
 | 
						|
structires.
 | 
						|
 | 
						|
w1_netlink_msg.status field will carry positive error value
 | 
						|
(EINVAL for example) or zero in case of success.
 | 
						|
 | 
						|
All other fields in every structure will mirror the same parameters in the
 | 
						|
request message (except lengths as described above).
 | 
						|
 | 
						|
Status reply is generated for every w1_netlink_cmd embedded in the
 | 
						|
w1_netlink_msg, if there are no w1_netlink_cmd structures,
 | 
						|
reply will be generated for the w1_netlink_msg.
 | 
						|
 | 
						|
All w1_netlink_cmd command structures are handled in every w1_netlink_msg,
 | 
						|
even if there were errors, only length mismatch interrupts message processing.
 | 
						|
 | 
						|
 | 
						|
Operation steps in w1 core when new command is received.
 | 
						|
=======================================================
 | 
						|
 | 
						|
When new message (w1_netlink_msg) is received w1 core detects if it is
 | 
						|
master or slave request, according to w1_netlink_msg.type field.
 | 
						|
Then master or slave device is searched for.
 | 
						|
When found, master device (requested or those one on where slave device
 | 
						|
is found) is locked. If slave command is requested, then reset/select
 | 
						|
procedure is started to select given device.
 | 
						|
 | 
						|
Then all requested in w1_netlink_msg operations are performed one by one.
 | 
						|
If command requires reply (like read command) it is sent on command completion.
 | 
						|
 | 
						|
When all commands (w1_netlink_cmd) are processed muster device is unlocked
 | 
						|
and next w1_netlink_msg header processing started.
 | 
						|
 | 
						|
 | 
						|
Connector [1] specific documentation.
 | 
						|
====================================
 | 
						|
 | 
						|
Each connector message includes two u32 fields as "address".
 | 
						|
w1 uses CN_W1_IDX and CN_W1_VAL defined in include/linux/connector.h header.
 | 
						|
Each message also includes sequence and acknowledge numbers.
 | 
						|
Sequence number for event messages is appropriate bus master sequence number
 | 
						|
increased with each event message sent "through" this master.
 | 
						|
Sequence number for userspace requests is set by userspace application.
 | 
						|
Sequence number for reply is the same as was in request, and
 | 
						|
acknowledge number is set to seq+1.
 | 
						|
 | 
						|
 | 
						|
Additional documantion, source code examples.
 | 
						|
============================================
 | 
						|
 | 
						|
1. Documentation/connector
 | 
						|
2. http://www.ioremap.net/archive/w1
 | 
						|
This archive includes userspace application w1d.c which uses
 | 
						|
read/write/search commands for all master/slave devices found on the bus.
 |