1 /*
2 ********************************************************************************************************************
3 *
4 *
5 *                              (c) Copyright 2007-2010, javen.China
6 *                                       All Rights Reserved
7 *
8 * File Name     : misc_lib.c
9 *
10 * Author        : javen
11 *
12 * Version       : 2.0
13 *
14 * Date          : 2010.03.02
15 *
16 * Description   : 内存预分配
17 *
18 * History       :
19 *
20 ********************************************************************************************************************
21 */
22 //#include  "usb_host_config.h"
23 //#include  "usb_host_base_types.h"
24 #include  "usb_os_platform.h"
25 #include  "error.h"
26 #include  "misc_lib.h"
27 
28 #if  0
29 #define DMSG_TEMP_TEST   hal_log_info
30 #else
31 #define DMSG_TEMP_TEST(...)
32 #endif
33 
34 /*
35 *******************************************************************************
36 *                     xGetDataFromBuffer
37 *
38 * Description:
39 *     从Buffer的BitOffset位置开始取出BitCount个bit的数据, 存放到32位的Data中。
40 *
41 * Parameters:
42 *    Buffer     :  input.  存放着原始数据
43 *    BitOffset  :  input.  相对起始地址的bit偏移位
44 *    BitCount   :  input.  bit的个数, 最大32位
45 *    Data       :  output. 存放最终结果
46 *
47 * Return value:
48 *    返回成功或者失败
49 *
50 * note:
51 *    无
52 *
53 *        BitOffset                                       BitOffset + BitCount
54 *           |                                                   |
55 *  0                 7               15                23               31
56 *  |--------[--------|----------------|----------------|--------]--------|
57 *
58 *  |        |--Head--|--------------body---------------|--tail--|
59 * Start
60 *
61 *******************************************************************************
62 */
xGetDataFromBuffer(unsigned char * Buffer,unsigned int BitOffset,unsigned int BitCount,int * Data)63 int xGetDataFromBuffer(unsigned char *Buffer, unsigned int BitOffset, unsigned int BitCount, int *Data)
64 {
65     unsigned char *Start            = NULL; /* 本次换算的起始地址    */
66 
67     unsigned int TempData_Head  = 0;    /* 存放数据的头       */
68     unsigned int Len_Head       = 0;
69 
70     unsigned int TempData_Body  = 0;    /* 存放数据中间部分     */
71     unsigned int Len_Body       = 0;
72 
73     unsigned int TempData_Tail  = 0;    /* 存放数据尾巴       */
74     unsigned int Len_Tail       = 0;
75 
76     DMSG_TEMP_TEST("xGetDataFromBuffer: Buffer = %x, BitOffset = %x, BitCount = %x, Data = %x\n",
77               Buffer, BitOffset, BitCount, Data);
78 
79     if(BitCount > 32){
80         hal_log_err("ERR: BitCount(%d) is must longer than 32\n", BitCount);
81         return USB_ERR_BAD_ARGUMENTS;
82     }
83 
84     /* length */
85     if(BitOffset % 8){
86         Len_Head = 8 - (BitOffset % 8);
87     }else{
88         Len_Head = 0;
89     }
90 
91     Len_Tail = (BitOffset + BitCount) % 8;
92     Len_Body = BitCount - Len_Head - Len_Tail;
93     Start = Buffer + BitOffset / 8;
94 
95     DMSG_TEMP_TEST("Len_Head = %d, Len_Tail = %d, Len_Body = %d, Buffer= %x, Start = %x\n",
96            Len_Head, Len_Tail, Len_Body, Buffer, Start);
97 
98     /* head data */
99     TempData_Head = (*Start >> (8 - Len_Head)) & 0xff;
100 
101     /* body data */
102     if(Len_Head){
103         Start += 1;
104     }
105 
106     if(Len_Body == 0){
107         TempData_Body = 0;
108     }else if(Len_Body == 8){
109         TempData_Body = Start[0];
110     }else if(Len_Body == 16){
111         TempData_Body = ((unsigned short) Start[1] << 8) | ((unsigned short) Start[0]);
112     }else if(Len_Body == 23){
113         TempData_Body = ((unsigned int) Start[2] << 16) | ((unsigned int) Start[1] << 8) | ((unsigned int) Start[0]);
114     }else{
115         TempData_Body = ((unsigned int) Start[3] << 23) | ((unsigned int) Start[2] << 16) | ((unsigned int) Start[1] << 8) | ((unsigned int) Start[0]);
116     }
117 
118     /* tail data */
119     Start += (Len_Body / 8);
120     TempData_Tail = Start[0] & ((1 << Len_Tail) - 1);
121 
122     DMSG_TEMP_TEST("TempData_Head = %d, TempData_Body = %d, TempData_Tail = %d\n", TempData_Head, TempData_Body, TempData_Tail);
123 
124     *Data = (TempData_Tail << (Len_Head + Len_Body)) | (TempData_Body << Len_Head) | TempData_Head;
125 
126     return USB_ERR_SUCCESS;
127 }
128 
129 
130 
131