Modules/UDI - GIO Metalanguage Binding, GIO UART support, init error handling
[tpg/acess2.git] / KernelLand / Modules / Interfaces / UDI / udi_lib / core / meta_gio.c
1 /**
2  * \file meta_gio.c
3  * \author John Hodge (thePowersGang)
4  */
5 #include <acess.h>      // EXPORT
6 #include <udi.h>
7 #include <udi_internal.h>       // tUDI_MetaLang
8
9 // === EXPORTS ===
10 EXPORT(udi_gio_bind_req);
11 EXPORT(udi_gio_bind_ack);
12 EXPORT(udi_gio_unbind_req);
13 EXPORT(udi_gio_unbind_ack);
14 EXPORT(udi_gio_xfer_req);
15 EXPORT(udi_gio_xfer_ack);
16 EXPORT(udi_gio_xfer_nak);
17 EXPORT(udi_gio_event_res);
18 EXPORT(udi_gio_event_ind);
19 EXPORT(udi_gio_event_res_unused);
20
21 extern udi_mei_init_t   udi_mei_info__gio;
22 #define udi_mei_info    udi_mei_info__gio
23
24 // === CODE ===
25 UDI_MEI_STUBS(udi_gio_bind_req, udi_gio_bind_cb_t,
26         0, (), (), (),
27         UDI_GIO_PROVIDER_OPS_NUM, 1)
28 udi_layout_t    _udi_gio_bind_req_marshal_layout[] = { UDI_DL_END };
29
30 UDI_MEI_STUBS(udi_gio_bind_ack, udi_gio_bind_cb_t,
31         3, (device_size_lo, device_size_hi, status), (udi_ubit32_t, udi_ubit32_t, udi_status_t), (UDI_VA_UBIT32_T, UDI_VA_UBIT32_T, UDI_VA_STATUS_T),
32         UDI_GIO_CLIENT_OPS_NUM, 1)
33 udi_layout_t    _udi_gio_bind_ack_marshal_layout[] = { UDI_DL_UBIT32_T, UDI_DL_UBIT32_T, UDI_DL_INDEX_T, UDI_DL_END };
34
35
36
37 UDI_MEI_STUBS(udi_gio_unbind_req, udi_gio_bind_cb_t,
38         0, (), (), (),
39         UDI_GIO_PROVIDER_OPS_NUM, 2)
40 udi_layout_t    _udi_gio_unbind_req_marshal_layout[] = { UDI_DL_END };
41
42 UDI_MEI_STUBS(udi_gio_unbind_ack, udi_gio_bind_cb_t,
43         0, (), (), (),
44         UDI_GIO_CLIENT_OPS_NUM, 2)
45 udi_layout_t    _udi_gio_unbind_ack_marshal_layout[] = { UDI_DL_END };
46
47
48 UDI_MEI_STUBS(udi_gio_xfer_req, udi_gio_xfer_cb_t,
49         0, (), (), (),
50         UDI_GIO_PROVIDER_OPS_NUM, 3)
51 udi_layout_t    _udi_gio_xfer_req_marshal_layout[] = { UDI_DL_END };
52
53 UDI_MEI_STUBS(udi_gio_xfer_ack, udi_gio_xfer_cb_t,
54         0, (), (), (),
55         UDI_GIO_CLIENT_OPS_NUM, 3)
56 udi_layout_t    _udi_gio_xfer_ack_marshal_layout[] = { UDI_DL_END };
57
58 UDI_MEI_STUBS(udi_gio_xfer_nak, udi_gio_xfer_cb_t,
59         1, (status), (udi_status_t), (UDI_VA_STATUS_T),
60         UDI_GIO_CLIENT_OPS_NUM, 4)
61 udi_layout_t    _udi_gio_xfer_nak_marshal_layout[] = { UDI_DL_STATUS_T, UDI_DL_END };
62
63
64 UDI_MEI_STUBS(udi_gio_event_res, udi_gio_event_cb_t,
65         0, (), (), (),
66         UDI_GIO_PROVIDER_OPS_NUM, 4)
67 udi_layout_t    _udi_gio_event_res_marshal_layout[] = { UDI_DL_END };
68
69 void udi_gio_event_ind_unused(udi_gio_event_cb_t *cb)
70 {
71         UNIMPLEMENTED();
72 }
73
74 UDI_MEI_STUBS(udi_gio_event_ind, udi_gio_event_cb_t,
75         0, (), (), (),
76         UDI_GIO_CLIENT_OPS_NUM, 5)
77 udi_layout_t    _udi_gio_event_ind_marshal_layout[] = { UDI_DL_END };
78
79 void udi_gio_event_res_unused(udi_gio_event_cb_t *cb)
80 {
81         UNIMPLEMENTED();
82 }
83
84 // -----------
85 // 1: UDI_GIO_BIND_CB_NUM
86 udi_layout_t    _GIO_BIND_cb_layout[] = {
87         //UDI_DL_XFER_CONSTRAINTS,
88                 UDI_DL_UBIT32_T,
89                 UDI_DL_UBIT32_T,
90                 UDI_DL_UBIT32_T,
91                 UDI_DL_BOOLEAN_T,
92                 UDI_DL_BOOLEAN_T,
93                 UDI_DL_BOOLEAN_T,
94         UDI_DL_END
95 };
96 // 2: UDI_GIO_XFER_CB_NUM
97 udi_layout_t    _GIO_XFER_cb_layout[] = {
98         UDI_DL_UBIT8_T, // udi_gio_op_t
99         UDI_DL_INLINE_DRIVER_TYPED,
100         UDI_DL_BUF,
101                 offsetof(udi_gio_xfer_cb_t, op),
102                 UDI_GIO_DIR_WRITE,
103                 UDI_GIO_DIR_WRITE,
104         UDI_DL_END
105 };
106 // 3: UDI_GIO_EVENT_CB_NUM
107 udi_layout_t    _GIO_EVENT_cb_layout[] = {
108         UDI_DL_UBIT8_T,
109         UDI_DL_INLINE_DRIVER_TYPED,
110         UDI_DL_END
111 };
112
113 // -----------
114 #define UDI__OPS_NUM    0
115 #define MEI_OPINFO(name,cat,flags,cbtype,rsp_ops,rsp_idx,err_ops,err_idx)       \
116         {#name, UDI_MEI_OPCAT_##cat,flags,UDI_##cbtype##_CB_NUM, \
117                 UDI_##rsp_ops##_OPS_NUM,rsp_idx,UDI_##err_ops##_OPS_NUM,err_idx, \
118                 name##_direct, name##_backend, _##cbtype##_cb_layout, _##name##_marshal_layout }
119 udi_mei_op_template_t   udi_mei_info__gio__prov_ops[] = {
120         MEI_OPINFO(udi_gio_bind_req, REQ, 0, GIO_BIND, GIO_CLIENT,1, ,0),
121         MEI_OPINFO(udi_gio_unbind_req, REQ, 0, GIO_BIND, GIO_CLIENT,2, ,0),
122         MEI_OPINFO(udi_gio_xfer_req, REQ, UDI_MEI_OP_ABORTABLE, GIO_XFER, GIO_CLIENT,3, GIO_CLIENT,4),
123         MEI_OPINFO(udi_gio_event_res, RES, 0, GIO_EVENT, ,0, ,0),
124         {0}
125 };
126 udi_mei_op_template_t   udi_mei_info__gio__client_ops[] = {
127         MEI_OPINFO(udi_gio_bind_ack, ACK, 0, GIO_BIND, ,0, ,0),
128         MEI_OPINFO(udi_gio_unbind_ack, ACK, 0, GIO_BIND, ,0, ,0),
129         MEI_OPINFO(udi_gio_xfer_ack, ACK, 0, GIO_XFER, ,0, ,0),
130         MEI_OPINFO(udi_gio_xfer_nak, ACK, 0, GIO_XFER, ,0, ,0),
131         MEI_OPINFO(udi_gio_event_ind, IND, 0, GIO_EVENT, GIO_PROVIDER,4, ,0),
132         {0}
133 };
134 udi_mei_ops_vec_template_t      udi_mei_info__gio_ops[] = {
135         {UDI_GIO_PROVIDER_OPS_NUM, UDI_MEI_REL_EXTERNAL|UDI_MEI_REL_BIND|UDI_MEI_REL_INITIATOR, udi_mei_info__gio__prov_ops},
136         {UDI_GIO_CLIENT_OPS_NUM, UDI_MEI_REL_EXTERNAL|UDI_MEI_REL_BIND, udi_mei_info__gio__client_ops},
137         {0}
138 };
139 udi_mei_init_t  udi_mei_info__gio = {
140         udi_mei_info__gio_ops,
141         NULL
142 };
143 tUDI_MetaLang   cMetaLang_GIO = {
144         "udi_gio",
145         &udi_mei_info__gio,
146         4,
147         {
148                 {0},
149                 {sizeof(udi_gio_bind_cb_t),  0, _GIO_BIND_cb_layout},
150                 {sizeof(udi_gio_xfer_cb_t),  0, _GIO_XFER_cb_layout},
151                 {sizeof(udi_gio_event_cb_t), 0, _GIO_EVENT_cb_layout},
152         }
153 };

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