Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 /*
0003  * u_os_desc.h
0004  *
0005  * Utility definitions for "OS Descriptors" support
0006  *
0007  * Copyright (c) 2014 Samsung Electronics Co., Ltd.
0008  *      http://www.samsung.com
0009  *
0010  * Author: Andrzej Pietrasiewicz <andrzejtp2010@gmail.com>
0011  */
0012 
0013 #ifndef __U_OS_DESC_H__
0014 #define __U_OS_DESC_H__
0015 
0016 #include <asm/unaligned.h>
0017 #include <linux/nls.h>
0018 
0019 #define USB_EXT_PROP_DW_SIZE            0
0020 #define USB_EXT_PROP_DW_PROPERTY_DATA_TYPE  4
0021 #define USB_EXT_PROP_W_PROPERTY_NAME_LENGTH 8
0022 #define USB_EXT_PROP_B_PROPERTY_NAME        10
0023 #define USB_EXT_PROP_DW_PROPERTY_DATA_LENGTH    10
0024 #define USB_EXT_PROP_B_PROPERTY_DATA        14
0025 
0026 #define USB_EXT_PROP_RESERVED           0
0027 #define USB_EXT_PROP_UNICODE            1
0028 #define USB_EXT_PROP_UNICODE_ENV        2
0029 #define USB_EXT_PROP_BINARY         3
0030 #define USB_EXT_PROP_LE32           4
0031 #define USB_EXT_PROP_BE32           5
0032 #define USB_EXT_PROP_UNICODE_LINK       6
0033 #define USB_EXT_PROP_UNICODE_MULTI      7
0034 
0035 static inline u8 *__usb_ext_prop_ptr(u8 *buf, size_t offset)
0036 {
0037     return buf + offset;
0038 }
0039 
0040 static inline u8 *usb_ext_prop_size_ptr(u8 *buf)
0041 {
0042     return __usb_ext_prop_ptr(buf, USB_EXT_PROP_DW_SIZE);
0043 }
0044 
0045 static inline u8 *usb_ext_prop_type_ptr(u8 *buf)
0046 {
0047     return __usb_ext_prop_ptr(buf, USB_EXT_PROP_DW_PROPERTY_DATA_TYPE);
0048 }
0049 
0050 static inline u8 *usb_ext_prop_name_len_ptr(u8 *buf)
0051 {
0052     return __usb_ext_prop_ptr(buf, USB_EXT_PROP_W_PROPERTY_NAME_LENGTH);
0053 }
0054 
0055 static inline u8 *usb_ext_prop_name_ptr(u8 *buf)
0056 {
0057     return __usb_ext_prop_ptr(buf, USB_EXT_PROP_B_PROPERTY_NAME);
0058 }
0059 
0060 static inline u8 *usb_ext_prop_data_len_ptr(u8 *buf, size_t off)
0061 {
0062     return __usb_ext_prop_ptr(buf,
0063                   USB_EXT_PROP_DW_PROPERTY_DATA_LENGTH + off);
0064 }
0065 
0066 static inline u8 *usb_ext_prop_data_ptr(u8 *buf, size_t off)
0067 {
0068     return __usb_ext_prop_ptr(buf, USB_EXT_PROP_B_PROPERTY_DATA + off);
0069 }
0070 
0071 static inline void usb_ext_prop_put_size(u8 *buf, int dw_size)
0072 {
0073     put_unaligned_le32(dw_size, usb_ext_prop_size_ptr(buf));
0074 }
0075 
0076 static inline void usb_ext_prop_put_type(u8 *buf, int type)
0077 {
0078     put_unaligned_le32(type, usb_ext_prop_type_ptr(buf));
0079 }
0080 
0081 static inline int usb_ext_prop_put_name(u8 *buf, const char *name, int pnl)
0082 {
0083     int result;
0084 
0085     put_unaligned_le16(pnl, usb_ext_prop_name_len_ptr(buf));
0086     result = utf8s_to_utf16s(name, strlen(name), UTF16_LITTLE_ENDIAN,
0087         (wchar_t *) usb_ext_prop_name_ptr(buf), pnl - 2);
0088     if (result < 0)
0089         return result;
0090 
0091     put_unaligned_le16(0, &buf[USB_EXT_PROP_B_PROPERTY_NAME + pnl - 2]);
0092 
0093     return pnl;
0094 }
0095 
0096 static inline void usb_ext_prop_put_binary(u8 *buf, int pnl, const u8 *data,
0097                        int data_len)
0098 {
0099     put_unaligned_le32(data_len, usb_ext_prop_data_len_ptr(buf, pnl));
0100     memcpy(usb_ext_prop_data_ptr(buf, pnl), data, data_len);
0101 }
0102 
0103 static inline int usb_ext_prop_put_unicode(u8 *buf, int pnl, const char *string,
0104                        int data_len)
0105 {
0106     int result;
0107     put_unaligned_le32(data_len, usb_ext_prop_data_len_ptr(buf, pnl));
0108     result = utf8s_to_utf16s(string, data_len >> 1, UTF16_LITTLE_ENDIAN,
0109             (wchar_t *) usb_ext_prop_data_ptr(buf, pnl),
0110             data_len - 2);
0111     if (result < 0)
0112         return result;
0113 
0114     put_unaligned_le16(0,
0115         &buf[USB_EXT_PROP_B_PROPERTY_DATA + pnl + data_len - 2]);
0116 
0117     return data_len;
0118 }
0119 
0120 #endif /* __U_OS_DESC_H__ */