Zephyr Project API  3.2.0
A Scalable Open Source RTOS
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#ifndef ZEPHYR_INCLUDE_DRIVERS_W1_H_
14#define ZEPHYR_INCLUDE_DRIVERS_W1_H_
15
16#include <zephyr/types.h>
17#include <zephyr/device.h>
18#include <zephyr/sys/crc.h>
20
21#ifdef __cplusplus
22extern "C" {
23#endif
24
34/*
35 * Count the number of slaves expected on the bus.
36 * This can be used to decide if the bus has a multidrop topology or
37 * only a single slave is present.
38 * There is a comma after each ordinal (including the last)
39 * Hence FOR_EACH adds "+1" once too often which has to be subtracted in the end.
40 */
41#define F1(x) 1
42#define W1_SLAVE_COUNT(node_id) \
43 (FOR_EACH(F1, (+), DT_SUPPORTS_DEP_ORDS(node_id)) - 1)
44#define W1_INST_SLAVE_COUNT(inst) \
45 (W1_SLAVE_COUNT(DT_DRV_INST(inst)))
46
62
67};
68
72struct w1_master_config {
73 /* Number of connected slaves */
74 uint16_t slave_count;
75};
76
78struct w1_master_data {
79 /* The mutex used by w1_lock_bus and w1_unlock_bus methods */
80 struct k_mutex bus_lock;
81};
82
83typedef int (*w1_reset_bus_t)(const struct device *dev);
84typedef int (*w1_read_bit_t)(const struct device *dev);
85typedef int (*w1_write_bit_t)(const struct device *dev, bool bit);
86typedef int (*w1_read_byte_t)(const struct device *dev);
87typedef int (*w1_write_byte_t)(const struct device *dev, const uint8_t byte);
88typedef int (*w1_read_block_t)(const struct device *dev, uint8_t *buffer,
89 size_t len);
90typedef int (*w1_write_block_t)(const struct device *dev, const uint8_t *buffer,
91 size_t len);
92typedef size_t (*w1_get_slave_count_t)(const struct device *dev);
93typedef int (*w1_configure_t)(const struct device *dev,
94 enum w1_settings_type type, uint32_t value);
95
96__subsystem struct w1_driver_api {
97 w1_reset_bus_t reset_bus;
98 w1_read_bit_t read_bit;
99 w1_write_bit_t write_bit;
100 w1_read_byte_t read_byte;
101 w1_write_byte_t write_byte;
102 w1_read_block_t read_block;
103 w1_write_block_t write_block;
104 w1_configure_t configure;
105};
109__syscall int w1_change_bus_lock(const struct device *dev, bool lock);
110
111static inline int z_impl_w1_change_bus_lock(const struct device *dev, bool lock)
112{
113 struct w1_master_data *ctrl_data = (struct w1_master_data *)dev->data;
114
115 if (lock) {
116 return k_mutex_lock(&ctrl_data->bus_lock, K_FOREVER);
117 } else {
118 return k_mutex_unlock(&ctrl_data->bus_lock);
119 }
120}
135static inline int w1_lock_bus(const struct device *dev)
136{
137 return w1_change_bus_lock(dev, true);
138}
139
150static inline int w1_unlock_bus(const struct device *dev)
151{
152 return w1_change_bus_lock(dev, false);
153}
154
181__syscall int w1_reset_bus(const struct device *dev);
182
183static inline int z_impl_w1_reset_bus(const struct device *dev)
184{
185 const struct w1_driver_api *api = (const struct w1_driver_api *)dev->api;
186
187 return api->reset_bus(dev);
188}
189
198__syscall int w1_read_bit(const struct device *dev);
199
200static inline int z_impl_w1_read_bit(const struct device *dev)
201{
202 const struct w1_driver_api *api = (const struct w1_driver_api *)dev->api;
203
204 return api->read_bit(dev);
205}
206
216__syscall int w1_write_bit(const struct device *dev, const bool bit);
217
218static inline int z_impl_w1_write_bit(const struct device *dev, bool bit)
219{
220 const struct w1_driver_api *api = (const struct w1_driver_api *)dev->api;
221
222 return api->write_bit(dev, bit);
223}
224
233__syscall int w1_read_byte(const struct device *dev);
234
235static inline int z_impl_w1_read_byte(const struct device *dev)
236{
237 const struct w1_driver_api *api = (const struct w1_driver_api *)dev->api;
238
239 return api->read_byte(dev);
240}
241
251__syscall int w1_write_byte(const struct device *dev, uint8_t byte);
252
253static inline int z_impl_w1_write_byte(const struct device *dev, uint8_t byte)
254{
255 const struct w1_driver_api *api = (const struct w1_driver_api *)dev->api;
256
257 return api->write_byte(dev, byte);
258}
259
270__syscall int w1_read_block(const struct device *dev, uint8_t *buffer, size_t len);
271
282__syscall int w1_write_block(const struct device *dev,
283 const uint8_t *buffer, size_t len);
284
293__syscall size_t w1_get_slave_count(const struct device *dev);
294
295static inline size_t z_impl_w1_get_slave_count(const struct device *dev)
296{
297 const struct w1_master_config *ctrl_cfg =
298 (const struct w1_master_config *)dev->config;
299
300 return ctrl_cfg->slave_count;
301}
302
317__syscall int w1_configure(const struct device *dev,
318 enum w1_settings_type type, uint32_t value);
319
320static inline int z_impl_w1_configure(const struct device *dev,
321 enum w1_settings_type type, uint32_t value)
322{
323 const struct w1_driver_api *api = (const struct w1_driver_api *)dev->api;
324
325 return api->configure(dev, type, value);
326}
327
343#define W1_CMD_SKIP_ROM 0xCC
344#define W1_CMD_MATCH_ROM 0x55
345#define W1_CMD_RESUME 0xA5
346#define W1_CMD_READ_ROM 0x33
347#define W1_CMD_SEARCH_ROM 0xF0
348#define W1_CMD_SEARCH_ALARM 0xEC
349#define W1_CMD_OVERDRIVE_SKIP_ROM 0x3C
350#define W1_CMD_OVERDRIVE_MATCH_ROM 0x69
351
360#define W1_CRC8_SEED 0x00
362#define W1_CRC8_POLYNOMIAL 0x8C
364#define W1_CRC16_SEED 0x0000
366#define W1_CRC16_POLYNOMIAL 0xa001
367
371#define W1_SEARCH_ALL_FAMILIES 0x00
372
374#define W1_ROM_INIT_ZERO \
375 { \
376 .family = 0, .serial = { 0 }, .crc = 0, \
377 }
378
382struct w1_rom {
394};
395
404 struct w1_rom rom;
408 uint32_t res : 31;
410};
411
419typedef void (*w1_search_callback_t)(struct w1_rom rom, void *user_data);
420
438int w1_read_rom(const struct device *dev, struct w1_rom *rom);
439
460int w1_match_rom(const struct device *dev, const struct w1_slave_config *config);
461
474int w1_resume_command(const struct device *dev);
475
491int w1_skip_rom(const struct device *dev, const struct w1_slave_config *config);
492
504int w1_reset_select(const struct device *dev, const struct w1_slave_config *config);
505
523int w1_write_read(const struct device *dev, const struct w1_slave_config *config,
524 const uint8_t *write_buf, size_t write_len,
525 uint8_t *read_buf, size_t read_len);
526
551__syscall int w1_search_bus(const struct device *dev, uint8_t command,
553 void *user_data);
554
570static inline int w1_search_rom(const struct device *dev,
571 w1_search_callback_t callback, void *user_data)
572{
574 callback, user_data);
575}
576
592static inline int w1_search_alarm(const struct device *dev,
593 w1_search_callback_t callback, void *user_data)
594{
596 callback, user_data);
597}
598
606static inline uint64_t w1_rom_to_uint64(const struct w1_rom *rom)
607{
608 return sys_get_be64((uint8_t *)rom);
609}
610
617static inline void w1_uint64_to_rom(const uint64_t rom64, struct w1_rom *rom)
618{
619 sys_put_be64(rom64, (uint8_t *)rom);
620}
621
634static inline uint8_t w1_crc8(const uint8_t *src, size_t len)
635{
636 return crc8(src, len, W1_CRC8_POLYNOMIAL, W1_CRC8_SEED, true);
637}
638
654static inline uint16_t w1_crc16(const uint16_t seed, const uint8_t *src,
655 const size_t len)
656{
657 return crc16_reflect(W1_CRC16_POLYNOMIAL, seed, src, len);
658}
659
664#ifdef __cplusplus
665}
666#endif
667
671#include <syscalls/w1.h>
672
673#endif /* ZEPHYR_INCLUDE_DRIVERS_W1_H_ */
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:286
static uint64_t sys_get_be64(const uint8_t src[8])
Get a 64-bit integer stored in big-endian format.
Definition: byteorder.h:437
CRC computation function.
#define K_FOREVER
Generate infinite timeout delay.
Definition: kernel.h:1236
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:52
static int w1_unlock_bus(const struct device *dev)
Unlock the 1-wire bus.
Definition: w1.h:150
static int w1_lock_bus(const struct device *dev)
Lock the 1-wire bus to prevent simultaneous access.
Definition: w1.h:135
@ W1_SETTING_SPEED
Definition: w1.h:56
@ W1_SETINGS_TYPE_COUNT
Definition: w1.h:66
@ W1_SETTING_STRONG_PULLUP
Definition: w1.h:61
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:570
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:592
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:606
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:419
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:634
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:654
#define W1_CMD_SEARCH_ROM
Definition: w1.h:347
int w1_resume_command(const struct device *dev)
Select the slave last addressed with a Match ROM or Search ROM commnad.
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:617
#define W1_SEARCH_ALL_FAMILIES
Definition: w1.h:371
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, otherweise use Match ROM command.
#define W1_CRC8_SEED
Definition: w1.h:360
#define W1_CRC16_POLYNOMIAL
Definition: w1.h:366
int w1_skip_rom(const struct device *dev, const struct w1_slave_config *config)
Select all slaves regardless of ROM.
#define W1_CRC8_POLYNOMIAL
Definition: w1.h:362
#define W1_CMD_SEARCH_ALARM
Definition: w1.h:348
static struct k_spinlock lock
Definition: spinlock_error_case.c:12
__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:435
void * data
Definition: device.h:445
const void * api
Definition: device.h:441
const void * config
Definition: device.h:439
Definition: kernel.h:2721
w1_rom struct.
Definition: w1.h:382
uint8_t serial[6]
Definition: w1.h:391
uint8_t crc
Definition: w1.h:393
uint8_t family
The 1-Wire family code identifying the slave device type.
Definition: w1.h:389
Node specific 1-wire configuration struct.
Definition: w1.h:402
struct w1_rom rom
Definition: w1.h:404
uint32_t overdrive
Definition: w1.h:406
static ZTEST_BMEM char buffer[8]
Definition: test_mbox_api.c:551
static const intptr_t user_data[5]
Definition: main.c:588