Merge branch 'master' of git://git.ucc.asn.au/tpg/acess2
[tpg/acess2.git] / UDI / drivers / helpers.h
diff --git a/UDI/drivers/helpers.h b/UDI/drivers/helpers.h
new file mode 100644 (file)
index 0000000..dde9816
--- /dev/null
@@ -0,0 +1,87 @@
+/*
+ * UDI Driver helper macros
+ */
+#ifndef _UDI_HELPERS_H_
+#define _UDI_HELPERS_H_
+
+#if DEBUG_ENABLED
+# define DEBUG_OUT(fmt, v...)  udi_debug_printf("%s: "fmt"\n", __func__ ,## v) 
+#else
+# define DEBUG_OUT(...)        do{}while(0)
+#endif
+
+#define ARRAY_COUNT(arr)       (sizeof(arr)/sizeof(arr[0]))
+
+#define __EXPJOIN(a,b) a##b
+#define _EXPJOIN(a,b)  __EXPJOIN(a,b)
+#define _EXPLODE(params...)    params
+#define _ADDGCB(params...)     (udi_cb_t *gcb, params)
+#define CONTIN(suffix, call, args, params)     extern void _EXPJOIN(suffix##$,__LINE__) _ADDGCB params;\
+       call( _EXPJOIN(suffix##$,__LINE__), gcb, _EXPLODE args); } \
+       void _EXPJOIN(suffix##$,__LINE__) _ADDGCB params { \
+       rdata_t *rdata = gcb->context; \
+       (void)rdata;
+
+/* Copied from http://projectudi.cvs.sourceforge.net/viewvc/projectudi/udiref/driver/udi_dpt/udi_dpt.h */
+#define UDIH_SET_ATTR_BOOLEAN(attr, name, val) \
+               udi_strcpy((attr)->attr_name, (name)); \
+               (attr)->attr_type = UDI_ATTR_BOOLEAN; \
+               (attr)->attr_length = sizeof(udi_boolean_t); \
+               UDI_ATTR32_SET((attr)->attr_value, (val))
+
+#define UDIH_SET_ATTR32(attr, name, val)       \
+               udi_strcpy((attr)->attr_name, (name)); \
+               (attr)->attr_type = UDI_ATTR_UBIT32; \
+               (attr)->attr_length = sizeof(udi_ubit32_t); \
+               UDI_ATTR32_SET((attr)->attr_value, (val))
+
+#define UDIH_SET_ATTR_ARRAY8(attr, name, val, len) \
+               udi_strcpy((attr)->attr_name, (name)); \
+               (attr)->attr_type = UDI_ATTR_ARRAY8; \
+               (attr)->attr_length = (len); \
+               udi_memcpy((attr)->attr_value, (val), (len))
+
+#define UDIH_SET_ATTR_STRING(attr, name, val, len) \
+               udi_strcpy((attr)->attr_name, (name)); \
+               (attr)->attr_type = UDI_ATTR_STRING; \
+               (attr)->attr_length = (len); \
+               udi_strncpy_rtrim((char *)(attr)->attr_value, (val), (len))
+#define UDIH_SET_ATTR_STRFMT(attr, name, maxlen, fmt, v...) \
+               udi_strcpy((attr)->attr_name, (name)); \
+               (attr)->attr_type = UDI_ATTR_STRING; \
+               (attr)->attr_length = udi_snprintf((char *)(attr)->attr_value, (maxlen), (fmt) ,## v )
+
+/**
+ * \brief UDI PIO Helpers
+ */
+struct s_pio_ops {
+       udi_pio_trans_t *trans_list;
+       udi_ubit16_t    list_length;
+       udi_ubit16_t    pio_attributes;
+       udi_ubit32_t    regset_idx;
+       udi_ubit32_t    base_offset;
+       udi_ubit32_t    length;
+};
+#define UDIH_PIO_OPS_ENTRY(list, attr, regset, base, len)      {list, ARRAY_COUNT(list), attr, regset, base, len}
+
+
+#define UDIH_INIT_PIO(fcnname, _array, index_field, final_code) \
+       void fcnname(udi_cb_t *gcb, udi_pio_handle_t new_pio_handle) {\
+               rdata_t *rdata = gcb->context; \
+               if( rdata->index_field != (udi_index_t)-1 ) { \
+                       rdata->pio_handles[rdata->index_field] = new_pio_handle; \
+               }\
+               rdata->index_field ++; \
+               if( rdata->index_field < sizeof(_array)/sizeof(_array[0]) ) { \
+                       const struct s_pio_ops  *ops = &pio_ops[rdata->index_field]; \
+                       udi_pio_map(bus_dev_bind__pio_map, gcb, \
+                               ops->regset_idx, ops->base_offset, ops->length, \
+                               ops->trans_list, ops->list_length, \
+                               UDI_PIO_LITTLE_ENDIAN, 0, 0 \
+                               ); \
+                       return ; \
+               } \
+               final_code \
+       }
+
+#endif

UCC git Repository :: git.ucc.asn.au