12#if defined(OS_USE_OS_APP_CONFIG_H)
13#include <cmsis-plus/os-app-config.h>
29#pragma clang diagnostic ignored "-Wc++98-compat"
47#if defined(OS_TRACE_POSIX_IO_BLOCK_DEVICE)
48 trace::printf (
"block_device::%s(\"%s\")=@%p\n", __func__, name_,
this);
56#if defined(OS_TRACE_POSIX_IO_BLOCK_DEVICE)
57 trace::printf (
"block_device::%s() @%p %s\n", __func__,
this, name_);
66#if defined(OS_TRACE_POSIX_IO_BLOCK_DEVICE)
67 trace::printf (
"block_device::%s(%p, %u, %u) @%p\n", __func__, buf,
68 blknum, nblocks,
this);
71 if (blknum + nblocks >
impl ().num_blocks_)
77 if (!
impl ().do_is_opened ())
90#if defined(OS_TRACE_POSIX_IO_BLOCK_DEVICE)
91 trace::printf (
"block_device::%s(%p, %u, %u) @%p\n", __func__, buf,
92 blknum, nblocks,
this);
95 if (blknum + nblocks >
impl ().num_blocks_)
101 if (!
impl ().do_is_opened ())
113#if defined(OS_TRACE_POSIX_IO_BLOCK_DEVICE)
114 trace::printf (
"block_device::%s(%d) @%p\n", __func__, request,
this);
117 if (!
impl ().do_is_opened ())
125 switch (
static_cast<unsigned int> (request))
130 std::size_t* sz = va_arg (args, std::size_t*);
131 if (sz ==
nullptr ||
impl ().block_logical_size_bytes_ != 0)
137 *sz =
impl ().block_logical_size_bytes_;
144 std::size_t* sz = va_arg (args, std::size_t*);
145 if (sz ==
nullptr ||
impl ().block_physical_size_bytes_ != 0)
151 *sz =
impl ().block_physical_size_bytes_;
158 uint64_t* sz = va_arg (args, uint64_t*);
159 if (sz ==
nullptr ||
impl ().num_blocks_ != 0)
165#pragma GCC diagnostic push
166#if defined(__clang__)
167#elif defined(__GNUC__)
168#pragma GCC diagnostic ignored "-Wuseless-cast"
170 *sz = (
static_cast<uint64_t
> (
171 impl ().num_blocks_ *
impl ().block_logical_size_bytes_));
172#pragma GCC diagnostic pop
188#if defined(OS_TRACE_POSIX_IO_BLOCK_DEVICE)
189 trace::printf (
"block_device_impl::%s()=@%p\n", __func__,
this);
195#if defined(OS_TRACE_POSIX_IO_BLOCK_DEVICE)
196 trace::printf (
"block_device_impl::%s() @%p\n", __func__,
this);
199 block_logical_size_bytes_ = 0;
208#if defined(OS_TRACE_POSIX_IO_BLOCK_DEVICE)
249#if defined(OS_TRACE_POSIX_IO_BLOCK_DEVICE)
250 trace::printf (
"block_device_impl::%s(%p, %u) @%p\n", __func__, buf,
254 if ((block_logical_size_bytes_ == 0)
255 || ((nbyte % block_logical_size_bytes_) != 0)
256 || ((
static_cast<std::size_t
> (offset_) % block_logical_size_bytes_)
263 std::size_t nblocks = nbyte / block_logical_size_bytes_;
265 =
static_cast<std::size_t
> (offset_) / block_logical_size_bytes_;
267 if (blknum + nblocks > num_blocks_)
276 ret *=
static_cast<ssize_t
> (block_logical_size_bytes_);
284#if defined(OS_TRACE_POSIX_IO_BLOCK_DEVICE)
285 trace::printf (
"block_device_impl::%s(%p, %u) @%p\n", __func__, buf,
289 if ((block_logical_size_bytes_ == 0)
290 || ((nbyte % block_logical_size_bytes_) != 0)
291 || ((
static_cast<std::size_t
> (offset_) % block_logical_size_bytes_)
298 std::size_t nblocks = nbyte / block_logical_size_bytes_;
300 =
static_cast<std::size_t
> (offset_) / block_logical_size_bytes_;
302 if (blknum + nblocks > num_blocks_)
311 ret *=
static_cast<ssize_t
> (block_logical_size_bytes_);
virtual ssize_t do_read(void *buf, std::size_t nbyte) override
virtual off_t do_lseek(off_t offset, int whence) override
virtual ssize_t do_read_block(void *buf, blknum_t blknum, std::size_t nblocks)=0
virtual ~block_device_impl() override
virtual ssize_t do_write(const void *buf, std::size_t nbyte) override
virtual ssize_t do_write_block(const void *buf, blknum_t blknum, std::size_t nblocks)=0
block_device::blknum_t blknum_t
virtual ~block_device() override
block_device_impl & impl(void) const
virtual int vioctl(int request, std::va_list args) override
virtual ssize_t read_block(void *buf, blknum_t blknum, std::size_t nblocks=1)
virtual ssize_t write_block(const void *buf, blknum_t blknum, std::size_t nblocks=1)
virtual int do_vioctl(int request, std::va_list args)=0
static void link(value_type *device)
int printf(const char *format,...)
Write a formatted string to the trace device.