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"
18 /********************************************************************************
20 * Name: CsrUtf16StrLen
22 * Description: The function returns the number of 16 bit elements present
23 * in the 0-terminated string.
25 * Input: 0-terminated string of 16 bit unicoded characters.
27 * Output: The number of 16 bit elements in the string.
29 *********************************************************************************/
30 static u32 CsrUtf16StrLen(const u16 *unicodeString)
35 if (unicodeString != NULL)
37 while (*unicodeString)
46 void CsrUint8Des(u8 *value, u8 *buffer, size_t *offset)
48 *value = buffer[*offset];
49 *offset += sizeof(*value);
51 EXPORT_SYMBOL_GPL(CsrUint8Des);
53 void CsrUint16Des(u16 *value, u8 *buffer, size_t *offset)
55 *value = (buffer[*offset + 0] << 0) |
56 (buffer[*offset + 1] << 8);
57 *offset += sizeof(*value);
59 EXPORT_SYMBOL_GPL(CsrUint16Des);
61 void CsrUint32Des(u32 *value, u8 *buffer, size_t *offset)
63 *value = (buffer[*offset + 0] << 0) |
64 (buffer[*offset + 1] << 8) |
65 (buffer[*offset + 2] << 16) |
66 (buffer[*offset + 3] << 24);
67 *offset += sizeof(*value);
69 EXPORT_SYMBOL_GPL(CsrUint32Des);
71 void CsrMemCpyDes(void *value, u8 *buffer, size_t *offset, size_t length)
73 memcpy(value, &buffer[*offset], length);
76 EXPORT_SYMBOL_GPL(CsrMemCpyDes);
78 void CsrCharStringDes(char **value, u8 *buffer, size_t *offset)
80 *value = kstrdup((char *) &buffer[*offset], GFP_KERNEL);
81 *offset += strlen(*value) + 1;
83 EXPORT_SYMBOL_GPL(CsrCharStringDes);
85 void CsrUtf8StringDes(u8 **value, u8 *buffer, size_t *offset)
87 *value = (u8 *)kstrdup((char *) &buffer[*offset], GFP_KERNEL);
88 *offset += strlen((char *) *value) + 1;
91 void CsrUtf16StringDes(u16 **value, u8 *buffer, size_t *offset)
95 CsrUint32Des(&length, buffer, offset);
97 *value = kmalloc(length * sizeof(**value), GFP_KERNEL);
98 for (i = 0; i < length; i++)
100 CsrUint16Des(&(*value)[i], buffer, offset);
104 void CsrSizeDes(size_t *value, u8 *buffer, size_t *offset)
106 *value = (buffer[*offset + 0] << 0) |
107 (buffer[*offset + 1] << 8) |
108 (buffer[*offset + 2] << 16) |
109 (buffer[*offset + 3] << 24);
110 *offset += sizeof(*value);
113 void CsrVoidPtrDes(void **value, u8 *buffer, size_t *offset)
115 CsrSizeDes((size_t *) value, buffer, offset);
118 void CsrUint8Ser(u8 *buffer, size_t *offset, u8 value)
120 buffer[*offset] = value;
121 *offset += sizeof(value);
123 EXPORT_SYMBOL_GPL(CsrUint8Ser);
125 void CsrUint16Ser(u8 *buffer, size_t *offset, u16 value)
127 buffer[*offset + 0] = (u8) ((value >> 0) & 0xFF);
128 buffer[*offset + 1] = (u8) ((value >> 8) & 0xFF);
129 *offset += sizeof(value);
131 EXPORT_SYMBOL_GPL(CsrUint16Ser);
133 void CsrUint32Ser(u8 *buffer, size_t *offset, u32 value)
135 buffer[*offset + 0] = (u8) ((value >> 0) & 0xFF);
136 buffer[*offset + 1] = (u8) ((value >> 8) & 0xFF);
137 buffer[*offset + 2] = (u8) ((value >> 16) & 0xFF);
138 buffer[*offset + 3] = (u8) ((value >> 24) & 0xFF);
139 *offset += sizeof(value);
141 EXPORT_SYMBOL_GPL(CsrUint32Ser);
143 void CsrMemCpySer(u8 *buffer, size_t *offset, const void *value, size_t length)
145 memcpy(&buffer[*offset], value, length);
148 EXPORT_SYMBOL_GPL(CsrMemCpySer);
150 void CsrCharStringSer(u8 *buffer, size_t *offset, const char *value)
154 strcpy(((char *) &buffer[*offset]), value);
155 *offset += strlen(value) + 1;
159 CsrUint8Ser(buffer, offset, 0);
162 EXPORT_SYMBOL_GPL(CsrCharStringSer);
164 void CsrUtf8StringSer(u8 *buffer, size_t *offset, const u8 *value)
166 CsrCharStringSer(buffer, offset, (char *) value);
169 void CsrUtf16StringSer(u8 *buffer, size_t *offset, const u16 *value)
173 u32 length = CsrUtf16StrLen(value) + 1;
176 CsrUint32Ser(buffer, offset, length);
178 for (i = 0; i < length; i++)
180 CsrUint16Ser(buffer, offset, (u16) value[i]);
185 CsrUint32Ser(buffer, offset, 0);
189 void CsrSizeSer(u8 *buffer, size_t *offset, size_t value)
191 buffer[*offset + 0] = (u8) ((value >> 0) & 0xFF);
192 buffer[*offset + 1] = (u8) ((value >> 8) & 0xFF);
193 buffer[*offset + 2] = (u8) ((value >> 16) & 0xFF);
194 buffer[*offset + 3] = (u8) ((value >> 24) & 0xFF);
195 *offset += sizeof(value);
198 void CsrVoidPtrSer(u8 *buffer, size_t *offset, void *ptr)
200 CsrSizeSer(buffer, offset, (size_t) ptr);
203 u32 CsrCharStringSerLen(const char *str)
207 return (u32)(strlen(str) + sizeof(*str));
215 u32 CsrUtf8StringSerLen(const u8 *str)
219 return (u32)(strlen((char *) str) + sizeof(*str));
227 u32 CsrUtf16StringSerLen(const u16 *str)
231 /* We always write down the length of the string */
232 return sizeof(u32) + (CsrUtf16StrLen(str) + 1) * sizeof(*str);
240 size_t CsrEventSizeof(void *msg)
245 u8 *CsrEventSer(u8 *ptr, size_t *len, void *msg)
247 CsrEvent *primitive = (CsrEvent *) msg;
249 CsrUint16Ser(ptr, len, primitive->type);
253 void *CsrEventDes(u8 *buffer, size_t length)
255 CsrEvent *primitive = kmalloc(sizeof(CsrEvent), GFP_KERNEL);
257 CsrUint16Des(&primitive->type, buffer, &offset);
262 size_t CsrEventCsrUint8Sizeof(void *msg)
267 u8 *CsrEventCsrUint8Ser(u8 *ptr, size_t *len, void *msg)
269 CsrEventCsrUint8 *primitive = (CsrEventCsrUint8 *) msg;
271 CsrUint16Ser(ptr, len, primitive->type);
272 CsrUint8Ser(ptr, len, primitive->value);
276 void *CsrEventCsrUint8Des(u8 *buffer, size_t length)
278 CsrEventCsrUint8 *primitive = kmalloc(sizeof(CsrEventCsrUint8), GFP_KERNEL);
281 CsrUint16Des(&primitive->type, buffer, &offset);
282 CsrUint8Des(&primitive->value, buffer, &offset);
287 size_t CsrEventCsrUint16Sizeof(void *msg)
292 u8 *CsrEventCsrUint16Ser(u8 *ptr, size_t *len, void *msg)
294 CsrEventCsrUint16 *primitive = (CsrEventCsrUint16 *) msg;
296 CsrUint16Ser(ptr, len, primitive->type);
297 CsrUint16Ser(ptr, len, primitive->value);
301 void *CsrEventCsrUint16Des(u8 *buffer, size_t length)
303 CsrEventCsrUint16 *primitive = kmalloc(sizeof(CsrEventCsrUint16), GFP_KERNEL);
306 CsrUint16Des(&primitive->type, buffer, &offset);
307 CsrUint16Des(&primitive->value, buffer, &offset);
312 size_t CsrEventCsrUint32Sizeof(void *msg)
317 u8 *CsrEventCsrUint32Ser(u8 *ptr, size_t *len, void *msg)
319 CsrEventCsrUint32 *primitive = (CsrEventCsrUint32 *) msg;
321 CsrUint16Ser(ptr, len, primitive->type);
322 CsrUint32Ser(ptr, len, primitive->value);
326 void *CsrEventCsrUint32Des(u8 *buffer, size_t length)
328 CsrEventCsrUint32 *primitive = kmalloc(sizeof(CsrEventCsrUint32), GFP_KERNEL);
331 CsrUint16Des(&primitive->type, buffer, &offset);
332 CsrUint32Des(&primitive->value, buffer, &offset);
337 size_t CsrEventCsrUint16CsrUint8Sizeof(void *msg)
342 u8 *CsrEventCsrUint16CsrUint8Ser(u8 *ptr, size_t *len, void *msg)
344 CsrEventCsrUint16CsrUint8 *primitive = (CsrEventCsrUint16CsrUint8 *) msg;
346 CsrUint16Ser(ptr, len, primitive->type);
347 CsrUint16Ser(ptr, len, primitive->value1);
348 CsrUint8Ser(ptr, len, primitive->value2);
352 void *CsrEventCsrUint16CsrUint8Des(u8 *buffer, size_t length)
354 CsrEventCsrUint16CsrUint8 *primitive = kmalloc(sizeof(CsrEventCsrUint16CsrUint8), GFP_KERNEL);
357 CsrUint16Des(&primitive->type, buffer, &offset);
358 CsrUint16Des(&primitive->value1, buffer, &offset);
359 CsrUint8Des(&primitive->value2, buffer, &offset);
364 size_t CsrEventCsrUint16CsrUint16Sizeof(void *msg)
369 u8 *CsrEventCsrUint16CsrUint16Ser(u8 *ptr, size_t *len, void *msg)
371 CsrEventCsrUint16CsrUint16 *primitive = (CsrEventCsrUint16CsrUint16 *) msg;
373 CsrUint16Ser(ptr, len, primitive->type);
374 CsrUint16Ser(ptr, len, primitive->value1);
375 CsrUint16Ser(ptr, len, primitive->value2);
379 void *CsrEventCsrUint16CsrUint16Des(u8 *buffer, size_t length)
381 CsrEventCsrUint16CsrUint16 *primitive = kmalloc(sizeof(CsrEventCsrUint16CsrUint16), GFP_KERNEL);
384 CsrUint16Des(&primitive->type, buffer, &offset);
385 CsrUint16Des(&primitive->value1, buffer, &offset);
386 CsrUint16Des(&primitive->value2, buffer, &offset);
391 size_t CsrEventCsrUint16CsrUint32Sizeof(void *msg)
396 u8 *CsrEventCsrUint16CsrUint32Ser(u8 *ptr, size_t *len, void *msg)
398 CsrEventCsrUint16CsrUint32 *primitive = (CsrEventCsrUint16CsrUint32 *) msg;
400 CsrUint16Ser(ptr, len, primitive->type);
401 CsrUint16Ser(ptr, len, primitive->value1);
402 CsrUint32Ser(ptr, len, primitive->value2);
406 void *CsrEventCsrUint16CsrUint32Des(u8 *buffer, size_t length)
408 CsrEventCsrUint16CsrUint32 *primitive = kmalloc(sizeof(CsrEventCsrUint16CsrUint32), GFP_KERNEL);
411 CsrUint16Des(&primitive->type, buffer, &offset);
412 CsrUint16Des(&primitive->value1, buffer, &offset);
413 CsrUint32Des(&primitive->value2, buffer, &offset);
418 size_t CsrEventCsrUint16CsrCharStringSizeof(void *msg)
420 CsrEventCsrUint16CsrCharString *primitive = (CsrEventCsrUint16CsrCharString *) msg;
421 return 4 + strlen(primitive->value2) + 1;
424 u8 *CsrEventCsrUint16CsrCharStringSer(u8 *ptr, size_t *len, void *msg)
426 CsrEventCsrUint16CsrCharString *primitive = (CsrEventCsrUint16CsrCharString *) msg;
428 CsrUint16Ser(ptr, len, primitive->type);
429 CsrUint16Ser(ptr, len, primitive->value1);
430 CsrCharStringSer(ptr, len, primitive->value2);
434 void *CsrEventCsrUint16CsrCharStringDes(u8 *buffer, size_t length)
436 CsrEventCsrUint16CsrCharString *primitive = kmalloc(sizeof(CsrEventCsrUint16CsrCharString), GFP_KERNEL);
439 CsrUint16Des(&primitive->type, buffer, &offset);
440 CsrUint16Des(&primitive->value1, buffer, &offset);
441 CsrCharStringDes(&primitive->value2, buffer, &offset);
446 size_t CsrEventCsrUint32CsrUint16Sizeof(void *msg)
451 u8 *CsrEventCsrUint32CsrUint16Ser(u8 *ptr, size_t *len, void *msg)
453 CsrEventCsrUint32CsrUint16 *primitive = (CsrEventCsrUint32CsrUint16 *) msg;
455 CsrUint16Ser(ptr, len, primitive->type);
456 CsrUint32Ser(ptr, len, primitive->value1);
457 CsrUint16Ser(ptr, len, primitive->value2);
461 void *CsrEventCsrUint32CsrUint16Des(u8 *buffer, size_t length)
463 CsrEventCsrUint32CsrUint16 *primitive = kmalloc(sizeof(CsrEventCsrUint32CsrUint16), GFP_KERNEL);
466 CsrUint16Des(&primitive->type, buffer, &offset);
467 CsrUint32Des(&primitive->value1, buffer, &offset);
468 CsrUint16Des(&primitive->value2, buffer, &offset);
473 size_t CsrEventCsrUint32CsrCharStringSizeof(void *msg)
475 CsrEventCsrUint32CsrCharString *primitive = (CsrEventCsrUint32CsrCharString *) msg;
476 return 6 + strlen(primitive->value2) + 1;
479 u8 *CsrEventCsrUint32CsrCharStringSer(u8 *ptr, size_t *len, void *msg)
481 CsrEventCsrUint32CsrCharString *primitive = (CsrEventCsrUint32CsrCharString *) msg;
483 CsrUint16Ser(ptr, len, primitive->type);
484 CsrUint32Ser(ptr, len, primitive->value1);
485 CsrCharStringSer(ptr, len, primitive->value2);
489 void *CsrEventCsrUint32CsrCharStringDes(u8 *buffer, size_t length)
491 CsrEventCsrUint32CsrCharString *primitive = kmalloc(sizeof(CsrEventCsrUint32CsrCharString), GFP_KERNEL);
494 CsrUint16Des(&primitive->type, buffer, &offset);
495 CsrUint32Des(&primitive->value1, buffer, &offset);
496 CsrCharStringDes(&primitive->value2, buffer, &offset);