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