Dawn Framework 1.0
Universal data acquisition framework for embedded systems
descriptor.cxx
1// dawn/src/io/descriptor.cxx
2//
3// SPDX-License-Identifier: Apache-2.0
4//
5
6#include "dawn/io/descriptor.hxx"
7
8using namespace dawn;
9
10int CIODescriptor::configureDesc(const CDescObject &desc)
11{
12 const SObjectCfg::SObjectCfgItem *item = nullptr;
13 size_t offset = 0;
14 size_t i = 0;
15
16 for (i = 0; i < desc.getSize(); i++)
17 {
18 item = desc.objectCfgItemAtOffset(offset);
19
20 switch (item->cfgid.s.cls)
21 {
23 {
24 offset += cfgCmnOffset(item);
25 break;
26 }
27
28 default:
29 {
30 DAWNERR("unsupported descriptor cfg 0x08%" PRIx32 "\n", item->cfgid.v);
31 return -EINVAL;
32 }
33 }
34 }
35
36 return OK;
37}
38
39CIODescriptor::~CIODescriptor()
40{
41 deinit();
42}
43
45{
47 int ret;
48
49 // Configure
50
51 ret = configureDesc(getDesc());
52 if (ret != OK)
53 {
54 return ret;
55 }
56
57 // get descriptor data
58
59 ret = dev->getDescriptor(getCmnDevno(), regDesc);
60 if (ret < 0)
61 {
62 DAWNERR("Failed to get descriptor data\n");
63 }
64
65 return ret;
66}
67
69{
70 return OK;
71}
72
74{
75 if (len != 1)
76 {
77 return -EINVAL;
78 }
79
80 if (data.getDataSize() < regDesc.len)
81 {
82 return -ENOMEM;
83 }
84
85 std::memcpy(data.getDataPtr(0), regDesc.ptr, regDesc.len);
86
87 return OK;
88}
89
91{
92 (void)data;
93 return -ENOTSUP;
94}
95
96int CIODescriptor::setDataAtImpl(IODataCmn &data, size_t offset)
97{
99 int ret;
100
101 if (getCmnDevno() == 0)
102 {
103 return -EROFS;
104 }
105
106 ret = dev->writeSlotData(getCmnDevno(), data.getDataPtr(0), offset, data.getDataSize());
107 if (ret < 0)
108 {
109 return ret;
110 }
111
112 ret = dev->getDescriptor(getCmnDevno(), regDesc);
113 if (ret < 0)
114 {
115 DAWNERR("Failed to refresh descriptor data\n");
116 return ret;
117 }
118
119 return OK;
120}
121
122int CIODescriptor::getDataAtImpl(IODataCmn &data, size_t len, size_t offset)
123{
124 size_t avail;
125 size_t to_copy;
126
127 if (len != 1)
128 {
129 return -EINVAL;
130 }
131
132 if (offset >= regDesc.len)
133 {
134 return -EINVAL;
135 }
136
137 avail = regDesc.len - offset;
138 to_copy = data.getDataSize() < avail ? data.getDataSize() : avail;
139
140 std::memcpy(data.getDataPtr(0), static_cast<const uint8_t *>(regDesc.ptr) + offset, to_copy);
141
142 return OK;
143}
144
145#ifdef CONFIG_DAWN_IO_NOTIFY
146int CIODescriptor::getFd() const
147{
148 // Not supported
149
150 return -1;
151};
152#endif
153
155{
156 return regDesc.len;
157}
158
160{
161 // Block payload uses 1-byte data units.
162 return regDesc.len;
163}
Descriptor wrapper for individual object configuration.
size_t getSize() const
Get number of configuration items for this object.
SObjectCfg::SObjectCfgItem * objectCfgItemAtOffset(size_t offset) const
Get configuration item at specified offset.
Descriptor interface available for IO.
int getDescriptor(int inst, SDescriptorReg &reg)
Get registered descriptor data for an instance.
static CDevDescriptor * getInst()
Get singleton instance.
int writeSlotData(int inst, const void *data, size_t offset, size_t len)
Write descriptor bytes into a RAM slot.
virtual int getFd() const
Get file descriptor for notifications.
Definition common.hxx:425
int getCmnDevno() const
Get device number for this I/O.
Definition common.hxx:798
size_t cfgCmnOffset(const SObjectCfg::SObjectCfgItem *cfg)
Get offset of configuration item in descriptor.
Definition common.cxx:144
@ IO_CLASS_ANY
Any I/O class.
Definition common.hxx:86
int deinit()
De-initialize object.
int setDataImpl(IODataCmn &data)
Set data implementation (override in derived classes).
size_t getDataSize() const
Get data size in bytes.
int getDataImpl(IODataCmn &data, size_t len)
Get data implementation (override in derived classes).
int configure()
Configure object from descriptor data.
int setDataAtImpl(IODataCmn &data, size_t offset)
Set data at byte offset (override in seekable IOs).
int getDataAtImpl(IODataCmn &data, size_t len, size_t offset)
Get data at byte offset (override in seekable IOs).
size_t getDataDim() const
Get data vector dimension.
CDescObject & getDesc()
Get descriptor object for this object.
Definition object.cxx:190
Out-of-tree user-extension hooks for Dawn.
Definition bindable.hxx:13
size_t len
Descriptor length in bytes.
void * ptr
Pointer to descriptor data.
Base interface for I/O data buffers (static and dynamic).
Definition idata.hxx:21
virtual void * getDataPtr(size_t batch=0)=0
Get pointer to data only (skips timestamp if present).
virtual size_t getDataSize()=0
Get data size in bytes.
Single configuration item within object.
UObjectCfgId cfgid
Configuration ID header (type, class, id, size, rw, dtype).
ObjectCfgId v
Raw 32-bit ConfigID value (for storage, comparison).
Definition objectcfg.hxx:82
uint32_t cls
Object class (bits 21-29, max 511).
struct dawn::SObjectCfg::UObjectCfgId::@10 s
Bit-field structure for named member access.