dde98164c6cff4952c611d11e28ce44affbe8155
[tpg/acess2.git] / UDI / drivers / helpers.h
1 /*
2  * UDI Driver helper macros
3  */
4 #ifndef _UDI_HELPERS_H_
5 #define _UDI_HELPERS_H_
6
7 #if DEBUG_ENABLED
8 # define DEBUG_OUT(fmt, v...)   udi_debug_printf("%s: "fmt"\n", __func__ ,## v) 
9 #else
10 # define DEBUG_OUT(...) do{}while(0)
11 #endif
12
13 #define ARRAY_COUNT(arr)        (sizeof(arr)/sizeof(arr[0]))
14
15 #define __EXPJOIN(a,b)  a##b
16 #define _EXPJOIN(a,b)   __EXPJOIN(a,b)
17 #define _EXPLODE(params...)     params
18 #define _ADDGCB(params...)      (udi_cb_t *gcb, params)
19 #define CONTIN(suffix, call, args, params)      extern void _EXPJOIN(suffix##$,__LINE__) _ADDGCB params;\
20         call( _EXPJOIN(suffix##$,__LINE__), gcb, _EXPLODE args); } \
21         void _EXPJOIN(suffix##$,__LINE__) _ADDGCB params { \
22         rdata_t *rdata = gcb->context; \
23         (void)rdata;
24
25 /* Copied from http://projectudi.cvs.sourceforge.net/viewvc/projectudi/udiref/driver/udi_dpt/udi_dpt.h */
26 #define UDIH_SET_ATTR_BOOLEAN(attr, name, val)  \
27                 udi_strcpy((attr)->attr_name, (name)); \
28                 (attr)->attr_type = UDI_ATTR_BOOLEAN; \
29                 (attr)->attr_length = sizeof(udi_boolean_t); \
30                 UDI_ATTR32_SET((attr)->attr_value, (val))
31
32 #define UDIH_SET_ATTR32(attr, name, val)        \
33                 udi_strcpy((attr)->attr_name, (name)); \
34                 (attr)->attr_type = UDI_ATTR_UBIT32; \
35                 (attr)->attr_length = sizeof(udi_ubit32_t); \
36                 UDI_ATTR32_SET((attr)->attr_value, (val))
37
38 #define UDIH_SET_ATTR_ARRAY8(attr, name, val, len) \
39                 udi_strcpy((attr)->attr_name, (name)); \
40                 (attr)->attr_type = UDI_ATTR_ARRAY8; \
41                 (attr)->attr_length = (len); \
42                 udi_memcpy((attr)->attr_value, (val), (len))
43
44 #define UDIH_SET_ATTR_STRING(attr, name, val, len) \
45                 udi_strcpy((attr)->attr_name, (name)); \
46                 (attr)->attr_type = UDI_ATTR_STRING; \
47                 (attr)->attr_length = (len); \
48                 udi_strncpy_rtrim((char *)(attr)->attr_value, (val), (len))
49 #define UDIH_SET_ATTR_STRFMT(attr, name, maxlen, fmt, v...) \
50                 udi_strcpy((attr)->attr_name, (name)); \
51                 (attr)->attr_type = UDI_ATTR_STRING; \
52                 (attr)->attr_length = udi_snprintf((char *)(attr)->attr_value, (maxlen), (fmt) ,## v )
53
54 /**
55  * \brief UDI PIO Helpers
56  */
57 struct s_pio_ops {
58         udi_pio_trans_t *trans_list;
59         udi_ubit16_t    list_length;
60         udi_ubit16_t    pio_attributes;
61         udi_ubit32_t    regset_idx;
62         udi_ubit32_t    base_offset;
63         udi_ubit32_t    length;
64 };
65 #define UDIH_PIO_OPS_ENTRY(list, attr, regset, base, len)       {list, ARRAY_COUNT(list), attr, regset, base, len}
66
67
68 #define UDIH_INIT_PIO(fcnname, _array, index_field, final_code) \
69         void fcnname(udi_cb_t *gcb, udi_pio_handle_t new_pio_handle) {\
70                 rdata_t *rdata = gcb->context; \
71                 if( rdata->index_field != (udi_index_t)-1 ) { \
72                         rdata->pio_handles[rdata->index_field] = new_pio_handle; \
73                 }\
74                 rdata->index_field ++; \
75                 if( rdata->index_field < sizeof(_array)/sizeof(_array[0]) ) { \
76                         const struct s_pio_ops  *ops = &pio_ops[rdata->index_field]; \
77                         udi_pio_map(bus_dev_bind__pio_map, gcb, \
78                                 ops->regset_idx, ops->base_offset, ops->length, \
79                                 ops->trans_list, ops->list_length, \
80                                 UDI_PIO_LITTLE_ENDIAN, 0, 0 \
81                                 ); \
82                         return ; \
83                 } \
84                 final_code \
85         }
86
87 #endif

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