Zephyr Project API 4.2.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
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
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
72
76struct w1_master_config {
77 /* Number of connected slaves */
78 uint16_t slave_count;
79};
80
82struct w1_master_data {
83 /* The mutex used by w1_lock_bus and w1_unlock_bus methods */
84 struct k_mutex bus_lock;
85};
86
87typedef int (*w1_reset_bus_t)(const struct device *dev);
88typedef int (*w1_read_bit_t)(const struct device *dev);
89typedef int (*w1_write_bit_t)(const struct device *dev, bool bit);
90typedef int (*w1_read_byte_t)(const struct device *dev);
91typedef int (*w1_write_byte_t)(const struct device *dev, const uint8_t byte);
92typedef int (*w1_read_block_t)(const struct device *dev, uint8_t *buffer,
93 size_t len);
94typedef int (*w1_write_block_t)(const struct device *dev, const uint8_t *buffer,
95 size_t len);
96typedef size_t (*w1_get_slave_count_t)(const struct device *dev);
97typedef int (*w1_configure_t)(const struct device *dev,
98 enum w1_settings_type type, uint32_t value);
99typedef int (*w1_change_bus_lock_t)(const struct device *dev, bool lock);
100
101__subsystem struct w1_driver_api {
102 w1_reset_bus_t reset_bus;
103 w1_read_bit_t read_bit;
104 w1_write_bit_t write_bit;
105 w1_read_byte_t read_byte;
106 w1_write_byte_t write_byte;
107 w1_read_block_t read_block;
108 w1_write_block_t write_block;
109 w1_configure_t configure;
110 w1_change_bus_lock_t change_bus_lock;
111};
115__syscall int w1_change_bus_lock(const struct device *dev, bool lock);
116
117static inline int z_impl_w1_change_bus_lock(const struct device *dev, bool lock)
118{
119 struct w1_master_data *ctrl_data = (struct w1_master_data *)dev->data;
120 const struct w1_driver_api *api = (const struct w1_driver_api *)dev->api;
121
122 if (api->change_bus_lock) {
123 return api->change_bus_lock(dev, lock);
124 }
125
126 if (lock) {
127 return k_mutex_lock(&ctrl_data->bus_lock, K_FOREVER);
128 } else {
129 return k_mutex_unlock(&ctrl_data->bus_lock);
130 }
131}
146static inline int w1_lock_bus(const struct device *dev)
147{
148 return w1_change_bus_lock(dev, true);
149}
150
161static inline int w1_unlock_bus(const struct device *dev)
162{
163 return w1_change_bus_lock(dev, false);
164}
165
192__syscall int w1_reset_bus(const struct device *dev);
193
194static inline int z_impl_w1_reset_bus(const struct device *dev)
195{
196 const struct w1_driver_api *api = (const struct w1_driver_api *)dev->api;
197
198 return api->reset_bus(dev);
199}
200
209__syscall int w1_read_bit(const struct device *dev);
210
211static inline int z_impl_w1_read_bit(const struct device *dev)
212{
213 const struct w1_driver_api *api = (const struct w1_driver_api *)dev->api;
214
215 return api->read_bit(dev);
216}
217
227__syscall int w1_write_bit(const struct device *dev, const bool bit);
228
229static inline int z_impl_w1_write_bit(const struct device *dev, bool bit)
230{
231 const struct w1_driver_api *api = (const struct w1_driver_api *)dev->api;
232
233 return api->write_bit(dev, bit);
234}
235
244__syscall int w1_read_byte(const struct device *dev);
245
246static inline int z_impl_w1_read_byte(const struct device *dev)
247{
248 const struct w1_driver_api *api = (const struct w1_driver_api *)dev->api;
249
250 return api->read_byte(dev);
251}
252
262__syscall int w1_write_byte(const struct device *dev, uint8_t byte);
263
264static inline int z_impl_w1_write_byte(const struct device *dev, uint8_t byte)
265{
266 const struct w1_driver_api *api = (const struct w1_driver_api *)dev->api;
267
268 return api->write_byte(dev, byte);
269}
270
281__syscall int w1_read_block(const struct device *dev, uint8_t *buffer, size_t len);
282
293__syscall int w1_write_block(const struct device *dev,
294 const uint8_t *buffer, size_t len);
295
304__syscall size_t w1_get_slave_count(const struct device *dev);
305
306static inline size_t z_impl_w1_get_slave_count(const struct device *dev)
307{
308 const struct w1_master_config *ctrl_cfg =
309 (const struct w1_master_config *)dev->config;
310
311 return ctrl_cfg->slave_count;
312}
313
328__syscall int w1_configure(const struct device *dev,
329 enum w1_settings_type type, uint32_t value);
330
331static inline int z_impl_w1_configure(const struct device *dev,
332 enum w1_settings_type type, uint32_t value)
333{
334 const struct w1_driver_api *api = (const struct w1_driver_api *)dev->api;
335
336 return api->configure(dev, type, value);
337}
338
359#define W1_CMD_SKIP_ROM 0xCC
360
365#define W1_CMD_MATCH_ROM 0x55
366
371#define W1_CMD_RESUME 0xA5
372
379#define W1_CMD_READ_ROM 0x33
380
385#define W1_CMD_SEARCH_ROM 0xF0
386
391#define W1_CMD_SEARCH_ALARM 0xEC
392
397#define W1_CMD_OVERDRIVE_SKIP_ROM 0x3C
398
403#define W1_CMD_OVERDRIVE_MATCH_ROM 0x69
404
413#define W1_CRC8_SEED 0x00
415#define W1_CRC8_POLYNOMIAL 0x8C
417#define W1_CRC16_SEED 0x0000
419#define W1_CRC16_POLYNOMIAL 0xa001
420
424#define W1_SEARCH_ALL_FAMILIES 0x00
425
427#define W1_ROM_INIT_ZERO \
428 { \
429 .family = 0, .serial = { 0 }, .crc = 0, \
430 }
431
448
457 struct w1_rom rom;
461 uint32_t res : 31;
463};
464
472typedef void (*w1_search_callback_t)(struct w1_rom rom, void *user_data);
473
491int w1_read_rom(const struct device *dev, struct w1_rom *rom);
492
513int w1_match_rom(const struct device *dev, const struct w1_slave_config *config);
514
527int w1_resume_command(const struct device *dev);
528
544int w1_skip_rom(const struct device *dev, const struct w1_slave_config *config);
545
557int w1_reset_select(const struct device *dev, const struct w1_slave_config *config);
558
576int w1_write_read(const struct device *dev, const struct w1_slave_config *config,
577 const uint8_t *write_buf, size_t write_len,
578 uint8_t *read_buf, size_t read_len);
579
604__syscall int w1_search_bus(const struct device *dev, uint8_t command,
606 void *user_data);
607
623static inline int w1_search_rom(const struct device *dev,
624 w1_search_callback_t callback, void *user_data)
625{
627 callback, user_data);
628}
629
645static inline int w1_search_alarm(const struct device *dev,
646 w1_search_callback_t callback, void *user_data)
647{
649 callback, user_data);
650}
651
659static inline uint64_t w1_rom_to_uint64(const struct w1_rom *rom)
660{
661 return sys_get_be64((uint8_t *)rom);
662}
663
670static inline void w1_uint64_to_rom(const uint64_t rom64, struct w1_rom *rom)
671{
672 sys_put_be64(rom64, (uint8_t *)rom);
673}
674
687static inline uint8_t w1_crc8(const uint8_t *src, size_t len)
688{
689 return crc8(src, len, W1_CRC8_POLYNOMIAL, W1_CRC8_SEED, true);
690}
691
707static inline uint16_t w1_crc16(const uint16_t seed, const uint8_t *src,
708 const size_t len)
709{
710 return crc16_reflect(W1_CRC16_POLYNOMIAL, seed, src, len);
711}
712
717#ifdef __cplusplus
718}
719#endif
720
724#include <zephyr/syscalls/w1.h>
725
726#endif /* ZEPHYR_INCLUDE_DRIVERS_W1_H_ */
#define K_FOREVER
Generate infinite timeout delay.
Definition kernel.h:1524
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.
w1_settings_type
Defines the 1-Wire master settings types, which are runtime configurable.
Definition w1.h:56
static int w1_unlock_bus(const struct device *dev)
Unlock the 1-wire bus.
Definition w1.h:161
static int w1_lock_bus(const struct device *dev)
Lock the 1-wire bus to prevent simultaneous access.
Definition w1.h:146
@ 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:623
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:645
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:659
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:472
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:687
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:707
#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:385
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:670
#define W1_SEARCH_ALL_FAMILIES
This flag can be passed to searches in order to not filter on family ID.
Definition w1.h:424
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:413
#define W1_CRC16_POLYNOMIAL
Polynomial used to calculate the 1-Wire 16-bit crc.
Definition w1.h:419
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:415
#define W1_CMD_SEARCH_ALARM
This command allows the bus master to identify which devices have experienced an alarm condition.
Definition w1.h:391
Public kernel APIs.
Size of off_t must be equal or less than size of size_t
Definition retained_mem.h:29
__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:510
void * data
Address of the device instance private data.
Definition device.h:520
const void * api
Address of the API structure exposed by the device instance.
Definition device.h:516
const void * config
Address of device instance config information.
Definition device.h:514
Mutex Structure.
Definition kernel.h:3159
w1_rom struct.
Definition w1.h:435
uint8_t serial[6]
The serial together with the family code composes the unique 56-bit id.
Definition w1.h:444
uint8_t crc
8-bit checksum of the 56-bit unique id.
Definition w1.h:446
uint8_t family
The 1-Wire family code identifying the slave device type.
Definition w1.h:442
Node specific 1-wire configuration struct.
Definition w1.h:455
struct w1_rom rom
Unique 1-Wire ROM.
Definition w1.h:457
uint32_t overdrive
overdrive speed is used if set to 1.
Definition w1.h:459
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:397
static uint64_t sys_get_be64(const uint8_t src[8])
Get a 64-bit integer stored in big-endian format.
Definition byteorder.h:578
CRC computation function.