1 /*****************************************************************************
3 (c) Cambridge Silicon Radio Limited 2010
4 All rights reserved and confidential information of CSR
6 Refer to LICENSE.txt included with this source for details
9 *****************************************************************************/
11 #include <linux/module.h>
12 #include <linux/slab.h>
13 #include "csr_prim_defs.h"
14 #include "csr_msgconv.h"
15 #include "csr_macro.h"
19 void CsrUint8Des(u8
*value
, u8
*buffer
, size_t *offset
)
21 *value
= buffer
[*offset
];
22 *offset
+= sizeof(*value
);
24 EXPORT_SYMBOL_GPL(CsrUint8Des
);
26 void CsrUint16Des(u16
*value
, u8
*buffer
, size_t *offset
)
28 *value
= (buffer
[*offset
+ 0] << 0) |
29 (buffer
[*offset
+ 1] << 8);
30 *offset
+= sizeof(*value
);
32 EXPORT_SYMBOL_GPL(CsrUint16Des
);
34 void CsrUint32Des(u32
*value
, u8
*buffer
, size_t *offset
)
36 *value
= (buffer
[*offset
+ 0] << 0) |
37 (buffer
[*offset
+ 1] << 8) |
38 (buffer
[*offset
+ 2] << 16) |
39 (buffer
[*offset
+ 3] << 24);
40 *offset
+= sizeof(*value
);
42 EXPORT_SYMBOL_GPL(CsrUint32Des
);
44 void CsrMemCpyDes(void *value
, u8
*buffer
, size_t *offset
, size_t length
)
46 memcpy(value
, &buffer
[*offset
], length
);
49 EXPORT_SYMBOL_GPL(CsrMemCpyDes
);
51 void CsrCharStringDes(char **value
, u8
*buffer
, size_t *offset
)
53 *value
= kstrdup((char *) &buffer
[*offset
], GFP_KERNEL
);
54 *offset
+= strlen(*value
) + 1;
56 EXPORT_SYMBOL_GPL(CsrCharStringDes
);
58 void CsrUtf8StringDes(u8
**value
, u8
*buffer
, size_t *offset
)
60 *value
= (u8
*)kstrdup((char *) &buffer
[*offset
], GFP_KERNEL
);
61 *offset
+= strlen((char *) *value
) + 1;
64 void CsrUtf16StringDes(u16
**value
, u8
*buffer
, size_t *offset
)
68 CsrUint32Des(&length
, buffer
, offset
);
70 *value
= kmalloc(length
* sizeof(**value
), GFP_KERNEL
);
71 for (i
= 0; i
< length
; i
++)
73 CsrUint16Des(&(*value
)[i
], buffer
, offset
);
77 void CsrSizeDes(size_t *value
, u8
*buffer
, size_t *offset
)
79 *value
= (buffer
[*offset
+ 0] << 0) |
80 (buffer
[*offset
+ 1] << 8) |
81 (buffer
[*offset
+ 2] << 16) |
82 (buffer
[*offset
+ 3] << 24);
83 *offset
+= sizeof(*value
);
86 void CsrVoidPtrDes(void **value
, u8
*buffer
, size_t *offset
)
88 CsrSizeDes((size_t *) value
, buffer
, offset
);
91 void CsrUint8Ser(u8
*buffer
, size_t *offset
, u8 value
)
93 buffer
[*offset
] = value
;
94 *offset
+= sizeof(value
);
96 EXPORT_SYMBOL_GPL(CsrUint8Ser
);
98 void CsrUint16Ser(u8
*buffer
, size_t *offset
, u16 value
)
100 buffer
[*offset
+ 0] = (u8
) ((value
>> 0) & 0xFF);
101 buffer
[*offset
+ 1] = (u8
) ((value
>> 8) & 0xFF);
102 *offset
+= sizeof(value
);
104 EXPORT_SYMBOL_GPL(CsrUint16Ser
);
106 void CsrUint32Ser(u8
*buffer
, size_t *offset
, u32 value
)
108 buffer
[*offset
+ 0] = (u8
) ((value
>> 0) & 0xFF);
109 buffer
[*offset
+ 1] = (u8
) ((value
>> 8) & 0xFF);
110 buffer
[*offset
+ 2] = (u8
) ((value
>> 16) & 0xFF);
111 buffer
[*offset
+ 3] = (u8
) ((value
>> 24) & 0xFF);
112 *offset
+= sizeof(value
);
114 EXPORT_SYMBOL_GPL(CsrUint32Ser
);
116 void CsrMemCpySer(u8
*buffer
, size_t *offset
, const void *value
, size_t length
)
118 memcpy(&buffer
[*offset
], value
, length
);
121 EXPORT_SYMBOL_GPL(CsrMemCpySer
);
123 void CsrCharStringSer(u8
*buffer
, size_t *offset
, const char *value
)
127 strcpy(((char *) &buffer
[*offset
]), value
);
128 *offset
+= strlen(value
) + 1;
132 CsrUint8Ser(buffer
, offset
, 0);
135 EXPORT_SYMBOL_GPL(CsrCharStringSer
);
137 void CsrUtf8StringSer(u8
*buffer
, size_t *offset
, const u8
*value
)
139 CsrCharStringSer(buffer
, offset
, (char *) value
);
142 void CsrUtf16StringSer(u8
*buffer
, size_t *offset
, const u16
*value
)
146 u32 length
= CsrUtf16StrLen(value
) + 1;
149 CsrUint32Ser(buffer
, offset
, length
);
151 for (i
= 0; i
< length
; i
++)
153 CsrUint16Ser(buffer
, offset
, (u16
) value
[i
]);
158 CsrUint32Ser(buffer
, offset
, 0);
162 void CsrSizeSer(u8
*buffer
, size_t *offset
, size_t value
)
164 buffer
[*offset
+ 0] = (u8
) ((value
>> 0) & 0xFF);
165 buffer
[*offset
+ 1] = (u8
) ((value
>> 8) & 0xFF);
166 buffer
[*offset
+ 2] = (u8
) ((value
>> 16) & 0xFF);
167 buffer
[*offset
+ 3] = (u8
) ((value
>> 24) & 0xFF);
168 *offset
+= sizeof(value
);
171 void CsrVoidPtrSer(u8
*buffer
, size_t *offset
, void *ptr
)
173 CsrSizeSer(buffer
, offset
, (size_t) ptr
);
176 u32
CsrCharStringSerLen(const char *str
)
180 return (u32
)(strlen(str
) + sizeof(*str
));
188 u32
CsrUtf8StringSerLen(const u8
*str
)
192 return (u32
)(strlen((char *) str
) + sizeof(*str
));
200 u32
CsrUtf16StringSerLen(const u16
*str
)
204 /* We always write down the length of the string */
205 return sizeof(u32
) + (CsrUtf16StrLen(str
) + 1) * sizeof(*str
);
213 size_t CsrEventSizeof(void *msg
)
218 u8
*CsrEventSer(u8
*ptr
, size_t *len
, void *msg
)
220 CsrEvent
*primitive
= (CsrEvent
*) msg
;
222 CsrUint16Ser(ptr
, len
, primitive
->type
);
226 void *CsrEventDes(u8
*buffer
, size_t length
)
228 CsrEvent
*primitive
= kmalloc(sizeof(CsrEvent
), GFP_KERNEL
);
230 CsrUint16Des(&primitive
->type
, buffer
, &offset
);
235 size_t CsrEventCsrUint8Sizeof(void *msg
)
240 u8
*CsrEventCsrUint8Ser(u8
*ptr
, size_t *len
, void *msg
)
242 CsrEventCsrUint8
*primitive
= (CsrEventCsrUint8
*) msg
;
244 CsrUint16Ser(ptr
, len
, primitive
->type
);
245 CsrUint8Ser(ptr
, len
, primitive
->value
);
249 void *CsrEventCsrUint8Des(u8
*buffer
, size_t length
)
251 CsrEventCsrUint8
*primitive
= kmalloc(sizeof(CsrEventCsrUint8
), GFP_KERNEL
);
254 CsrUint16Des(&primitive
->type
, buffer
, &offset
);
255 CsrUint8Des(&primitive
->value
, buffer
, &offset
);
260 size_t CsrEventCsrUint16Sizeof(void *msg
)
265 u8
*CsrEventCsrUint16Ser(u8
*ptr
, size_t *len
, void *msg
)
267 CsrEventCsrUint16
*primitive
= (CsrEventCsrUint16
*) msg
;
269 CsrUint16Ser(ptr
, len
, primitive
->type
);
270 CsrUint16Ser(ptr
, len
, primitive
->value
);
274 void *CsrEventCsrUint16Des(u8
*buffer
, size_t length
)
276 CsrEventCsrUint16
*primitive
= kmalloc(sizeof(CsrEventCsrUint16
), GFP_KERNEL
);
279 CsrUint16Des(&primitive
->type
, buffer
, &offset
);
280 CsrUint16Des(&primitive
->value
, buffer
, &offset
);
285 size_t CsrEventCsrUint32Sizeof(void *msg
)
290 u8
*CsrEventCsrUint32Ser(u8
*ptr
, size_t *len
, void *msg
)
292 CsrEventCsrUint32
*primitive
= (CsrEventCsrUint32
*) msg
;
294 CsrUint16Ser(ptr
, len
, primitive
->type
);
295 CsrUint32Ser(ptr
, len
, primitive
->value
);
299 void *CsrEventCsrUint32Des(u8
*buffer
, size_t length
)
301 CsrEventCsrUint32
*primitive
= kmalloc(sizeof(CsrEventCsrUint32
), GFP_KERNEL
);
304 CsrUint16Des(&primitive
->type
, buffer
, &offset
);
305 CsrUint32Des(&primitive
->value
, buffer
, &offset
);
310 size_t CsrEventCsrUint16CsrUint8Sizeof(void *msg
)
315 u8
*CsrEventCsrUint16CsrUint8Ser(u8
*ptr
, size_t *len
, void *msg
)
317 CsrEventCsrUint16CsrUint8
*primitive
= (CsrEventCsrUint16CsrUint8
*) msg
;
319 CsrUint16Ser(ptr
, len
, primitive
->type
);
320 CsrUint16Ser(ptr
, len
, primitive
->value1
);
321 CsrUint8Ser(ptr
, len
, primitive
->value2
);
325 void *CsrEventCsrUint16CsrUint8Des(u8
*buffer
, size_t length
)
327 CsrEventCsrUint16CsrUint8
*primitive
= kmalloc(sizeof(CsrEventCsrUint16CsrUint8
), GFP_KERNEL
);
330 CsrUint16Des(&primitive
->type
, buffer
, &offset
);
331 CsrUint16Des(&primitive
->value1
, buffer
, &offset
);
332 CsrUint8Des(&primitive
->value2
, buffer
, &offset
);
337 size_t CsrEventCsrUint16CsrUint16Sizeof(void *msg
)
342 u8
*CsrEventCsrUint16CsrUint16Ser(u8
*ptr
, size_t *len
, void *msg
)
344 CsrEventCsrUint16CsrUint16
*primitive
= (CsrEventCsrUint16CsrUint16
*) msg
;
346 CsrUint16Ser(ptr
, len
, primitive
->type
);
347 CsrUint16Ser(ptr
, len
, primitive
->value1
);
348 CsrUint16Ser(ptr
, len
, primitive
->value2
);
352 void *CsrEventCsrUint16CsrUint16Des(u8
*buffer
, size_t length
)
354 CsrEventCsrUint16CsrUint16
*primitive
= kmalloc(sizeof(CsrEventCsrUint16CsrUint16
), GFP_KERNEL
);
357 CsrUint16Des(&primitive
->type
, buffer
, &offset
);
358 CsrUint16Des(&primitive
->value1
, buffer
, &offset
);
359 CsrUint16Des(&primitive
->value2
, buffer
, &offset
);
364 size_t CsrEventCsrUint16CsrUint32Sizeof(void *msg
)
369 u8
*CsrEventCsrUint16CsrUint32Ser(u8
*ptr
, size_t *len
, void *msg
)
371 CsrEventCsrUint16CsrUint32
*primitive
= (CsrEventCsrUint16CsrUint32
*) msg
;
373 CsrUint16Ser(ptr
, len
, primitive
->type
);
374 CsrUint16Ser(ptr
, len
, primitive
->value1
);
375 CsrUint32Ser(ptr
, len
, primitive
->value2
);
379 void *CsrEventCsrUint16CsrUint32Des(u8
*buffer
, size_t length
)
381 CsrEventCsrUint16CsrUint32
*primitive
= kmalloc(sizeof(CsrEventCsrUint16CsrUint32
), GFP_KERNEL
);
384 CsrUint16Des(&primitive
->type
, buffer
, &offset
);
385 CsrUint16Des(&primitive
->value1
, buffer
, &offset
);
386 CsrUint32Des(&primitive
->value2
, buffer
, &offset
);
391 size_t CsrEventCsrUint16CsrCharStringSizeof(void *msg
)
393 CsrEventCsrUint16CsrCharString
*primitive
= (CsrEventCsrUint16CsrCharString
*) msg
;
394 return 4 + strlen(primitive
->value2
) + 1;
397 u8
*CsrEventCsrUint16CsrCharStringSer(u8
*ptr
, size_t *len
, void *msg
)
399 CsrEventCsrUint16CsrCharString
*primitive
= (CsrEventCsrUint16CsrCharString
*) msg
;
401 CsrUint16Ser(ptr
, len
, primitive
->type
);
402 CsrUint16Ser(ptr
, len
, primitive
->value1
);
403 CsrCharStringSer(ptr
, len
, primitive
->value2
);
407 void *CsrEventCsrUint16CsrCharStringDes(u8
*buffer
, size_t length
)
409 CsrEventCsrUint16CsrCharString
*primitive
= kmalloc(sizeof(CsrEventCsrUint16CsrCharString
), GFP_KERNEL
);
412 CsrUint16Des(&primitive
->type
, buffer
, &offset
);
413 CsrUint16Des(&primitive
->value1
, buffer
, &offset
);
414 CsrCharStringDes(&primitive
->value2
, buffer
, &offset
);
419 size_t CsrEventCsrUint32CsrUint16Sizeof(void *msg
)
424 u8
*CsrEventCsrUint32CsrUint16Ser(u8
*ptr
, size_t *len
, void *msg
)
426 CsrEventCsrUint32CsrUint16
*primitive
= (CsrEventCsrUint32CsrUint16
*) msg
;
428 CsrUint16Ser(ptr
, len
, primitive
->type
);
429 CsrUint32Ser(ptr
, len
, primitive
->value1
);
430 CsrUint16Ser(ptr
, len
, primitive
->value2
);
434 void *CsrEventCsrUint32CsrUint16Des(u8
*buffer
, size_t length
)
436 CsrEventCsrUint32CsrUint16
*primitive
= kmalloc(sizeof(CsrEventCsrUint32CsrUint16
), GFP_KERNEL
);
439 CsrUint16Des(&primitive
->type
, buffer
, &offset
);
440 CsrUint32Des(&primitive
->value1
, buffer
, &offset
);
441 CsrUint16Des(&primitive
->value2
, buffer
, &offset
);
446 size_t CsrEventCsrUint32CsrCharStringSizeof(void *msg
)
448 CsrEventCsrUint32CsrCharString
*primitive
= (CsrEventCsrUint32CsrCharString
*) msg
;
449 return 6 + strlen(primitive
->value2
) + 1;
452 u8
*CsrEventCsrUint32CsrCharStringSer(u8
*ptr
, size_t *len
, void *msg
)
454 CsrEventCsrUint32CsrCharString
*primitive
= (CsrEventCsrUint32CsrCharString
*) msg
;
456 CsrUint16Ser(ptr
, len
, primitive
->type
);
457 CsrUint32Ser(ptr
, len
, primitive
->value1
);
458 CsrCharStringSer(ptr
, len
, primitive
->value2
);
462 void *CsrEventCsrUint32CsrCharStringDes(u8
*buffer
, size_t length
)
464 CsrEventCsrUint32CsrCharString
*primitive
= kmalloc(sizeof(CsrEventCsrUint32CsrCharString
), GFP_KERNEL
);
467 CsrUint16Des(&primitive
->type
, buffer
, &offset
);
468 CsrUint32Des(&primitive
->value1
, buffer
, &offset
);
469 CsrCharStringDes(&primitive
->value2
, buffer
, &offset
);