3 * - By John Hodge (thePowersGang)
6 * - Definitions for opaque structures
8 #ifndef _UDI_INTERNAL_H_
9 #define _UDI_INTERNAL_H_
13 #define NEW(type,extra) (type*)calloc(sizeof(type)extra,1)
14 #define NEW_wA(type,fld,cnt) NEW(type,+(sizeof(((type*)NULL)->fld[0])*cnt))
16 typedef struct sUDI_PropMessage tUDI_PropMessage;
17 typedef struct sUDI_PropRegion tUDI_PropRegion;
19 typedef const struct sUDI_MetaLang tUDI_MetaLang;
21 typedef struct sUDI_MetaLangRef tUDI_MetaLangRef;
22 typedef struct sUDI_BindOps tUDI_BindOps;
24 typedef struct sUDI_DriverModule tUDI_DriverModule;
25 typedef struct sUDI_DriverInstance tUDI_DriverInstance;
26 typedef struct sUDI_DriverRegion tUDI_DriverRegion;
28 struct sUDI_PropMessage
35 struct sUDI_PropRegion
37 udi_index_t RegionIdx;
39 UDI_REGIONTYPE_NORMAL,
43 UDI_REGIONBINDING_STATIC,
44 UDI_REGIONBINDING_DYNAMIC,
52 UDI_REGIONLATENCY_NONOVERRRUNABLE,
53 UDI_REGIONLATENCY_POWERFAIL,
54 UDI_REGIONLATENCY_OVERRUNNABLE,
55 UDI_REGIONLATENCY_RETRYABLE,
57 UDI_REGIONLATENCY_NONCTRITICAL,
59 udi_ubit32_t OverrunTime;
62 udi_index_t PriBindOps;
63 udi_index_t SecBindOps;
76 struct sUDI_MetaLangRef
79 const char *interface_name;
80 tUDI_MetaLang *metalang;
81 // TODO: pointer to metalanguage structure
87 udi_ubit8_t region_idx;
89 udi_ubit8_t bind_cb_idx;
92 struct sUDI_PropDevSpec
97 struct sUDI_DriverModule
99 tUDI_DriverModule *Next;
102 udi_init_t *InitInfo;
104 // Counts of arrays in InitInfo
108 const char *ModuleName;
110 tUDI_PropMessage *Messages; // Sorted list
113 tUDI_PropRegion *RegionTypes;
116 tUDI_MetaLangRef *MetaLangs;
119 tUDI_BindOps *Parents;
123 struct sUDI_DriverInstance
125 tUDI_DriverModule *Module;
126 udi_channel_t ManagementChannel;
127 tUDI_DriverRegion *Regions[];
130 struct sUDI_DriverRegion
132 udi_init_context_t *InitContext;
136 extern tUDI_MetaLang cMetaLang_Management;
139 // --- Index to pointer translation ---
140 extern udi_ops_init_t *UDI_int_GetOps(tUDI_DriverInstance *Inst, udi_index_t index);
141 extern tUDI_MetaLang *UDI_int_GetMetaLang(tUDI_DriverInstance *Inst, udi_index_t meta_idx);
144 extern udi_channel_t UDI_CreateChannel_Blank(tUDI_MetaLang *metalang);
145 extern int UDI_BindChannel_Raw(udi_channel_t channel, bool other_side, udi_index_t meta_ops_num, void *context, const void *ops);
146 extern int UDI_BindChannel(udi_channel_t channel, bool other_side, tUDI_DriverInstance *inst, udi_index_t ops, udi_index_t region);
147 extern const void *UDI_int_ChannelPrepForCall(udi_cb_t *gcb, tUDI_MetaLang *metalang, udi_index_t meta_ops_num);
148 extern void UDI_int_ChannelReleaseFromCall(udi_cb_t *gcb);
150 // --- Async Calls ---
151 typedef struct sUDI_DeferredCall tUDI_DeferredCall;
152 typedef void tUDI_DeferredUnmarshal(tUDI_DeferredCall *Call);
153 struct sUDI_DeferredCall
155 struct sUDI_DeferredCall *Next;
156 tUDI_DeferredUnmarshal *Unmarshal;
160 extern void UDI_int_AddDeferred(tUDI_DeferredCall *Call);
161 extern void UDI_int_MakeDeferredCb(udi_cb_t *cb, udi_op_t *handler);
162 extern void UDI_int_MakeDeferredCbU8(udi_cb_t *cb, udi_op_t *handler, udi_ubit8_t arg1);
163 extern void UDI_int_MakeDeferredCbS(udi_cb_t *cb, udi_op_t *handler, udi_status_t status);
166 extern void *udi_cb_alloc_internal(tUDI_DriverInstance *Inst, udi_ubit8_t bind_cb_idx, udi_channel_t channel);