Zephyr Project API 4.4.99
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
w1.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2018 Roman Tataurov <diytronic@yandex.ru>
3 * Copyright (c) 2022 Thomas Stranger
4 *
5 * SPDX-License-Identifier: Apache-2.0
6 */
7
13
14#ifndef ZEPHYR_INCLUDE_DRIVERS_W1_H_
15#define ZEPHYR_INCLUDE_DRIVERS_W1_H_
16
17#include <zephyr/types.h>
18#include <zephyr/device.h>
19#include <zephyr/kernel.h>
20#include <zephyr/sys/crc.h>
22
23#ifdef __cplusplus
24extern "C" {
25#endif
26
35
37
38/*
39 * Count the number of slaves expected on the bus.
40 * This can be used to decide if the bus has a multidrop topology or
41 * only a single slave is present.
42 * There is a comma after each ordinal (including the last)
43 * Hence FOR_EACH adds "+1" once too often which has to be subtracted in the end.
44 */
45#define F1(x) 1
46#define W1_SLAVE_COUNT(node_id) \
47 (FOR_EACH(F1, (+), DT_SUPPORTS_DEP_ORDS(node_id)) - 1)
48#define W1_INST_SLAVE_COUNT(inst) \
49 (W1_SLAVE_COUNT(DT_DRV_INST(inst)))
50
52
72
77
89
100};
101
106typedef int (*w1_reset_bus_t)(const struct device *dev);
107
112typedef int (*w1_read_bit_t)(const struct device *dev);
113
118typedef int (*w1_write_bit_t)(const struct device *dev, bool bit);
119
124typedef int (*w1_read_byte_t)(const struct device *dev);
125
130typedef int (*w1_write_byte_t)(const struct device *dev, const uint8_t byte);
131
136typedef int (*w1_read_block_t)(const struct device *dev, uint8_t *buffer,
137 size_t len);
138
143typedef int (*w1_write_block_t)(const struct device *dev, const uint8_t *buffer,
144 size_t len);
145
150typedef size_t (*w1_get_slave_count_t)(const struct device *dev);
151
156typedef int (*w1_configure_t)(const struct device *dev,
157 enum w1_settings_type type, uint32_t value);
158
163typedef int (*w1_change_bus_lock_t)(const struct device *dev, bool lock);
164
202
204
206__syscall int w1_change_bus_lock(const struct device *dev, bool lock);
207
208static inline int z_impl_w1_change_bus_lock(const struct device *dev, bool lock)
209{
210 struct w1_master_data *ctrl_data = (struct w1_master_data *)dev->data;
211 const struct w1_driver_api *api = DEVICE_API_GET(w1, dev);
212
213 if (api->change_bus_lock) {
214 return api->change_bus_lock(dev, lock);
215 }
216
217 if (lock) {
218 return k_mutex_lock(&ctrl_data->bus_lock, K_FOREVER);
219 } else {
220 return k_mutex_unlock(&ctrl_data->bus_lock);
221 }
222}
224
236static inline int w1_lock_bus(const struct device *dev)
237{
238 return w1_change_bus_lock(dev, true);
239}
240
250static inline int w1_unlock_bus(const struct device *dev)
251{
252 return w1_change_bus_lock(dev, false);
253}
254
261
281__syscall int w1_reset_bus(const struct device *dev);
282
283static inline int z_impl_w1_reset_bus(const struct device *dev)
284{
285 return DEVICE_API_GET(w1, dev)->reset_bus(dev);
286}
287
295__syscall int w1_read_bit(const struct device *dev);
296
297static inline int z_impl_w1_read_bit(const struct device *dev)
298{
299 return DEVICE_API_GET(w1, dev)->read_bit(dev);
300}
301
310__syscall int w1_write_bit(const struct device *dev, const bool bit);
311
312static inline int z_impl_w1_write_bit(const struct device *dev, bool bit)
313{
314 return DEVICE_API_GET(w1, dev)->write_bit(dev, bit);
315}
316
324__syscall int w1_read_byte(const struct device *dev);
325
326static inline int z_impl_w1_read_byte(const struct device *dev)
327{
328 return DEVICE_API_GET(w1, dev)->read_byte(dev);
329}
330
339__syscall int w1_write_byte(const struct device *dev, uint8_t byte);
340
341static inline int z_impl_w1_write_byte(const struct device *dev, uint8_t byte)
342{
343 return DEVICE_API_GET(w1, dev)->write_byte(dev, byte);
344}
345
355__syscall int w1_read_block(const struct device *dev, uint8_t *buffer, size_t len);
356
366__syscall int w1_write_block(const struct device *dev,
367 const uint8_t *buffer, size_t len);
368
376__syscall size_t w1_get_slave_count(const struct device *dev);
377
378static inline size_t z_impl_w1_get_slave_count(const struct device *dev)
379{
380 const struct w1_master_config *ctrl_cfg =
381 (const struct w1_master_config *)dev->config;
382
383 return ctrl_cfg->slave_count;
384}
385
400__syscall int w1_configure(const struct device *dev,
401 enum w1_settings_type type, uint32_t value);
402
403static inline int z_impl_w1_configure(const struct device *dev,
404 enum w1_settings_type type, uint32_t value)
405{
406 return DEVICE_API_GET(w1, dev)->configure(dev, type, value);
407}
408
412
419
424
429#define W1_CMD_SKIP_ROM 0xCC
430
435#define W1_CMD_MATCH_ROM 0x55
436
441#define W1_CMD_RESUME 0xA5
442
449#define W1_CMD_READ_ROM 0x33
450
455#define W1_CMD_SEARCH_ROM 0xF0
456
461#define W1_CMD_SEARCH_ALARM 0xEC
462
467#define W1_CMD_OVERDRIVE_SKIP_ROM 0x3C
468
473#define W1_CMD_OVERDRIVE_MATCH_ROM 0x69
474
476
481
483#define W1_CRC8_SEED 0x00
485#define W1_CRC8_POLYNOMIAL 0x8C
487#define W1_CRC16_SEED 0x0000
489#define W1_CRC16_POLYNOMIAL 0xa001
490
492
494#define W1_SEARCH_ALL_FAMILIES 0x00
495
497#define W1_ROM_INIT_ZERO \
498 { \
499 .family = 0, .serial = { 0 }, .crc = 0, \
500 }
501
518
527 struct w1_rom rom;
531 uint32_t res : 31;
533};
534
542typedef void (*w1_search_callback_t)(struct w1_rom rom, void *user_data);
543
559int w1_read_rom(const struct device *dev, struct w1_rom *rom);
560
580int w1_match_rom(const struct device *dev, const struct w1_slave_config *config);
581
593int w1_resume_command(const struct device *dev);
594
609int w1_skip_rom(const struct device *dev, const struct w1_slave_config *config);
610
621int w1_reset_select(const struct device *dev, const struct w1_slave_config *config);
622
639int w1_write_read(const struct device *dev, const struct w1_slave_config *config,
640 const uint8_t *write_buf, size_t write_len,
641 uint8_t *read_buf, size_t read_len);
642
666__syscall int w1_search_bus(const struct device *dev, uint8_t command,
668 void *user_data);
669
684static inline int w1_search_rom(const struct device *dev,
685 w1_search_callback_t callback, void *user_data)
686{
688 callback, user_data);
689}
690
705static inline int w1_search_alarm(const struct device *dev,
706 w1_search_callback_t callback, void *user_data)
707{
709 callback, user_data);
710}
711
719static inline uint64_t w1_rom_to_uint64(const struct w1_rom *rom)
720{
721 return sys_get_be64((uint8_t *)rom);
722}
723
730static inline void w1_uint64_to_rom(const uint64_t rom64, struct w1_rom *rom)
731{
732 sys_put_be64(rom64, (uint8_t *)rom);
733}
734
747static inline uint8_t w1_crc8(const uint8_t *src, size_t len)
748{
749 return crc8(src, len, W1_CRC8_POLYNOMIAL, W1_CRC8_SEED, true);
750}
751
767static inline uint16_t w1_crc16(const uint16_t seed, const uint8_t *src,
768 const size_t len)
769{
770 return crc16_reflect(W1_CRC16_POLYNOMIAL, seed, src, len);
771}
772
776
777#ifdef __cplusplus
778}
779#endif
780
784#include <zephyr/syscalls/w1.h>
785
786#endif /* ZEPHYR_INCLUDE_DRIVERS_W1_H_ */
#define DEVICE_API_GET(_class, _dev)
Expands to the pointer of a device's API for a given class.
Definition device.h:1425
#define K_FOREVER
Generate infinite timeout delay.
Definition kernel.h:1761
uint8_t crc8(const uint8_t *src, size_t len, uint8_t polynomial, uint8_t initial_value, bool reversed)
Generic function for computing CRC 8.
uint16_t crc16_reflect(uint16_t poly, uint16_t seed, const uint8_t *src, size_t len)
Generic function for computing a CRC-16 with input and output reflection.
int k_mutex_unlock(struct k_mutex *mutex)
Unlock a mutex.
int k_mutex_lock(struct k_mutex *mutex, k_timeout_t timeout)
Lock a mutex.
int(* w1_write_bit_t)(const struct device *dev, bool bit)
Write a single bit to the 1-Wire bus.
Definition w1.h:118
int(* w1_write_byte_t)(const struct device *dev, const uint8_t byte)
Write a single byte to the 1-Wire bus.
Definition w1.h:130
w1_settings_type
Defines the 1-Wire master settings types, which are runtime configurable.
Definition w1.h:56
size_t(* w1_get_slave_count_t)(const struct device *dev)
Get the number of slaves on the bus.
Definition w1.h:150
static int w1_unlock_bus(const struct device *dev)
Unlock the 1-wire bus.
Definition w1.h:250
int(* w1_read_byte_t)(const struct device *dev)
Read a single byte from the 1-Wire bus.
Definition w1.h:124
int(* w1_reset_bus_t)(const struct device *dev)
Reset the 1-Wire bus to prepare slaves for communication.
Definition w1.h:106
int(* w1_change_bus_lock_t)(const struct device *dev, bool lock)
Lock or unlock the 1-Wire bus.
Definition w1.h:163
static int w1_lock_bus(const struct device *dev)
Lock the 1-wire bus to prevent simultaneous access.
Definition w1.h:236
int(* w1_configure_t)(const struct device *dev, enum w1_settings_type type, uint32_t value)
Configure parameters of the 1-Wire master.
Definition w1.h:156
int(* w1_read_bit_t)(const struct device *dev)
Read a single bit from the 1-Wire bus.
Definition w1.h:112
int(* w1_read_block_t)(const struct device *dev, uint8_t *buffer, size_t len)
Read a block of data from the 1-Wire bus.
Definition w1.h:136
int(* w1_write_block_t)(const struct device *dev, const uint8_t *buffer, size_t len)
Write a block of data to the 1-Wire bus.
Definition w1.h:143
@ W1_SETTING_SPEED
Overdrive speed is enabled in case a value of 1 is passed and disabled passing 0.
Definition w1.h:60
@ W1_SETINGS_TYPE_COUNT
Number of different settings types.
Definition w1.h:70
@ W1_SETTING_STRONG_PULLUP
The strong pullup resistor is activated immediately after the next written data block by passing a va...
Definition w1.h:65
static int w1_search_rom(const struct device *dev, w1_search_callback_t callback, void *user_data)
Search for 1-Wire slave on bus.
Definition w1.h:684
static int w1_search_alarm(const struct device *dev, w1_search_callback_t callback, void *user_data)
Search for 1-Wire slaves with an active alarm.
Definition w1.h:705
static uint64_t w1_rom_to_uint64(const struct w1_rom *rom)
Function to convert a w1_rom struct to an uint64_t.
Definition w1.h:719
int w1_search_bus(const struct device *dev, uint8_t command, uint8_t family, w1_search_callback_t callback, void *user_data)
Search 1-wire slaves on the bus.
int w1_write_read(const struct device *dev, const struct w1_slave_config *config, const uint8_t *write_buf, size_t write_len, uint8_t *read_buf, size_t read_len)
Write then read data from the 1-Wire slave with matching ROM.
void(* w1_search_callback_t)(struct w1_rom rom, void *user_data)
Define the application callback handler function signature for searches.
Definition w1.h:542
static uint8_t w1_crc8(const uint8_t *src, size_t len)
Compute CRC-8 chacksum as defined in the 1-Wire specification.
Definition w1.h:747
int w1_match_rom(const struct device *dev, const struct w1_slave_config *config)
Select a specific slave by broadcasting a selected ROM.
static uint16_t w1_crc16(const uint16_t seed, const uint8_t *src, const size_t len)
Compute 1-Wire variant of CRC 16.
Definition w1.h:767
#define W1_CMD_SEARCH_ROM
This command allows the bus master to discover the addresses (i.e., ROM codes) of all slave devices o...
Definition w1.h:455
int w1_resume_command(const struct device *dev)
Select the slave last addressed with a Match ROM or Search ROM command.
static void w1_uint64_to_rom(const uint64_t rom64, struct w1_rom *rom)
Function to write an uint64_t to struct w1_rom pointer.
Definition w1.h:730
#define W1_SEARCH_ALL_FAMILIES
This flag can be passed to searches in order to not filter on family ID.
Definition w1.h:494
int w1_read_rom(const struct device *dev, struct w1_rom *rom)
Read Peripheral 64-bit ROM.
int w1_reset_select(const struct device *dev, const struct w1_slave_config *config)
In single drop configurations use Skip Select command, otherwise use Match ROM command.
#define W1_CRC8_SEED
Seed value used to calculate the 1-Wire 8-bit crc.
Definition w1.h:483
#define W1_CRC16_POLYNOMIAL
Polynomial used to calculate the 1-Wire 16-bit crc.
Definition w1.h:489
int w1_skip_rom(const struct device *dev, const struct w1_slave_config *config)
Select all slaves regardless of ROM.
#define W1_CRC8_POLYNOMIAL
Polynomial used to calculate the 1-Wire 8-bit crc.
Definition w1.h:485
#define W1_CMD_SEARCH_ALARM
This command allows the bus master to identify which devices have experienced an alarm condition.
Definition w1.h:461
Public kernel APIs.
__UINT32_TYPE__ uint32_t
Definition stdint.h:90
__UINT64_TYPE__ uint64_t
Definition stdint.h:91
__UINT8_TYPE__ uint8_t
Definition stdint.h:88
__UINT16_TYPE__ uint16_t
Definition stdint.h:89
Runtime device structure (in ROM) per driver instance.
Definition device.h:513
void * data
Address of the device instance private data.
Definition device.h:523
const void * config
Address of device instance config information.
Definition device.h:517
Kernel mutex structure.
Definition kernel.h:3572
@driver_ops{1-Wire}
Definition w1.h:168
w1_write_block_t write_block
@driver_ops_optional Write a block of data to the 1-Wire bus.
Definition w1.h:192
w1_configure_t configure
@driver_ops_mandatory Configure parameters of the 1-Wire master.
Definition w1.h:194
w1_reset_bus_t reset_bus
@driver_ops_mandatory Reset the 1-Wire bus to prepare slaves for communication.
Definition w1.h:170
w1_change_bus_lock_t change_bus_lock
@driver_ops_optional Lock or unlock bus access.
Definition w1.h:200
w1_read_block_t read_block
@driver_ops_optional Read a block of data from the 1-Wire bus.
Definition w1.h:185
w1_write_bit_t write_bit
@driver_ops_mandatory Write a single bit to the 1-Wire bus.
Definition w1.h:174
w1_read_bit_t read_bit
@driver_ops_mandatory Read a single bit from the 1-Wire bus.
Definition w1.h:172
w1_write_byte_t write_byte
@driver_ops_mandatory Write a single byte to the 1-Wire bus.
Definition w1.h:178
w1_read_byte_t read_byte
@driver_ops_mandatory Read a single byte from the 1-Wire bus.
Definition w1.h:176
@def_driverbackendgroup{1-Wire,w1_interface}
Definition w1.h:85
uint16_t slave_count
Number of connected slaves.
Definition w1.h:87
Data common to all 1-Wire master implementations.
Definition w1.h:97
struct k_mutex bus_lock
The mutex used by w1_lock_bus() and w1_unlock_bus() methods.
Definition w1.h:99
w1_rom struct.
Definition w1.h:505
uint8_t serial[6]
The serial together with the family code composes the unique 56-bit id.
Definition w1.h:514
uint8_t crc
8-bit checksum of the 56-bit unique id.
Definition w1.h:516
uint8_t family
The 1-Wire family code identifying the slave device type.
Definition w1.h:512
Node specific 1-wire configuration struct.
Definition w1.h:525
struct w1_rom rom
Unique 1-Wire ROM.
Definition w1.h:527
uint32_t overdrive
overdrive speed is used if set to 1.
Definition w1.h:529
Byte order helpers.
static void sys_put_be64(uint64_t val, uint8_t dst[8])
Put a 64-bit integer as big-endian to arbitrary location.
Definition byteorder.h:409
static uint64_t sys_get_be64(const uint8_t src[8])
Get a 64-bit integer stored in big-endian format.
Definition byteorder.h:590
CRC computation function.