123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189 |
- 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 a new master or slave device
- is 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 status - error indication from kernel
- __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_SEARCH - search command
- W1_CMD_ALARM_SEARCH - alarm search command
- W1_CMD_TOUCH - touch command
- (write and sample data back to userspace)
- W1_CMD_RESET - send bus reset
- W1_CMD_SLAVE_ADD - add slave to kernel list
- W1_CMD_SLAVE_REMOVE - remove slave from kernel list
- W1_CMD_LIST_SLAVES - get slaves list from kernel
- __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.
- 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
- structures.
- 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 master 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.
|