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